如何在不过度采样的情况下平衡数据集

时间:2018-11-28 23:45:25

标签: python machine-learning scikit-learn

我正在尝试平衡我的数据集,但是我正在努力寻找正确的方法来做到这一点。我来解决问题。我有一个具有以下类权重的多类数据集:

class     weight
2.0       0.700578
4.0       0.163401
3.0       0.126727
1.0       0.009294

您可以看到数据集非常不平衡。我想做的是获得一个平衡的数据集,其中每个类的权重都相同。

关于但还有很多问题:

这里是示例:

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包没有执行此操作的功能。

2 个答案:

答案 0 :(得分:0)

根据我的经验,每次采样均不足以解决问题,因为我们没有利用总的可用数据,这种方法可能会导致很多过拟合现象。虽然少数情况下性能可能很慢,但综合少数族裔过采样技术(SMOTE)在大多数类型的数据(结构化和非结构化数据,例如图像)上都可以很好地工作。但是它很容易使用,可以通过[imblearn] [1]使用。如果您想尝试过采样技术,可以通过这篇特殊文章来帮助您:https://medium.com/@adib0073/how-to-use-smote-for-dealing-with-imbalanced-image-dataset-for-solving-classification-problems-3aba7d2b9cad 但是对于上述评论中提到的欠采样,您必须对多数类的数据帧或数组进行切片,以匹配少数类的大小

答案 1 :(得分:0)

尝试申请iterative-stratification

关于多标签数据的分层:

分层抽样是一种考虑了 人口和产品中不相交的群体的存在 保持这些组比例的样本。在 单标签分类任务,根据分组进行分组 目标变量的值。在多标签学习任务中, 但是,在有多个目标变量的地方,尚不清楚 如何/应该执行分层抽样。这篇报告 调查多标签数据上下文中的分层。它 考虑了多标签数据的两种分层方法 从经验上将它们与随机抽样进行比较 数据集并基于许多评估标准。结果 揭示了有关的效用的一些有趣的结论 每种类型的多标签数据集的每种方法。