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
您是不是预测交叉验证后的测试数据(gridsearchcv w/KFold)以及如何预测?