使用 sklearn 嵌套交叉验证获得最佳参数

Posted

技术标签:

【中文标题】使用 sklearn 嵌套交叉验证获得最佳参数【英文标题】:Getting the best parameters using sklearn nested cross-validation 【发布时间】:2018-02-03 17:13:30 【问题描述】:

我的理解是否正确,“greed_search.fit(X,Y)”在以下代码中与嵌套 CV 没有任何关系?这意味着无法使用 sklearn 中的嵌套 CV 获得最佳参数。

    # inner cross_validation
    greed_search = GridSearchCV(estimator=estimator, param_grid=parameters, cv=inner_cv, scoring=optimized_for)
    greed_search.fit(X, optimization_label)
    # Nested CV with parameter optimization
    nested_score = cross_val_score(greed_search, X=X, y=Y, cv=outer_cv)

【问题讨论】:

什么是 inner_cv ?是数字吗? 【参考方案1】:

你是对的:你的代码中的greed_search.fit(X, optimization_label) 是按原样执行的,没有嵌套到下一个交叉验证中。

为了回答你的第二个问题,我问你另一个问题:嵌套到交叉验证中的网格搜索的最佳参数应该是什么?第一折的那些?最常见的?

内网格搜索,在外交叉验证的每一步,根据当前步骤的训练数据选择最佳参数。因此,参数可以在折叠之间变化。自己做外部交叉验证,你可以计算出每一步的最佳参数,但我不认为你真的需要它。

【讨论】:

很好的答案!但是你将如何实现你的最终模型?换句话说,我的理解是 Nested CV 是一种在处理特定挑战时比较不同 ML 算法的工具。然后,一旦选择了最有希望的 ML 算法,就需要在原始数据集上创建最终模型。那么在完成嵌套 CV 之后,是否必须通过 Gridsearch CV 的新过程才能真正了解最佳参数,然后将它们应用于最终模型?如果是这样,这个最终模型需要用整个数据集还是只用训练集来构建? @Odisseo 你是完全正确的。关于最后一点:这取决于你。一旦找到最佳参数,您可以 i) 在整个数据集上进行训练,或 ii) 在训练集上进行训练(这是我通常喜欢的),或 iii) 使用已经在CV(每折一份)。由于您已经在交叉验证期间训练了这些模型,因此您可能还决定重新使用它们:)

以上是关于使用 sklearn 嵌套交叉验证获得最佳参数的主要内容,如果未能解决你的问题,请参考以下文章

SKlearn中具有嵌套交叉验证的分类报告(平均值/个体值)

使用 sklearn 在嵌套交叉验证中使用 GroupKFold

Pyspark交叉验证后如何获得最佳超参数值?

sklearn中的交叉验证+决策树

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

嵌套交叉验证的正确程序是啥?