解决样本不均衡的问题很多,主流的几个如下:
1.样本的过采样和欠采样。
2..使用多个分类器进行分类。
3.将二分类问题转换成其他问题。
4.改变正负类别样本在模型中的权重。
一、样本的过采样和欠采样。
1.过采样:将稀有类别的样本进行复制,通过增加此稀有类样本的数量来平衡数据集。该方法适用于数据量较小的情况。
2.欠抽样:从丰富类别的样本中随机选取和稀有类别相同数目的样本,通过减少丰富类的样本量啦平衡数据集。该方法适用于数据量较大的情况。
3.也可以将过采样和欠采样结合在一起使用。
4.使用SMOTE方法来构造样本。
SMOTE算法是一种过采样的算法。这个算法不是简单的复制已有的数据,而是在原有数据基础上,通过算法产生新生数据。
算法思想:基于距离度量的方式计算两个或多个稀有类样本之间的相似性。
然后选择其中的一个样本作为基础样本,
再在邻居样本中随机选取一定数量的样本对那个基础样本的一个属性进行噪声。每次处理一个属性,通过这样的方式产生新生数据。
二、使用多个分类器进行分类。
方法一中介绍的过采样,欠采样,都存在相应的问题。
过采样:可能会存在过拟合问题。(可以使用SMOTE算法,增加随机的噪声的方式来改善这个问题)
欠采样:可能会存在信息减少的问题。因为只是利用了一部分数据,所以模型只是学习到了一部分模型。
有以下两种方法可以解决欠采样所带来的问题。
方法一:模型融合 (bagging的思想 )
思路:从丰富类样本中随机的选取(有放回的选取)和稀有类等量样本的数据。和稀有类样本组合成新的训练集。这样我们就产生了多个训练集,并且是互相独立的,然后训练得到多个分类器。
若是分类问题,就把多个分类器投票的结果(少数服从多数)作为分类结果。
若是回归问题,就将均值作为最后结果。
方法二:增量模型 (boosting的思想)
思路:使用全部的样本作为训练集,得到分类器L1
从L1正确分类的样本中和错误分类的样本中各抽取50%的数据,即循环的一边采样一个。此时训练样本是平衡的。训练得到的分类器作为L2.
从L1和L2分类结果中,选取结果不一致的样本作为训练集得到分类器L3.
最后投票L1,L2,L3结果得到最后的分类结果。
三、将二分类问题转换成其他问题。
可以将不平衡的二分类问题转换成异常点检测,或者一分类问题(可使用one-class svm建模)
四、改变正负类别样本在模型中的权重。
使用代价函数学习得到每个类的权值,大类的权值小,小类的权值大。刚开始,可以设置每个类别的权值与样本个数比例的倒数,然后可以使用过采样进行调优。
五、注意点:
1.不平衡问题的评价指标
准确度这个评价指标在类别不均衡的分类任务中并不能work。几个比传统的准确度更有效的评价指标:
混淆矩阵(Confusion Matrix):使用一个表格对分类器所预测的类别与其真实的类别的样本统计,分别为:TP、FN、FP与TN。
精确度(Precision)
召回率(Recall)
F1得分(F1 Score):精确度与找召回率的加权平均。
特别是:
Kappa (Cohen kappa)
ROC曲线(ROC Curves):见Assessing and Comparing Classifier Performance with ROC Curves
2.交叉验证
在K-Fold 校验中,每一份数据集中原则上应该保持类别样本比例一样或者近似,如果每份数据集中小类样本数目过少,那么应该降低K的值,知道小类样本的个数足够。