Scikit-learn 中 Kfold 的 ROC 曲线。对 StratifiedKfold 有效,但对 Kfold 显示错误

Posted

技术标签:

【中文标题】Scikit-learn 中 Kfold 的 ROC 曲线。对 StratifiedKfold 有效,但对 Kfold 显示错误【英文标题】:ROC Curve for Kfold in Scikit-learn. Works good for StratifiedKfold but show error for Kfold 【发布时间】:2019-06-20 14:06:37 【问题描述】:

我想使用 Kfold 交叉验证 绘制 ROC 曲线。但是,scikit-learn 页面上给出的代码是针对StratifiedKfold 的。因此,当我将StratifiedKfold 更改为Kfold 时,它会给我None 的绘图结果。可能是什么问题?

示例代码位于ScikitLearn

我将StratifiedKfold 更改为Kfold,但它不起作用。

【问题讨论】:

向我们展示您使用的代码。 @Andronicus 感谢您的反馈。我无法复制 cmets 中的代码。但是,代码位于以下给定链接scikit-learn.org/stable/auto_examples/model_selection/… 【参考方案1】:

在切割折叠之前打乱数据:

cv = KFold(n_splits=6, shuffle=True)

解释:

StratifiedKFold 削减折叠,使得每个折叠中的类比例与整个数据集中的比例大致相同。 Kfold 不这样做,只是按照它们在数据集中出现的顺序从样本中剪切折叠。因此,您可能会或可能不会在所有折叠中获得所有当前课程。本例还是Iris数据集,样本是按类排序的,这个可以从目标y看出来:

array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])

因此,在 6 折拆分的情况下,大多数时候您只能在一个折中得到一个类,整个模型训练就会中断。 Shuffle 允许 KFold 在每个折叠中拾取这两个类,并且一切正常。

【讨论】:

谢谢你这么好的解释。就我而言,我有 40 个样本。因此,我想申请 40 折。但是,随着洗牌,结果仍然是修女。换句话说,我们可以说我的问题利用了 LOO 交叉验证。你有什么想法,如何处理? 40 个样本的 40 次折叠是很多的。通常,不超过 10 折。而且样本数量越少,您想要的折叠就越少,因为每次折叠的训练样本越多,模型质量就越好。 兄弟你是对的。但是,实际上之前对数据集进行的研究利用了 LOO 交叉验证。为了将我的方法与以前的方法进行比较,我正在尝试为 LOO 验证方案绘制 ROC。无论如何要绘制 ROC 以进行 LOO 交叉验证??? 我认为这值得一个单独的问题。需要计算遗漏样本的统计量吗?所以可能需要一些额外的编码。在这个问题中,我向您展示了为什么 KFold 不起作用以及什么可以使它起作用,即回答了所提出的问题 感谢兄弟的反馈。

以上是关于Scikit-learn 中 Kfold 的 ROC 曲线。对 StratifiedKfold 有效,但对 Kfold 显示错误的主要内容,如果未能解决你的问题,请参考以下文章

scikit-learn 中的 StratifiedKFold 与 KFold

TypeError:“KFold”对象不可迭代

您是不是预测交叉验证后的测试数据(gridsearchcv w/KFold)以及如何预测?

如何在 scikit-learn 中计算正确的交叉验证分数?

scikit-learn 中每个数据拆分的交叉验证指标

Scikit-learn:如何获得真阳性、真阴性、假阳性和假阴性