Python scikit学习交叉验证不平衡数据的欠采样

Python scikit学习交叉验证不平衡数据的欠采样,python,machine-learning,scikit-learn,Python,Machine Learning,Scikit Learn,如何在scikit learn中为交叉验证生成随机折叠 假设我们有一个类的20个样本,另一个类的80个样本,我们需要生成N个训练集和测试集,每个训练集的大小为30,在每个训练集中,我们有50%的第一类和50%的第二类 我找到了这个讨论()但我不知道如何获得折叠。理想情况下,我认为我需要这样一个功能: cfolds = np.cross_validation.imaginaryfunction( [list(itertools.repeat(1,20)), list(itertools.repea

如何在scikit learn中为交叉验证生成随机折叠

假设我们有一个类的20个样本,另一个类的80个样本,我们需要生成N个训练集和测试集,每个训练集的大小为30,在每个训练集中,我们有50%的第一类和50%的第二类

我找到了这个讨论()但我不知道如何获得折叠。理想情况下,我认为我需要这样一个功能:

cfolds = np.cross_validation.imaginaryfunction(
[list(itertools.repeat(1,20)), list(itertools.repeat(2,80))], 
n_iter=100, test_size=0.70)

我遗漏了什么?

在scikit中,没有直接的方法可以使用欠采样进行交叉验证,但有两种解决方法:

一,

使用
StratifiedCrossValidation
实现交叉验证,每个折叠中的分布反映了数据的分布,然后,您可以通过
class_weight
参数实现分类器中的不平衡减少,该参数可以使
auto
和欠采样/过采样类与其计数成反比,也可以传递带有显式权重的字典

二,


编写自己的交叉验证例程,使用它应该非常简单

分层DCV是一个不错的选择,但您可以使其更简单:

  • 对与类别1相关的数据进行随机抽样(您需要选择15/20个样本)
  • 第2类(15/80)也一样
  • 重复100次或你需要多少

  • 就这些。又快又好用

    为什么不直接使用
    random.sample()
    ?出于同样的原因,我们有所有其他交叉验证功能!?您可以定义自己的交叉验证生成器:它应该是一个对象,具有返回
    N
    \uuu len\uuu
    和生成
    N
    对列表
    (训练索引,测试索引)
    。谢谢@larsmans,这正是我需要的。