在 sklearn 中使用网格搜索和管道获得正确的交叉验证分数

Posted

技术标签:

【中文标题】在 sklearn 中使用网格搜索和管道获得正确的交叉验证分数【英文标题】:Getting proper cross validation scores with grid search and pipelines in sklearn 【发布时间】:2018-11-16 08:12:26 【问题描述】:

我的设置:我正在运行一个流程(=管道),在该流程中,我在选择了相关变量后运行回归(在标准化数据之后 - 我省略了步骤,因为它们在这种情况下无关紧要),我将通过网格搜索,如下图

fold = StratifiedShuffleSplit(n_splits=10, test_size=0.2, random_state=777)
regression_estimator = LogisticRegression(penalty='l2', random_state=777, max_iter=10000, tol=10, solver='newton-cg')
pipeline_steps = [('feature_selection', SelectKBest(f_regression)), ('regression', regression_estimator)]

pipe = Pipeline(steps=pipeline_steps)

feature_selection_k_options = np.arange(1, 33, 3)

param_grid = 'feature_selection__k': feature_selection_k_options

gs = GridSearchCV(pipe, param_grid=param_grid, scoring='recall', cv=fold)
gs.fit(X, y)

因为默认情况下refit=TrueGridSearchCV 中,所以我默认得到的是 best_estimator,我可以接受。我缺少的是,鉴于此 best_estimator,我如何仅在程序中预先拆分的 TEST 数据上获得交叉验证分数。事实上,有 .score(X, Y) 方法,但是,正如文档所指示的 (http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html#sklearn.linear_model.LogisticRegression.predict_proba) “返回给定测试数据和标签的平均准确度” 而我想要通过 cross_val_score (@ 987654322@)。问题是这个过程会重新运行所有的东西并且只保留那些结果(我想要从这个过程中得到所有的数量)。

本质上,我想从最佳估计器中提取测试数据的交叉验证分数,其中包含我选择的度量(或网格搜索中已经选择的度量)以及已经嵌入我的 CrossValidated 算法Pipeline(在这种情况下为StratifiedShuffleSplit

你知道怎么做吗?

【问题讨论】:

请详细说明(可能是某种伪代码)您想做什么?目前它非常混乱。最佳估计器是用找到的最佳参数组合初始化的估计器。可以从cv_results_ 访问所有参数组合及其在所有折叠上的训练测试结果。这可以为您想要的任意数量的指标完成。 【参考方案1】:

您可以通过cv_results_ 属性访问交叉验证分数,该属性可以方便地读入pandas DataFrame:

import pandas as pd
df_result = pd.DataFrame(gs.cv_results_)

关于“我选择的衡量标准”,您可以查看 this 示例,该示例展示了如何在 GridSearchCV 中一次计算多个得分者。

【讨论】:

以上是关于在 sklearn 中使用网格搜索和管道获得正确的交叉验证分数的主要内容,如果未能解决你的问题,请参考以下文章

管道和网格搜索的 SKLearn 错误

使用管道和网格搜索执行特征选择

你能从 sklearn 网格搜索 (GridSearchCV) 中获得所有估计器吗?

sklearn 管道有没有办法在网格搜索期间进行有步骤和无步骤的训练?我可以删除步骤,但如何将其传递给 GridSearchCV?

网格搜索 SVM-anova 的超参数并在 Sklearn 中获得选择的特征

sklearn:应用相同的缩放来训练和预测管道