【发布时间】:2021-11-24 12:10:32
【问题描述】:
我目前正在使用 xgboost 开发回归模型。由于 xgboost 有多个超参数,所以我用GridSearchCV() 添加了交叉验证逻辑。作为试用,我设置了max_depth: [2,3]。我的python代码如下。
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import make_scorer
from sklearn.metrics import mean_squared_error
xgb_reg = xgb.XGBRegressor()
# Obtain the best hyper parameter
scorer=make_scorer(mean_squared_error, False)
params = {'max_depth': [2,3],
'eta': [0.1],
'colsample_bytree': [1.0],
'colsample_bylevel': [0.3],
'subsample': [0.9],
'gamma': [0],
'lambda': [1],
'alpha':[0],
'min_child_weight':[1]
}
grid_xgb_reg=GridSearchCV(xgb_reg,
param_grid=params,
scoring=scorer,
cv=5,
n_jobs=-1)
grid_xgb_reg.fit(X_train, y_train)
y_pred = grid_xgb_reg.predict(X_test)
y_train_pred = grid_xgb_reg.predict(X_train)
## Evaluate model
from sklearn.metrics import mean_squared_error
from sklearn.metrics import r2_score
print('RMSE train: %.3f, test: %.3f' %(np.sqrt(mean_squared_error(y_train, y_train_pred)),np.sqrt(mean_squared_error(y_test, y_pred))))
print('R^2 train: %.3f, test: %.3f' %(r2_score(y_train, y_train_pred),r2_score(y_test, y_pred)))
问题是GridSearchCV 似乎没有选择最好的超参数。就我而言,当我将max_depth 设置为[2,3] 时,结果如下。在以下情况下,GridSearchCV 选择 max_depth:2 作为最佳超参数。
# The result when max_depth is 2
RMSE train: 11.861, test: 15.113
R^2 train: 0.817, test: 0.601
但是,如果我将max_depth 更新为[3](通过去掉2),测试分数比之前的值要好,如下所示。
# The result when max_depth is 3
RMSE train: 9.951, test: 14.752
R^2 train: 0.871, test: 0.620
问题
我的理解是,即使我将max_depth 设置为[2,3],GridSearchCV 方法也应该选择max_depth:3 作为最佳超参数,因为max_depth:3 可以返回更好的 RSME 或 R^ 分数2 比max_depth:2。谁能告诉我为什么当我将max_depth 设置为[2,3] 时我的代码无法选择最佳超参数?
【问题讨论】:
-
网格搜索根据其内部交叉验证分数选择最佳超参数(查看其属性
cv_results_);不能保证获胜者在新的测试集上表现最好。
标签: python machine-learning scikit-learn xgboost