5.5 处理不均衡分类
问题描述
处理一个分类极度不均衡的目标向量。
解决方案
收集更多的数据。如果做不到,就改变评估模型的衡量标准。如果这也不起作用,可以考虑使用嵌入分类权重参数(如果有的话)的模型、下采样或上采样。评估标准会在后面的章节中介绍,现在我们先重点看一看分类权重参数、下采样和上采样。
为了方便演示,需要创建一些带有不均衡分类的数据。费雪鸢尾花数据集(Fisher's Iris dataset)包含3个均衡的分类,每个分类有50个观察值,都标注了花的种类:山鸢尾(Iris setosa)、维吉尼亚鸢尾(Iris virginia)和变色鸢尾(Iris versilocor)。为了得到不均衡的数据集,我们移除了40个山鸢尾的观察值,并将维吉尼亚鸢尾和变色鸢尾的数据合并。解决方案的目的是得到一个二元目标向量,表示一个观察值的分类是否为山鸢尾。最后显示数据中有10个观察值是山鸢尾(分类0),有100个观察值不是山鸢尾(分类1):


scikit-learn的很多算法都提供了一个参数,可以在训练时对分类进行加权,以此抵消分类数据不均衡带来的影响。虽然之前没有提及,但是RandomForestClassifier是一个流行的分类算法,它也有一个class_weight参数。这个参数可以显式地指定想要的分类权重:

还可以传入参数balanced,它会自动创建与分类的频数成反比的权重:

另外,对占多数的分类进行下采样和对占少数的分类进行上采样也是不错的方法。在下采样中,从占多数的分类(也就是拥有更多观察值的分类)无放回地随机取出观察值,创建一个观察值数量与占少数的分类相同的子集。例如,如果占少数的分类有10个观察值,那么就从占多数的分类中随机无放回地选取10个观察值,然后用这20个观察值作为数据集。下面是对于不均衡的山鸢尾花数据集所做的具体处理:

另一个选择是对占多数的分类进行上采样。在上采样中,针对占多数的分类,从占少数的分类中进行有放回的随机采样。在最后得到的结果中,占少数的分类和占多数的分类的观察值数量是相同的。上采样和下采样的实现方式相似,只是反转了一下:


讨论
在真实场景中,不均衡的分类到处可见,比如大多数访客都不会单击“购买”按钮,许多癌症也是比较罕见的。因此,处理不均衡分类就成为机器学习中的一个常见任务。
最好的解决方案是收集更多的观察值——尤其是占少数的分类的观察值。但是通常情况下,这是没法做到的,所以我们需要求助于其他手段。
次优的解决方案是选择更适用于评估不均衡数据的标准。准确率(accuracy)常常被作为评估模型性能的标准,但用准确率来评估不均衡的分类是不合适的。例如,如果样本中只有0.5%的人得了某种罕见的癌症,那么即便我们的模型预测没有人会得这个癌症,准确率也能达到99.5%。很明显,这不是我们想要的结果。后面的章节会讨论更有效的评估标准,包括混淆矩阵、精确度、召回率、F1值以及ROC曲线。
第3个解决方案是在一些分类器模型中使用分类权重参数,这样就能针对不均衡的分类来调整算法。幸运的是,很多scikit-learn的分类器都有class_weight参数,使用起来很方便。
第4和第5个解决方案是相关的:下采样和上采样。在下采样中,需要从占多数的分类中创建一个子集,其观察值数量与占少数的分类的观察值数量相等。在上采样中,采取有放回的方式对占少数的分类重复采样,以此创建与占多数的分类有相同数量观察值的数据集。到底是采用下采样还是上采样,需要根据场景做决定。通常情况下,应该同时尝试两种方法,看哪一种的效果更好。



本书评论