sklearn GridSearchCV回归器性能评估:数据拆分与指标疑问
GridSearchCV调优GradientBoostingRegressor常见问题解答
问题1:设置cv=5后,是否仍需使用train_test_split拆分数据,将X_train、y_train传入grid_search.fit?
必须拆分数据,原因如下:
- GridSearchCV的
cv参数是用来在训练集内部做交叉验证,筛选最优超参数的。如果直接把全量数据传入fit(),会导致交叉验证的验证集数据参与了调参过程,相当于模型提前“见过”测试数据,最终评估的泛化性能会严重高估,完全失去参考价值。 - 正确流程:
- 先用
train_test_split把数据集拆分为训练集(X_train/y_train)和独立测试集(X_test/y_test); - 将X_train/y_train传入
grid_search.fit(),让GridSearchCV在训练集内部做5折交叉验证选最优参数; - 最终用X_test/y_test评估最优模型的真实泛化能力。
- 先用
问题2:GridSearchCV中回归器的默认评估指标是什么?为何执行grid_search.score(X,y)与grid_search.best_score_得到的结果差异较大,如何正确获取模型的交叉验证性能?
默认评估指标
对于回归任务,GridSearchCV如果不指定scoring参数,会直接使用你传入的回归器的score方法。GradientBoostingRegressor的默认score方法是R²(决定系数),取值范围是(-∞,1],越接近1表示模型拟合效果越好。
结果差异大的原因
grid_search.best_score_:是交叉验证过程中,最优参数组合在各折验证集上的得分的平均值,是对模型泛化能力的无偏估计;grid_search.score(X,y):是用整个传入的数据集(如果是全量数据,就包含了交叉验证用过的验证集)去评估已经用全量X_train训练好的最佳模型,相当于用模型见过的数据做评估,结果会偏高,和交叉验证的无偏估计自然差异大。
正确获取交叉验证性能的方式
- 直接用
grid_search.best_score_:这是交叉验证给出的最优模型的平均验证得分,能反映模型的泛化能力; - 查看
grid_search.cv_results_:这个字典里包含了每一组超参数在各折的得分、均值、标准差等,能帮你更全面地分析调参过程; - 最终验证泛化能力:一定要用拆分好的独立测试集,调用
grid_search.best_estimator_.score(X_test, y_test),这才是模型在未见过数据上的真实性能。
内容的提问来源于stack exchange,提问作者Jason Shi
相关产品推荐
相关产品推荐

