Я пытаюсь использовать gridsearch sklearn с моделью, созданной xgboost. Для этого я создаю собственный счетчик, основанный на оценке ndcg. Я успешно могу использовать Snippet 1, но он слишком грязный/хакерский, я бы предпочел использовать старый добрый sklearn для упрощения кода. Я попытался реализовать GridSearch, и результаты полностью отключены: для тех же наборов X и y я получаю NDCG @ k = 0.8 со Snippet 1 против 0.5 со Snippet 2. Очевидно, что что-то я здесь не делаю ...GridSearch/make_scorer странные результаты с помощью модели xgboost
следующие куски кода возврата очень разные результаты:
Snippet1:
kf = StratifiedKFold(y, n_folds=5, shuffle=True, random_state=42)
max_depth = [6]
learning_rate = [0.22]
n_estimators = [43]
reg_alpha = [0.1]
reg_lambda = [10]
for md in max_depth:
for lr in learning_rate:
for ne in n_estimators:
for ra in reg_alpha:
for rl in reg_lambda:
xgb = XGBClassifier(objective='multi:softprob',
max_depth=md,
learning_rate=lr,
n_estimators=ne,
reg_alpha=ra,
reg_lambda=rl,
subsample=0.6, colsample_bytree=0.6, seed=0)
print([md, lr, ne])
score = []
for train_index, test_index in kf:
X_train, X_test = X[train_index], X[test_index]
y_train, y_test = y[train_index], y[test_index]
xgb.fit(X_train, y_train)
y_pred = xgb.predict_proba(X_test)
score.append(ndcg_scorer(y_test, y_pred))
print('all scores: %s' % score)
print('average score: %s' % np.mean(score))
Snippet2:
from sklearn.grid_search import GridSearchCV
params = {
'max_depth':[6],
'learning_rate':[0.22],
'n_estimators':[43],
'reg_alpha':[0.1],
'reg_lambda':[10],
'subsample':[0.6],
'colsample_bytree':[0.6]
}
xgb = XGBClassifier(objective='multi:softprob',seed=0)
scorer = make_scorer(ndcg_scorer, needs_proba=True)
gs = GridSearchCV(xgb, params, cv=5, scoring=scorer, verbose=10, refit=False)
gs.fit(X,y)
gs.best_score_
Хотя snippet1 дает мне результат как и ожидалось, оценка, полученная Snippet2, не согласуется с ndcg_scorer.
Первое несоответствие, которое я вижу - вы используете KFold с n_folds = 2 неявно во втором фрагменте, вместо StratifiedKFold с n_folds = 5, как в первом. Создайте тот же StratifiedKFold второй раз и передайте его в GridSearchCV как параметр cv. –