如何获取Scikit-learn GridSearchCV最优模型的训练与测试分数
GridSearchCV最优模型训练/测试分数获取方法
前置注意事项
- 初始化
GridSearchCV时必须显式设置return_train_score=True,默认该参数为False,不会返回交叉验证过程中的训练集相关分数。
方案1:从cv_results_属性提取
该方案获取的是交叉验证过程中最优参数对应的平均训练/验证分数,更能反映参数搜索阶段的泛化表现:
# 初始化示例 from sklearn.model_selection import GridSearchCV from sklearn.svm import SVC grid = GridSearchCV( estimator=SVC(), param_grid={'C': [1, 10]}, cv=5, return_train_score=True # 必须开启,否则无训练分数 ) grid.fit(X_train, y_train) # 提取最优参数对应的索引 best_idx = grid.cv_results_['rank_test_score'].argmin() # 交叉验证平均训练分数 best_cv_train_score = grid.cv_results_['mean_train_score'][best_idx] # 交叉验证平均验证分数 best_cv_val_score = grid.cv_results_['mean_test_score'][best_idx] print(f"交叉验证训练平均分:{best_cv_train_score:.4f}") print(f"交叉验证验证平均分:{best_cv_val_score:.4f}")
方案2:通过best_estimator_属性计算
best_estimator_是最优参数在全量训练集上拟合完成的模型,可直接计算任意数据集的分数,适合最终效果评估:
# 最优模型在全量训练集上的分数 full_train_score = grid.best_estimator_.score(X_train, y_train) # 最优模型在独立预留测试集上的分数 holdout_test_score = grid.best_estimator_.score(X_test, y_test) print(f"全量训练集分数:{full_train_score:.4f}") print(f"独立测试集分数:{holdout_test_score:.4f}")
两种方案的区别
- 方案1的分数是交叉验证多折结果的平均值,没有泄露全量训练集信息,更适合参数效果的公平对比
- 方案2的分数是最终模型的实际表现,其中独立测试集分数可作为模型最终上线效果的参考
内容的提问来源于stack exchange,提问作者Jesse M
相关产品推荐
相关产品推荐

