不平衡数据:欠采样还是过采样?
Posted
技术标签:
【中文标题】不平衡数据:欠采样还是过采样?【英文标题】:Imbalanced data: undersampling or oversampling? 【发布时间】:2017-10-29 21:27:14 【问题描述】:我有一个二元分类问题,其中一个类代表了所有观察的 99.1% (210 000)。作为处理不平衡数据的策略,我选择了抽样技术。但我不知道该怎么做:对我的多数班级进行欠采样或对代表性较低的班级进行过采样。 有人给点建议吗?
谢谢。
附: 我使用 sklearn 的随机森林算法。
【问题讨论】:
如果 210000 个观测值中的 0.9% 足以拟合,则对主要类进行欠采样。如果不是,则对代表性较少的类进行过采样。或者当然你可以两者都做。 【参考方案1】:我认为上面接受的答案中有错字。你不应该“对少数人进行抽样不足”和“对多数人进行过度抽样”;相反,您应该对大多数人进行欠采样,对少数人进行过采样。
如果您熟悉 Weka,则可以轻松地尝试使用不同的数据不平衡技术和不同的分类器来研究哪种方法效果最好。对于 Weka 中的欠采样,请参阅这篇文章:combination of smote and undersampling on weka。
对于 Weka 中的过采样,您可以尝试 SMOTE 算法(此处提供了一些信息:http://weka.sourceforge.net/doc.packages/SMOTE/weka/filters/supervised/instance/SMOTE.html)。当然,创建 20,811 个合成少数数据(即,如果您正在寻找平衡数据)在计算上比欠采样更昂贵,因为:(1)与创建合成数据相关的计算成本; (2) 与 21,000 个样本相比,在 42,000 个样本(包括为少数类创建的 20,811 个合成样本)上进行训练的计算成本更高。
根据我的经验,您提到的两种数据不平衡方法都运行良好,但我通常先尝试欠采样,因为从资源角度来看,我觉得它更便宜一些。
这里有用于欠采样和过采样的 Python 包:
-
欠采样:http://glemaitre.github.io/imbalanced-learn/auto_examples/ensemble/plot_easy_ensemble.html
过采样:http://contrib.scikit-learn.org/imbalanced-learn/stable/auto_examples/over-sampling/plot_smote.html
您还可以研究成本敏感型分类技术,以通过成本矩阵惩罚少数类别的错误分类。
-
这里是一个不错的 Weka 包的链接:https://weka.wikispaces.com/CostSensitiveClassifier
这里是一个 Python 包的链接:https://wwwen.uni.lu/snt/research/sigcom/computer_vision_lab/costcla_a_cost_sensitive_classification_library_in_python
【讨论】:
确实你是对的。谢谢!我修正了我的答案【参考方案2】: 过采样或 采样中或 对少数人过度抽样,对多数人抽样不足是一个超参数。做交叉验证哪个效果最好。 但是使用训练/测试/验证集。
【讨论】:
@ebrahimi:感谢您的信任。不过,我怀疑是否有最好的方法。因此,我不能给你反馈 @CAFEBABE 谢谢。您能否告诉我 sklearn 分类器中的类权重,例如逻辑回归分为哪一类? 采样技术的选择不是超参数。根据定义,超参数必须改变学习过程。请参阅the wiki on hyperparameters. 采样永远不会改变学习过程,尽管我猜它可能有资格成为元优化的候选者。抽样是关于更改数据,以便更好地反映实际任务。如何定义“更好”几乎永远不清楚,但它似乎最常用于匹配 OP 中的训练/测试/验证响应分布。这在很大程度上取决于任务、功能等【参考方案3】:欠采样: 当我们有数十亿(大量)数据点并且我们没有足够的计算或内存(RAM)资源来处理数据时,通常会执行欠采样。在某些情况下,与在完整数据或过采样数据上训练数据相比,欠采样可能会导致更差的性能。在其他情况下,我们可能不会因为采样不足而导致性能显着下降。
欠采样主要是为了在有限的计算、内存和/或存储限制下工作时使模型的训练更易于管理和可行。过采样: 过采样往往效果很好,因为与欠采样不同,过采样不会丢失信息。
【讨论】:
以上是关于不平衡数据:欠采样还是过采样?的主要内容,如果未能解决你的问题,请参考以下文章