Я создаю двоичную классификационную модель с использованием XGBoostClassifier, но у меня возникают некоторые проблемы с получением правильного значения best_iteration
и ntree_limit
.
Приведенный ниже код является моей собственной метрикой оценки c :
def xgb_f1(y, t):
t = t.get_label()
y_bin = [1. if y_cont > 0.5 else 0. for y_cont in y]
return 'f1', f1_score(t, y_bin, average='macro')
Вот как я создаю и подгоняю Классификатор:
classifier = xgb.XGBClassifier(n_estimators=10000)
classifier.fit(X_train, y_train,
eval_metric=xgb_f1,
eval_set=[(X_test, y_test)],
verbose=True)
Вот некоторые результаты, которые XGBoost показывает мне во время подгонки:
[1007] validation_0-error:0.181395 validation_0-f1:0.731411
[1355] validation_0-error:0.183721 validation_0-f1:0.735139
[1396] validation_0-error:0.183721 validation_0-f1:0.736116
[1426] validation_0-error:0.182558 validation_0-f1:0.737302
[3568] validation_0-error:0.186047 validation_0-f1:0.737557
[3791] validation_0-error:0.184884 validation_0-f1:0.7378
[9999] validation_0-error:0.210465 validation_0-f1:0.708715
И как Вы можете видеть, что лучшая итерация - это номер 3791 из-за наибольшего значения f1, но когда я вызываю classifier.get_booster().best_iteration
, это показывает, что номер 9999 (последняя итерация) является лучшим, но это не так. И когда я звоню classifier.get_booster().best_ntree_limit
, он говорит мне, что лучший лимит - 10000, но я так не думаю, потому что он дает мне более низкий показатель f1, чем более низкие итерации.