不平衡数据:欠采样还是过采样?

Imbalanced data: undersampling or oversampling?

我有二进制 class 化问题,其中一个 class 代表所有观测值的 99.1% (210 000)。作为处理不平衡数据的策略,我选择了抽样技术。但我不知道该怎么做:对我的多数 class 进行欠采样或对较少代表 class 进行过采样。 如果有人有建议?

谢谢。

P.s。 我使用 sklearn 的随机森林算法。

  • 过采样或
  • 采样不足或
  • 对少数人过度采样,对大多数人采样不足

是超参数。进行交叉验证哪些效果最好。 但是使用Training/Test/Validation组。

我认为上面接受的答案有错字。你不应该 "undersample the minority" 和 "oversample the majority";相反,您应该对大多数人进行欠采样,对少数人进行过采样。

如果您熟悉 Weka,则可以轻松地尝试使用不同的数据不平衡技术和不同的 classifier 来研究哪种方法效果最好。对于 Weka 中的欠采样,请参阅此 post: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 个样本(包括为少数 class 创建的 20,811 个合成样本)进行训练的计算成本更高。

根据我的经验,您提到的两种数据不平衡方法都很有效,但我通常会先尝试欠采样,因为我觉得从资源角度来看它的成本要低一些。

这里有 Python 个欠采样和过采样包:

  1. 欠采样:http://glemaitre.github.io/imbalanced-learn/auto_examples/ensemble/plot_easy_ensemble.html
  2. 过采样:http://contrib.scikit-learn.org/imbalanced-learn/stable/auto_examples/over-sampling/plot_smote.html

您还可以研究成本敏感的 class 化技术,以通过成本矩阵惩罚少数 class 的错误 class 化。

  1. 这是一个很好的 Weka 包的 link:https://weka.wikispaces.com/CostSensitiveClassifier
  2. 这是一个 link 到 Python 的包:https://wwwen.uni.lu/snt/research/sigcom/computer_vision_lab/costcla_a_cost_sensitive_classification_library_in_python

欠采样:
当我们有数十亿(很多)数据点并且我们没有足够的计算或内存(RAM)资源来处理数据时,通常会执行欠采样。在某些情况下,与在完整数据或过采样数据上训练数据相比,欠采样可能会导致更差的性能。在其他情况下,我们可能不会因为采样不足而导致性能显着下降。

欠采样主要是为了在有限的计算、内存 and/or 存储限制下工作时使模型训练更易于管理和可行。

过采样:

过采样往往效果很好,因为与欠采样不同,过采样不会丢失信息。