数据处理
过采样
由于样本比例不均衡,在条件允许的情况下,可以尝试主动获取占比少的类型的样本数据。
也可以通过使用重复、自举或合成少数类]等方法(SMOTE)来生成新的稀有样品。
直接简单复制重复的话,如果特征少,会导致过拟合的问题。经过改进的过抽样方法通过在少数类中加入随机噪声、干扰数据或通过一定规则产生新的合成样本 (数据增强)。
关于SMOTE算法的说明:
SMOTE算法的基本思想是对少数类样本进行分析并根据少数类样本人工合成新样本添加到数据集中,算法流程如下:
- 对于少数类中每一个样本x,计算该点与少数类中其他样本点的距离,得到最近的k个近邻(即对少数类点进行KNN算法)。
- 根据样本不平衡比例设置一个采样比例以确定采样倍率,对于每一个少数类样本x,从其k近邻中随机选择若干个样本,假设选择的近邻为x’。
- 对于每一个随机选出的近邻x’,分别与原样本按照如下的公式构建新的样本:xnew=x+rand(0,1)∗(x‘−x)x_{new}=x+rand(0,1) ∗ (x^‘−x)xnew=x+rand(0,1)∗(x‘−x)
但是SMOTE算法缺点也十分明显:
- 一方面是增加了类之间重叠的可能性(由于对每个少数类样本都生成新样本,因此容易发生生成样本重叠(Overlapping)的问题).
- 另一方面是生成一些没有提供有益信息的样本。
欠采样
数据量足够时,可以通过保留比例小的样本数据和减少比例大的样本数据来平衡数据集。
缺点:
会丢失多数类中的一些重要信息。
改变权重
对不同样本数量的类别赋予不同的权重(通常会设置为与样本量成反比,样本量越大,权重越小)。
使用K折交叉验证
使用过采样方法来解决不平衡问题时应适当地应用交叉验证。这是因为过采样会观察到罕见的样本,并根据分布函数自己生成新的随机数据,如果在过采样之后应用交叉验证,那么我们所做的就是将我们的模型过拟合于一个特定的人工引导结果。
这就是为什么在过度采样数据之前应该始终进行交叉验证,就像实现特征选择一样。只有重复采样数据可以将随机性引入到数据集中,以确保不会出现过拟合问题。
选择合适的评价指标
针对机器学习中的数据不平衡问题,建议更多PR(Precision-Recall曲线),而非ROC曲线,如果采用ROC曲线来作为评价指标,很容易因为AUC值高而忽略实际对少量样本的效果其实并不理想的情况。
对于数据极端不平衡时,可以观察观察不同算法在同一份数据下的训练结果的精确率和召回率,这样做有两个好处,一是可以了解不同算法对于数据的敏感程度,二是可以明确采取哪种评价指标更合适。
注意:
不要只看Accuracy,Accuracy可以说是最模糊的一个指标了,因为这个指标高可能压根就不能代表业务的效果好,在实际生产中更关注precision/recall/mAP等具体的指标,具体侧重那个指标,得结合实际情况看。
选择合适的算法
1、选择对数据倾斜相对不敏感的算法,如树模型等。
2、集成学习,即多模型Bagging。
首先从多数类中独立随机抽取出若干子集,将每个子集与少数类数据联合起来训练生成多个基分类器,再加权组成新的分类器,如加法模型、Adaboost、随机森林等。
3、转化成异常检测或者一分类问题。
对于正负样本极不平衡的场景,我们可以换一个完全不同的角度来看待问题:把它看做一分类(One Class Learning)或异常检测(Novelty Detection)问题。
这类方法的重点不在于捕捉类间的差别,而是为其中一类进行建模,如One-Class SVM。
遇到数据不平衡时,如何选择方案?
解决数据不平衡问题的方法有很多,上面只是一些最常用的方法,而最常用的方法也有这么多种,如何根据实际问题选择合适的方法呢?下来就来谈谈遇到不同情况下的解决方案。
1、在正负样本都非常之少的情况下,应该采用数据合成的方式;
2、在负样本足够多,正样本非常之少且比例及其悬殊的情况下,应该考虑一分类方法;
3、在正负样本都足够多且比例不是特别悬殊的情况下,应该考虑采样或者加权的方法。
4、采样和加权在数学上是等价的,但实际应用中效果却有差别。尤其是采样了诸如Random Forest等分类方法,训练过程会对训练集进行随机采样。在这种情况下,如果计算资源允许过采样往往要比加权好一些。
5、另外,虽然过采样和欠采样都可以使数据集变得平衡,并且在数据足够多的情况下等价,但两者也是有区别的。实际应用中,如果计算资源足够且小众类样本足够多的情况下使用过采样,否则使用欠采样,因为过采样会增加训练集的大小进而增加训练时间,同时小的训练集非常容易产生过拟合。
6、对于欠采样,如果计算资源相对较多且有良好的并行环境,应该选择Ensemble方法(组合方法)。
关于Ensemble方法的说明:
所谓Ensemble方法,就是把几种机器学习的算法组合到一起,或者把一种算法的不同参数组合到一起。
基本上分为如下两类:
- Averaging methods(平均方法),就是利用训练数据的全集或者一部分数据训练出几个算法或者一个算法的几个参数,最终的算法是所有这些算法的算术平均。比如,Bagging Methods(装袋算法),Forest of Randomized Trees(随机森林)等。
- Boosting methods(提升算法),就是利用一个基础算法进行预测,然后在后续的其他算法中利用前面算法的结果,重点处理错误数据,从而不断的减少错误率。其动机是使用几种简单的弱算法来达到很强大的组合算法。所谓提升就是把“弱学习算法”提升(boost)为“强学习算法,是一个逐步提升逐步学习的过程;比如,AdaBoost(Adaptive Boost,自适应提升),Gradient Tree Boosting(GBDT)。