2015-12-10 2 views
1

Я пытаюсь использовать 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.

+1

Первое несоответствие, которое я вижу - вы используете KFold с n_folds = 2 неявно во втором фрагменте, вместо StratifiedKFold с n_folds = 5, как в первом. Создайте тот же StratifiedKFold второй раз и передайте его в GridSearchCV как параметр cv. –

ответ

0

Проблема с cv в GridSearchCV(xgb, params, cv=5, scoring=scorer, verbose=10, refit=False). Он может получить KFold/StratifiedKFold вместо int. В отличие от того, что говорится в doc, кажется, что по умолчанию объект типа 'int' не вызывает StratifiedKFold, а другая функция может быть KFold.

Смежные вопросы