Скоринг в GridSearchCV для XGBoost - PullRequest
0 голосов
/ 11 мая 2018

Я сейчас пытаюсь проанализировать данные впервые с помощью XGBoost.Я хочу найти лучшие параметры, используя GridsearchCV.Я хочу минимизировать среднеквадратичную ошибку и для этого я использовал «rmse» как eval_metric.Однако оценка в поиске по сетке не имеет такой метрики.На этом сайте я обнаружил, что «neg_mean_squared_error» делает то же самое, но обнаружил, что это дает мне результаты, отличные от RMSE.Когда я вычисляю корень абсолютного значения «neg_mean_squared_error», я получаю значение около 8,9, в то время как другая функция дает мне RMSE около 4,4.Я не знаю, что идет не так или как я получаю эти две функции, чтобы согласовать / дать одинаковые значения?

Из-за этой проблемы я получаю неправильные значения как "best_params_", которые дают мне более высокое среднеквадратичное значение, чем у некоторыхзначения, с которых я изначально начал настройку.

Может кто-нибудь объяснить, как получить оценку по среднеквадратическому среднему значению в поиске по сетке или почему мой код дает разные значения?

Заранее спасибо.

def modelfit(alg, trainx, trainy, useTrainCV=True, cv_folds=10, early_stopping_rounds=50):
    if useTrainCV:
        xgb_param = alg.get_xgb_params()
        xgtrain = xgb.DMatrix(trainx, label=trainy)
        cvresult = xgb.cv(xgb_param, xgtrain, num_boost_round=alg.get_params()['n_estimators'], nfold=cv_folds,
                          metrics='rmse', early_stopping_rounds=early_stopping_rounds)
        alg.set_params(n_estimators=cvresult.shape[0])

    # Fit the algorithm on the data
    alg.fit(trainx, trainy, eval_metric='rmse')

    # Predict training set:
    dtrain_predictions = alg.predict(trainx)
    # dtrain_predprob = alg.predict_proba(trainy)[:, 1]
    print(dtrain_predictions)
    print(np.sqrt(mean_squared_error(trainy, dtrain_predictions)))

    # Print model report:
    print("\nModel Report")
    print("RMSE : %.4g" % np.sqrt(metrics.mean_squared_error(trainy, dtrain_predictions)))

 param_test2 = {
 'max_depth':[6,7,8],
 'min_child_weight':[2,3,4]
}

grid2 = GridSearchCV(estimator = xgb.XGBRegressor( learning_rate =0.1, n_estimators=2000, max_depth=5,
 min_child_weight=2, gamma=0, subsample=0.8, colsample_bytree=0.8,
 objective= 'reg:linear', nthread=4, scale_pos_weight=1, random_state=4),
 param_grid = param_test2, scoring='neg_mean_squared_error', n_jobs=4,iid=False, cv=10, verbose=20)
grid2.fit(X_train,y_train)
# Mean cross-validated score of the best_estimator
print(grid2.best_params_, np.sqrt(np.abs(grid2.best_score_))), print(np.sqrt(np.abs(grid2.score(X_train, y_train))))
modelfit(grid2.best_estimator_, X_train, y_train)
print(np.sqrt(np.abs(grid2.score(X_train, y_train))))

1 Ответ

0 голосов
/ 11 мая 2018

В GridSearchCV параметр оценки преобразуется так, что более высокие значения всегда лучше, чем более низкие значения. В вашем примере neg_mean_squared_error это просто отрицательная версия RMSE. Вы не должны интерпретировать neg_mean_squared_error как RMSE, скорее, при перекрестной проверке вы должны сравнивать значения neg_mean_squared_error, где более высокое значение лучше, чем более низкое.

В части параметров скоринга документации model_evaluation упоминается это поведение.

Документация по параметрам Scikit-Learn Scoring

...