scikit-学习不平衡数据的欠采样以进行交叉验证

时间:2013-12-20 21:00:23

标签: python machine-learning scikit-learn

如何在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)

我错过了什么?

2 个答案:

答案 0 :(得分:1)

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

1

使用StratifiedCrossValidation实现交叉验证,在每个折叠中分配镜像数据的分布,然后您可以通过class_weight param实现分类器中的不平衡减少,这可以采用auto和欠采样/过采样类与其计数成反比,或者您可以传递具有显式权重的字典。

2

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

答案 1 :(得分:0)

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

  1. 对与第1类相关的数据运行随机抽样(您需要选择15/20样本)
  2. 同样适用于2级(15/80)
  3. 重复100次或需要多少。
  4. 这就是全部。快速可行!