GridSearchCV: для оценки не используется выбранный метод оценки XGBRegressor - PullRequest
2 голосов
/ 28 февраля 2020

Scikit-learn GridSearchCV используется для настройки гиперпараметров моделей XGBRegressor. Независимо от указанного eval_metri c в XGBRegressor (). Fit () GridSearchCV выдает одинаковые значения баллов. На https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html для параметра scoring написано: «Если нет, используется метод оценки оценщика». Такого не бывает. Всегда получайте одно и то же значение. Как получить результаты, соответствующие XGBRegressor eval_metri c?

Этот пример кода:

import numpy as np
from sklearn.model_selection import GridSearchCV, KFold
from sklearn.datasets import load_boston
import xgboost as xgb

rng = np.random.RandomState(31337)

boston = load_boston()
y = boston['target']
X = boston['data']

kf = KFold(n_splits=2, random_state=42)
folds = list(kf.split(X))

xgb_model = xgb.XGBRegressor(objective='reg:squarederror', verbose=False)
reg = GridSearchCV(estimator=xgb_model, 
                   param_grid= {'max_depth': [2], 'n_estimators': [50]}, 
                   cv=folds,
                   verbose=False)

reg.fit(X, y, **{'eval_metric': 'mae', 'verbose': False})
print('GridSearchCV mean(mae)?:  ', reg.cv_results_['mean_test_score'])
# -----------------------------------------------
reg.fit(X, y, **{'eval_metric': 'rmse', 'verbose': False})
print('GridSearchCV mean(rmse)?: ', reg.cv_results_['mean_test_score'])
print("----------------------------------------------------")

xgb_model.set_params(**{'max_depth': 2, 'n_estimators': 50})
xgb_model.fit(X[folds[0][0],:],y[folds[0][0]], eval_metric='mae', 
              eval_set = [(X[folds[0][0],:],y[folds[0][0]])], verbose=False)
print('XGBRegressor 0-mae:', xgb_model.evals_result()['validation_0']['mae'][-1])
xgb_model.fit(X[folds[0][1],:],y[folds[0][1]], eval_metric='mae', 
              eval_set = [(X[folds[0][1],:],y[folds[0][1]])], verbose=False)
print('XGBRegressor 1-mae:', xgb_model.evals_result()['validation_0']['mae'][-1])

xgb_model.fit(X[folds[0][0],:],y[folds[0][0]], eval_metric='rmse', 
              eval_set = [(X[folds[0][0],:],y[folds[0][0]])], verbose=False)
print('XGBRegressor 0-rmse:', xgb_model.evals_result()['validation_0']['rmse'][-1])
xgb_model.fit(X[folds[0][1],:],y[folds[0][1]], eval_metric='rmse', 
              eval_set = [(X[folds[0][1],:],y[folds[0][1]])], verbose=False)
print('XGBRegressor 1-rmse:', xgb_model.evals_result()['validation_0']['rmse'][-1])

возвращает (числа над линия должна была быть средней из тех, что ниже линии)

GridSearchCV mean(mae)?:   [0.70941007]
GridSearchCV mean(rmse)?:  [0.70941007]
----------------------------------------------------
XGBRegressor 0-mae: 1.273626
XGBRegressor 1-mae: 1.004947
XGBRegressor 0-rmse: 1.647694
XGBRegressor 1-rmse: 1.290872

1 Ответ

1 голос
/ 28 февраля 2020

TL; DR: то, что вы вернули, называется R2 или коэффициент детерминации. Это показатель по умолчанию c для функции XGBRegressor score, который выбирается GridSearchCV, если scoring=None

Сравните результаты с явным кодированием scoring:

from sklearn.metrics import make_scorer, r2_score, mean_squared_error
xgb_model = xgb.XGBRegressor(objective='reg:squarederror', verbose=False)

reg = GridSearchCV(estimator=xgb_model, scoring=make_scorer(r2_score),
                   param_grid= {'max_depth': [2], 'n_estimators': [50]}, 
                   cv=folds,
                   verbose=False)

reg.fit(X, y)
reg.best_score_
0.7333542105472226

с теми, у кого scoring=None:

reg = GridSearchCV(estimator=xgb_model, scoring=None,
                   param_grid= {'max_depth': [2], 'n_estimators': [50]}, 
                   cv=folds,
                   verbose=False)

reg.fit(X, y)
reg.best_score_
0.7333542105472226

Если вы прочитали GridSearchCV строки документов :

оценка: объект оценки. Предполагается, что это реализует интерфейс оценщика scikit-learn. Либо оценщик должен предоставить функцию score, либо должна быть передана scoring.

На данный момент вы хотите проверить документы на xgb_model.score?:

Подпись: xgb_model.score (X, y, sample_weight = Нет)
Строка документа:
Возвращает коэффициент определения R ^ 2 прогноза.

Итак, с помощью эти документы, если вам не нравится функция XGBRegressor по умолчанию R2, укажите вашу функцию оценки явно GridSearchCV

Например, если вы хотите RMSE, вы можете сделать:

reg = GridSearchCV(estimator=xgb_model,  
                   scoring=make_scorer(mean_squared_error, squared=False),
                   param_grid= {'max_depth': [2], 'n_estimators': [50]}, 
                   cv=folds,
                   verbose=False)

reg.fit(X, y)
reg.best_score_
4.618242594168436
...