Scikit Learn 中的交叉验证

Posted

技术标签:

【中文标题】Scikit Learn 中的交叉验证【英文标题】:Cross Validation in Scikit Learn 【发布时间】:2016-04-25 03:58:27 【问题描述】:

我一直在用http://scikit-learn.org/stable/modules/generated/sklearn.cross_validation.cross_val_score.html

为了交叉验证逻辑回归分类器。我得到的结果是:

[ 0.78571429  0.64285714  0.85714286  0.71428571  
0.78571429  0.64285714    0.84615385  0.53846154  
0.76923077  0.66666667]

我的主要问题是如何找到哪个集合/折叠使我的分类器得分最大化并产生 0.857。

后续问题:用这个集合训练我的分类器是一种好的做法吗?

提前谢谢你。

【问题讨论】:

你这里好像有很多问题。我建议选择最重要的一个并询问。其他问题可能会被意外回答。 :) 以防万一,“逻辑回归”本身不是分类器。 【参考方案1】:

我是否以及如何找到哪个集合/折叠使我的分类器得分最大化

cross_val_score的文档中可以看出,它是对特定的cv对象进行操作的。 (如果你没有明确给出它,那么在某些情况下它将是 KFold,在其他情况下是其他东西 - 请参阅那里的文档。)

您可以遍历此对象(或相同的对象)以找到准确的训练/测试索引。例如,:

for tr, te in KFold(10000, 3):
    # tr, te in each iteration correspond to those which gave you the scores you saw.

用这个集合训练我的分类器是否是一个好习惯。

绝对不是!

交叉验证的唯一合法用途是评估整体性能、在不同模型之间进行选择或配置模型参数。

一旦您致力于一个模型,您应该在整个训练集上对其进行训练。在恰好给出最高分数的子集上训练它是完全错误的。

【讨论】:

+1 获取有关良好做法的建议。我只想补充一点,尽管在不同领域有所不同,但通常“良好实践”是在训练集上使用交叉验证进行参数估计,在该集上重新训练,然后在看不见的测试集上评估模型。显然取决于有多少数据!

以上是关于Scikit Learn 中的交叉验证的主要内容,如果未能解决你的问题,请参考以下文章

scikit-learn中的随机分层k折交叉验证?

Scikit Learn 分层交叉验证中的差异

如何在 scikit-learn 中正确执行交叉验证?

Scikit learn 中的交叉验证与网格搜索

Scikit-Learn 中的分层标记 K 折交叉验证

使用 Scikit-Learn GridSearchCV 与 PredefinedSplit 进行交叉验证 - 可疑的交叉验证结果