【发布时间】:2019-04-30 23:20:24
【问题描述】:
我正在尝试平衡我的数据集,但我正在努力寻找正确的方法。让我设置问题。我有一个具有以下类权重的多类数据集:
class weight
2.0 0.700578
4.0 0.163401
3.0 0.126727
1.0 0.009294
如您所见,数据集非常不平衡。我想做的是获得一个平衡的数据集,其中每个类都用相同的权重表示。
有很多关于但是的问题:
- Scikit-learn balanced subsampling:这个子样本可以重叠,这对我来说是错误的。此外,我想使用 sklearn 或经过良好测试的软件包来获得它。
- How to perform undersampling (the right way) with python scikit-learn?:这里他们建议使用带有平衡类权重向量的不平衡数据集,但是,我需要这个平衡数据集,与哪个模型和哪个权重无关。
- https://github.com/scikit-learn-contrib/imbalanced-learn:很多问题都涉及到这个包。下面是一个关于我如何尝试使用它的示例。
这里是例子:
from imblearn.ensemble import EasyEnsembleClassifier
eec = EasyEnsembleClassifier(random_state=42, sampling_strategy='not minority', n_estimators=2)
eec.fit(data_for, label_all.loc[data_for.index,'LABEL_O_majority'])
new_data = eec.estimators_samples_
但是,返回的索引都是初始数据的索引,并且重复了n_estimators次。
结果如下:
[array([ 0, 1, 2, ..., 1196, 1197, 1198]),
array([ 0, 1, 2, ..., 1196, 1197, 1198])]
最后,很多技术都使用过采样但不想使用它们。仅对于 1 类,我可以容忍过采样,因为它是非常可预测的。
我想知道是否真的 sklearn,或者这个 contrib 包没有这样做的功能。
【问题讨论】:
-
您可以进行欠采样。我的意思不是改变权重,而是直接从多数类中删除数据以匹配少数类。 ImbLearn 也有工具可以做到这一点。
-
好的,你能给我指出正确的实用程序吗,我在文档中没有找到任何方法。 @VivekKumar
-
我使用了 imblearn 的 Random Undersampler,它确实比其他人好用:imbalanced-learn.readthedocs.io/en/stable/generated/… 但我建议您尽可能避免欠采样并采用过采样技术。
标签: python machine-learning scikit-learn