【问题标题】:scikit-learn undersampling of unbalanced data for crossvalidationscikit-learn 对不平衡数据进行欠采样以进行交叉验证
【发布时间】:2014-01-09 19:15:30
【问题描述】:

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

假设我们有一个类的 20 个样本,另一个类有 80 个样本,我们需要生成 N 个训练集和测试集,每个训练集的大小为 30,在每个训练集的约束条件下,我们有 50 个第一类的百分比和第二类的 50%。

我发现了这个讨论 (https://github.com/scikit-learn/scikit-learn/issues/1362),但我不明白如何获得折叠。理想情况下,我认为我需要这样的功能:

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

我错过了什么?

【问题讨论】:

  • 为什么不直接使用random.sample()
  • 出于同样的原因,我们还有所有其他的 cross_validation 函数!?
  • 你可以定义你自己的交叉验证生成器:它应该是一个带有__len__的对象,它返回N和一个__iter__,它产生N列表对(train_indices, test_indices)
  • 谢谢@larsmans,这正是我所需要的。

标签: python machine-learning scikit-learn


【解决方案1】:

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

1.

使用StratifiedCrossValidation 实现交叉验证,每个折叠中的分布反映数据的分布,然后您可以通过class_weight 参数实现分类器的不平衡减少,该参数可以采用auto 和欠采样/过采样类成反比到他们的数量,或者您可以传递具有明确权重的字典。

2.

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

【讨论】:

    【解决方案2】:

    StratifiedCV 是一个不错的选择,但您可以让它更简单:

    1. 对与第 1 类相关的数据运行随机抽样(您需要选择 15/20 个样本)
    2. 2 类 (15/80) 也是如此
    3. 重复 100 次或根据需要重复多少次。

    就是这样。快速实用!

    【讨论】:

      猜你喜欢
      • 2015-05-26
      • 2021-10-25
      • 2020-09-06
      • 2017-04-12
      • 2014-06-20
      • 2020-08-30
      • 2014-05-01
      • 1970-01-01
      • 2017-10-29
      相关资源
      最近更新 更多