如何正确使用 GridSearchCV 和 cross_val_score?

Posted

技术标签:

【中文标题】如何正确使用 GridSearchCV 和 cross_val_score?【英文标题】:How do I properly use GridSearchCV in conjunction with cross_val_score? 【发布时间】:2018-12-04 19:58:31 【问题描述】:

目前我有以下代码:

我首先将数据集拆分为训练集和测试集。然后我运行 GridSearchCV 来尝试找到最佳参数。找到最佳参数后,我通过 cross_val_score 使用参数评估分类器。这是一种可以接受的方式吗?

【问题讨论】:

【参考方案1】:

您可以使用make_scorer 像这样在GridSearchCV 对象内指定scoring 参数

from sklearn.metrics import precision_score, make_scorer
prec_metric = make_scorer(precision_score)
grid_search = GridSearchCV(estimator = logreg, scoring= prec_metric param_grid = param_grid, cv = 3, n_jobs=-1, verbose=3)

拟合数据后,您可以使用results_ 属性访问这样的分数

results = grid_search.results_


'param_kernel': masked_array(data = ['poly', 'poly', 'rbf', 'rbf'],
                         mask = [False False False False]...)
'param_gamma': masked_array(data = [-- -- 0.1 0.2],
                        mask = [ True  True False False]...),
'param_degree': masked_array(data = [2.0 3.0 -- --],
                         mask = [False False  True  True]...),
 'split0_test_score'  : [0.8, 0.7, 0.8, 0.9],
 'split1_test_score'  : [0.82, 0.5, 0.7, 0.78],
 'mean_test_score'    : [0.81, 0.60, 0.75, 0.82],
 'std_test_score'     : [0.02, 0.01, 0.03, 0.03],
 'rank_test_score'    : [2, 4, 3, 1],
 'split0_train_score' : [0.8, 0.9, 0.7],
 'split1_train_score' : [0.82, 0.5, 0.7],
 'mean_train_score'   : [0.81, 0.7, 0.7],
 'std_train_score'    : [0.03, 0.03, 0.04],
 'mean_fit_time'      : [0.73, 0.63, 0.43, 0.49],
 'std_fit_time'       : [0.01, 0.02, 0.01, 0.01],
 'mean_score_time'    : [0.007, 0.06, 0.04, 0.04],
 'std_score_time'     : [0.001, 0.002, 0.003, 0.005],
 'params'             : ['kernel': 'poly', 'degree': 2, ...],
 

您还可以使用in this example 中提到的多个指标进行评估。

您可以制作自己的自定义指标或使用one of the metrics specified here。

更新:基于on this answer,您应该在将整个数据拟合到cross_val_score之前从grid_search提供分类器,以防止任何数据泄漏。

【讨论】:

那么当我使用GridSearchCV时,是不是要传递整个数据集而忽略train_test_split?然后 mean_test_score 会为用于测试的折叠提供测试结果吗? 是的,它将为用于测试的折叠提供测试结果,是的,您通过了整个数据集,因为交叉验证由 GridSearch 本身负责。 抱歉,一直有问题,它预测的分数是网格搜索找到的最佳参数吗? 是的,它是最好的参数 我正在看这篇文章,它建议在将数据提供给 GridSearchCV 之前进行拆分,因为数据可能会从训练集中泄漏并扭曲结果。 ***.com/a/49165571/5171293.【参考方案2】:

你实际上不需要cross_val_score

查看我认为它会为您解决问题的链接:

http://scikit-learn.org/stable/auto_examples/model_selection/plot_grid_search_digits.html

【讨论】:

我对那个例子中发生的事情有点困惑。 'mean_test_score' 如果尚未适合测试集,它是什么? 它没有连接到测试集。任何时候都不能安装测试仪! (除非你想过度拟合)。测试分数是交叉验证测试的平均分数(仅在训练集上进行)。 如果我在我的完整数据集上使用 GridSearchCV,返回的结果会是过度拟合的结果还是保留用于测试的折叠结果? 始终建议使用单独的保留集,但如果您的数据非常小,您可能会担心平均 CV 误差

以上是关于如何正确使用 GridSearchCV 和 cross_val_score?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Pipeline 和 GridSearchCV 找到线性回归问题的系数

如何使用 KerasClassifier 验证拆分和使用 scikit 学习 GridSearchCV

使用一个热编码器时出现gridsearchCV错误

将 OneClassSVM 与 GridSearchCV 结合使用

如何公平地比较基线和 GridSearchCV 结果?

如何使用不同的数据集进行 GridSearchCV 训练和测试?