阅读笔记——7 Techniques to Handle Imbalanced Data

这篇阅读笔记,主要介绍处理不平衡数据的常见7种方法。所谓不平衡数据,指在网络入侵、癌症监测、银行信用卡检测等领域,出现如下图所示的数据集中,正负样本比例严重失调的情况。
imbalanced-data-1

博客中介绍了7种方法帮助我们训练一个分类器,来处理这些不平衡的数据。

1.使用正确的评价指标

针对上图这样的数据集,如果我们还是采用准确度(accuracy)来评估模型训练结果,那么所有的分类器将所有的测试样本都分到“0”这一类,模型准确率无疑非常好,但显然,这样的model对我们来说,是没有价值的。
这种情况,其他适宜的评估指标有:Precision/SpecificityRecall/SensitivityF1 scoreMCCAUCG-Mean

2.训练集重新采样(Resample)

除了使用不同的评价指标,另外可以通过下采样过采样在不平衡数据中得到平衡数据集。

下采样(Under-sampling)

当数据量充足时,下采样通过减少负样本数量(即多数的类),即保留正样本和随机选择相同数量的负样本,得到新的平衡训练集。

过采样(Over-sampling)

当数据量不够时,过采样通过增加正样本数来平衡数据集,可以采用repetitionbootstrappingSMOTE得到新的正样本。
Python实现

下采样和过采样两者之间没有谁优谁劣,具体用哪种方式取决于数据集本身,有时两者结合使用可能效果更好。

3.正确使用K折交叉验证

值得注意的是,当我们用过采样处理不平衡训练集时,通常需要在过采样之前应用交叉验证,这样做的好处就是避免模型过拟合。

过拟合产生原因:

  • 模型的复杂度越高,越容易overfitting
  • 数据的噪声越大,越容易overfitting
  • 数据量越少,越容易overfitting

4.重采样训练集集成(Ensemble)

imbalanced-data-2
如上面示例图所示,使用所有的正样本和 n 个不同的负样本建立 n 个models。比如你想得到10个models,如果正样本是1000个,那么你需要随机选择10000个负样本,然后将这10000个负样本分成10份,接下来训练这10个不同的models。
这种方法,简单方便,易扩展,更好的泛化能力。

5.不同比例采样

之前的方法,都是1:1调和样本,最佳的比例取决于数据和使用的模型。与其对所有models使用同样的比例进行ensemble,更值得尝试的是采用不同的比例进行ensemble。正如下图所示:
imbalanced-data-3

6.负样本进行聚类

Sergey在Quora上提出一个更完美的方法,对负样本进行聚类,只用负样本聚类的簇中心和正样本组成训练集。

7.自己设计模型

事实上,已经有一些models本身就可以处理非平衡数据集,无需进行重新采样,如XGBoost。
重设损失函数,比起负样本误分,对正样本误分设置更大的惩罚系数。

小结

这些处理方法只是一个起点,没有一种方法可以解决所有问题,多试才是王道

分享