这篇博客主要介绍处理不平衡数据的技巧,那么什么是不平衡数据呢?比如说一位医生做了一个病例对照研究,数据集由病例10人和对照990人组成,建立好一个逻辑回归模型后,并对建立的模型进行内部验证,居然发现其正确率高达99%,然后把他兴奋坏了,觉得可以将该成果发表到顶级期刊上,从此走上人生巅峰。然而,我们可以发现,该模型不管怎么预测,都能得到正常的结果,所谓的99%的正确率,原来是建立在1000个人中10个病例都发现不了的基础上。从这个例子可以看出,当遇到不平衡数据时,以总体分类准确率为学习目标的传统分类算法会过多地关注多数类,从而使得少数类样本的分类性能下降。
<b>介绍</b><b></b>
不平衡数据广泛存在于各个领域,但在二分类问题中尤其常见,表现为其中的一个类别所占的比例远远高于另外的一个类。比如:银行欺诈检测、市场营销、网络入侵检测等领域。<b></b>
这些领域中的数据集有哪些共同点呢?可以发现在这些领域中使用的数据通常不到1%,但一旦发生就是一件“有趣”的事件(例如使用信用卡的欺诈者的违规交易,用户点击广告或原本已损坏的服务器在扫描其网络)。然而,大多数机器学习算法对于不平衡数据集都不能很好地工作。以下七种技术可以帮助我们训练分类器来检测异常类。
<b></b>

<b></b><b></b>
<b>1. 使用正确的评估指标</b><b></b>
对使用不平衡数据生成的模型应用不当的评估指标是相当危险的。想象一下,模型训练数据如上图所示,若使用精度来衡量模型的好坏,将所有测试样本分类为“0”的模型将具有很好的准确性(99.8%),但显然这种模型不会为我们提供任何有价值的信息。
在这种情况下,可以应用其他评估指标替代精度指标,例如:
准确度/特异度:有多少个选定的实例相关。
召回率/灵敏度:选择了多少个相关实例。
f1评分:准确度和召回率的调和平均数。
matthews相关系数(mcc):观察和预测的二元分类之间的相关系数。
roc曲线下的面积(auc):真阳性率与假阳性率之间的关系。
<b>2. 重新采样训练集</b><b></b>
除了使用不同的评估标准外,还可以使用不同的数据集。有两种方法使不平衡的数据集来建立一个平衡的数据集——欠采样和过采样。
<b>2.1. 欠采样</b><b></b>
欠采样是通过减少丰富类的大小来平衡数据集,当数据量足够时就该使用此方法。通过保存所有稀有类样本,并在丰富类别中随机选择与稀有类别样本相等数量的样本,可以检索平衡的新数据集以进一步建模。
<b>2.2. 过采样</b><b></b>
注意到欠采样和过采样这两种方法相比而言,都没有绝对的优势。这两种方法的应用取决于它适用的用例和数据集本身。另外将过采样和欠采样结合起来使用也是成功的。
<b>3. 以正确的方式使用k-fold交叉验证</b><b></b>
值得注意的是,使用过采样方法来解决不平衡问题时应适当地应用交叉验证。这是因为过采样会观察到罕见的样本,并根据分布函数应用自举生成新的随机数据,如果在过采样之后应用交叉验证,那么我们所做的就是将我们的模型过拟合于一个特定的人工引导结果。这就是为什么<b>在过度采样数据之前应该始终进行交叉验证</b>,就像实现特征选择一样。只有重复采样数据可以将随机性引入到数据集中,以确保不会出现过拟合问题。
k-fold交叉验证就是把原始数据随机分成k个部分,在这k个部分中选择一个作为测试数据,剩余的k-1个作为训练数据。交叉验证的过程实际上是将实验重复做k次,每次实验都从k个部分中选择一个不同的部分作为测试数据,剩余的数据作为训练数据进行实验,最后把得到的k个实验结果平均。
<b>4. 组合不同的重采样数据集</b><b></b>
成功泛化模型的最简单方法是使用更多的数据,问题是像逻辑回归或随机森林这样开箱即用的分类器,倾向于通过舍去稀有类来泛化模型。一个简单的最佳实践是建立n个模型,每个模型使用稀有类别的所有样本和丰富类别的n个不同样本。假设想要合并10个模型,那么将保留例如1000例稀有类别,并随机抽取10000例丰富类别。然后,只需将10000个案例分成10块,并训练10个不同的模型。
如果拥有大量数据,这种方法是简单并且是可横向扩展的,这是因为可以在不同的集群节点上训练和运行模型。集合模型也趋于泛化,这使得该方法易于处理。
之前的方法可以很好地将稀有类别和丰富类别之间的比例进行微调,最好的比例在很大程度上取决于所使用的数据和模型。但是,不是在整体中以相同的比例训练所有模型,所以值得尝试合并不同的比例。如果10个模型被训练,有一个模型比例为1:1(稀有:丰富)和另一个1:3甚至是2:1的模型都是有意义的。<b>一个</b><b>类别</b><b>获得的</b><b>权重依赖于</b><b>使用的模型</b>。
<b>6</b><b>. 集群丰富</b><b>类</b><b></b>
<b>7. 设计自己的</b><b>模型</b><b></b>
所有之前的方法都集中在数据上,并将模型保持为固定的组件。但事实上,如果设计的模型适用于不平衡数据,则不需要重新采样数据,著名的xgboost已经是一个很好的起点,因此设计一个适用于不平衡数据集的模型也是很有意义的。
通过设计一个代价函数来惩罚稀有类别的错误分类而不是分类丰富类别,可以设计出许多自然泛化为稀有类别的模型。例如,调整svm以惩罚稀有类别的错误分类。
<b>结束语</b><b></b>
本文不是一个排外的技术列表,而是处理不平衡数据的一些建议。没有适合所有问题的最佳方法或模型,强烈建议尝试不同的技术和模型来评估哪些方法最有效并尝试创造性地结合不同的方法。同样值得注意的是,在不平衡类别发生的许多领域中,随着“市场规则”的不断变化,<b>需要</b><b>检查过去的数据是否过时</b>。
<b>推荐阅读</b><b></b>
<a href="http://www.kdnuggets.com/2016/08/learning-from-imbalanced-classes.html">从不平衡类中学习</a>
<a href="http://www.kdnuggets.com/2016/04/unbalanced-classes-svm-random-forests-python.html">使用python处理不平衡类、svm、随机森林和决策树</a>
<a href="http://www.kdnuggets.com/2017/01/tidying-data-python.html">使用python整理数据</a>
<b>作者信息</b>
文章原标题《7 techniques to handle imbalanced data》,作者:ye wu, rick radewagen,译者:海棠,审阅:6816816151
附件为原文的pdf