欠采样的逻辑中往往会结合集成学习来有效的使用数据,假设正例数据n,而反例数据m个。我们可以通过欠采样,随机无重复的生成(k=n/m)个反例子集,并将每个子集都与相同正例数据合并生成k个新的训练样本。我们在k个训练样本上分别训练一个分类器,最终将k个分类器的结果结合起来,比如求平均值。这就是一个简单的思路,也就是Easy Ensemble [5]。
阿萨姆大神总结的很对,只要正负比例不过于极端,目前各种集成模型不采样处理加选择合适的评价参数都能达到不错的效果,过于偏离的正负比例,再怎么采样感觉也学习不到更多的信息
- 简单的调整阈值,不对数据进行任何处理。此处特指将分类阈值从0.5调整到正例比例
- 使用现有的集成学习分类器,如随机森林或者xgboost,并调整分类阈值
- 更改数据集中各分类数据的量,使他们比例匹配——常用方法有采样、数据合成;
- 更改数据集中各分类数据的权重,使他们的量与权重之积匹配——常用方法为加权;
- 不修改数据集,而是在思路上将不平衡数据训练问题转化为一分类问题或者异常检测问题(少数类就像是存在于多数类中的异常值)。
提出这样建议的原因有很多。首先,简单的阈值调整从经验上看往往比过采样和欠采样有效 [6]。其次,如果你对统计学知识掌握有限,而且编程能力一般,在集成过程中更容易出错,还不如使用现有的集成学习并调整分类阈值。
采样就是通过减少多数类数量的下采样(Undersampling)或增加少数类数量的上采样(Oversampling)方式,实现各类别平衡。针对两种采样方式,依赖不同的方法,比如说 随机、模型融合等,就会生成很多解决方案,
数据合成
随机上采样会反复出现一些样本,而导致过拟合;随机下采样则会造成一定程度的特征丢失,虽然这种方式比较简单,但现在计算机的计算能力越来越高,可接受的算法复杂度也越来越高,所以我们应该主要考虑模型训练的效果。
数据合成则是利用已有样本生成更多样本,其中常用的包括:
- SMOTE,利用KNN生成新数据;
- SMOTEC,可以合成分类数据,但数据集中至少要包含一条连续数据;
- 如果数据集中全是分类数据的话,可以增加一列全为1的intercept列作为连续数据,合成数据之后,再将该列删除即可。
- BorderlineSMOTE,与SMOTE的区别是,只为那些周围大部分是大众样本的小众样本生成新样本(因为这些样本往往是边界样本);
更改权重
更改权重就是针对不同类别的数据设置不同的分错代价,即提高少数类分错的代价或降低多数类分错的代价,最终使各类别平衡。
常用的机器学习训练方法中,很多都提供了权重设置参数class_weight,可以手动设置该参数,但一般情况下只需要将其设置为balanced即可,模型会自动按照如下公式更新权重:
一分类
这种方法比较适合极不平衡数据,或数据量比较小的数据集。
主要方法为`OneClassSVM
数据量还可以,但类别之间数量相差悬殊的时候考虑用一分类或者异常检测的方法。