k-fold分层交叉验证与不平衡类

ele*_*ora 17 python machine-learning scikit-learn

我有4个类的数据,我正在尝试构建一个分类器.我有一个类的〜1000个向量,另一个有~10 ^ 4,第三个为~10 ^ 5,第四个为~10 ^ 6.我希望使用交叉验证,所以我查看了scikit-learn文档.

我的第一次尝试是使用StratifiedShuffleSplit但是这给了每个类相同的百分比,使得类仍然严重失衡.

有没有办法进行交叉验证,但是在训练和测试集中平衡了类?


作为旁注,我无法弄清楚StratifiedShuffleSplitStratifiedKFold之间的区别.描述与我非常相似.

IVl*_*lad 21

我的第一次尝试是使用StratifiedShuffleSplit但是这给了每个类相同的百分比,使得类仍然严重失衡.

我觉得你会混淆分层策略会做什么,但你需要显示你的代码和结果,以确定发生了什么(与原始集合中的百分比相同的百分比,或相同返回的火车/测试集中的百分比?第一个是它应该如何).

作为旁注,我无法弄清楚StratifiedShuffleSplit和StratifiedKFold之间的区别.描述与我非常相似.

其中一个绝对应该工作.对第一个的描述肯定有点令人困惑,但这就是他们所做的.

StratifiedShuffleSplit

提供列车/测试索引以在列车测试集中分割数据.

这意味着它将您的数据拆分为火车和测试集.分层部分意味着在这种分裂中将保持百分比.因此,如果10%您的数据属于1级并且90%属于2级,这将确保10%您的列车组将在1级并且90%将在2级.对于测试集也是如此.

你的帖子听起来好像你想要50%测试集中的每个类.这不是分层所做的,分层保持了原始的百分比.你应该维护它们,因为否则你会给自己一个关于分类器性能的不相关的想法:谁在乎它如何分类50/50分裂,在实践中你会看到10/90分裂?

StratifiedKFold

此交叉验证对象是KFold的变体,可返回分层折叠.通过保留每个类别的样本百分比来进行折叠.

参见k-fold交叉验证.没有分层,它只是将您的数据分成k折叠.然后,每个折叠1 <= i <= k使用一次作为测试集,而其他折叠用于训练.结果平均到最后.它类似于运行ShuffleSplit k时代.

分层将确保整个数据中每个类别的百分比在每个单独的折叠中相同(或非常接近).


有很多文献涉及不平衡的阶级.一些简单易用的方法涉及使用类权重和分析ROC曲线.我建议以下资源为此起点:

  1. 使用类权重的scikit-learn示例.
  2. 关于为不平衡数据实现神经网络的问题.
  3. 这个stats.stackexchange问​​题有更深入的答案.