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

Posted

技术标签:

【中文标题】如何在不过度采样的情况下平衡数据集【英文标题】:How to balance a dataset without oversampling 【发布时间】: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 imbalanced-learn.readthedocs.io/en/stable/under_sampling.html 我使用了 imblearn 的 Random Undersampler,它确实比其他人好用:imbalanced-learn.readthedocs.io/en/stable/generated/… 但我建议您尽可能避免欠采样并采用过采样技术。 【参考方案1】:

根据我的经验,由于我们没有利用全部可用数据,因此每次采样不足都无济于事,而且这种方法可能会导致大量过度拟合。合成少数过采样技术 (SMOTE) 可以很好地处理大多数类型的数据(结构化和非结构化数据,如图像),尽管有时性能可能会很慢。但是它很容易使用并且可以通过 [imblearn][1] 获得。如果您想尝试过采样技术,这篇特别的文章可能会有所帮助:https://medium.com/@adib0073/how-to-use-smote-for-dealing-with-imbalanced-image-dataset-for-solving-classification-problems-3aba7d2b9cad 但是对于上述 cmets 中提到的欠采样,您必须对多数类的数据帧或数组进行切片以匹配少数类的大小

【讨论】:

【参考方案2】:

尝试申请iterative-stratification

关于多标签数据的分层:

分层抽样是一种抽样方法,考虑到 人口中存在不相交的群体并产生 保持这些组的比例的样本。在 单标签分类任务,分组基于 目标变量的值。在多标签学习任务中, 但是,如果有多个目标变量,则不清楚 可以/应该如何进行分层抽样。这张纸 研究多标签数据上下文中的分层。它 考虑多标签数据的两种分层方法和 凭经验将它们与随机抽样进行比较 数据集并基于许多评估标准。结果 揭示一些关于效用的有趣结论 每种方法都适用于特定类型的多标签数据集。

【讨论】:

以上是关于如何在不过度采样的情况下平衡数据集的主要内容,如果未能解决你的问题,请参考以下文章

解决正负样本数据不平衡

如何在不更改特定列的情况下对数据框中的数据进行重新采样?

如何在不更改特定列的情况下对数据框中的数据进行重新采样?

如何对不平衡的多类数据集进行欠采样? (Python)

ASP.NET——如何在不过度设计的情况下有效地使用设计模式!

在分类中,如何在数据集不平衡的情况下验证模型?