从Kaggle上的一个关于信用卡的高度不平衡问题来讨论不平衡问题应用方面的处理-一起大数据

从Kaggle上的一个关于信用卡的高度不平衡问题来讨论不平衡问题应用方面的处理

from http://blog.sina.com.cn/s/blog_1450ac3c60102x7lv.html

今天师兄分享了一个在kaggle上的不平衡问题https://www.kaggle.com/dalpozz/creditcardfraud

这个问题是由29维有效数据组成的信用卡数据,其中class=0的负类有284807个,而class=1的正类仅有492个,少数类占多数类比例仅0.172%,同时由于数据量达到数十万的规模,可以说这是一个较大数据且高度不平衡的问题。

之前对不平衡问题的相关研究工作比较多,从一开始的迷信采样到迷信阈值,最后再到如今的代价敏感加权,其实本来就无法说清针对不平衡问题到底哪个方法更好。但是就我个人的经验而言,样本加权重​可能是面向应用最好的处理方法。某种意义上来说,也可以认为样本层面的代价敏感是最普适的

首先要说的是,就不平衡问题而言,根据问题的形式不同,采样和代价敏感​到底哪个更好其实是要根据场景而论的。但是我为什么会认为样本加权(代价敏感)是更好的呢?原因很简单——稳定和效率。

采样是一个非常不稳定的情况,上采样容易造成过拟合就不说了,我们常用的下采样,如果在样本不平衡率很高的时候,对多数类下采样会丧失非常多的多数类信息。比如这个信用卡问题​,假设我们通过下采样来达到样本平衡(此刻采样做到了和加权接近的效果,因为样本规模相同权重相同),那么就舍弃了284807-492=284315个多数类样本,这是无疑是一个巨大的损失。另外一种下采样是尽可能保留边界样本,也称为积极学习(active learning),这本来也可以作为数据挖掘中数据压缩的一部分工作。

一种最典型的边界下采样方式

先不说是否会造成边界过拟合的情况,这种采样如果在没有预训练的情况下往往需要通过最近邻欧式距离来进行选择,这本身对大数据而言就已经out了。

但是采样算法并不是完全不好,比如在KEEL的专业不平衡数据库中,有部分样本确实采样后效果更好,但是这种场景我认为采样可能做到了去噪的工作,这点肯定是权重无法达到的,也就是说采样在提供了一个不稳定的权重的前提下又达到了类似于dropout的效果。同时,采样由于做到了样本的过滤,这种不稳定性和多样性又反而非常适合集成。多个采样的模型通过集成便往往能够达到比较好的分类效果。同时采样后数据规模下降,集成的开销也可以接受。​​

那么,让我们回到原先的问题上来吧。针对这个Kaggle上的不平衡问题,最热门的kernel是https://www.kaggle.com/joparga3/in-depth-skewed-data-classif-93-recall-acc-now​。首先要说明一点,这是一个非常非常好的开源,因为内容非常基础也非常详细,同时实现也非常简单,相当适合入门。内容相当简单,通过下采样,得到等量的多数类和少数类,然后用逻辑回归来解决这个分类问题。首先我们来统一下比较标准:

混淆矩阵

kernel中所用的recall就是我们使用的TPR=TP/(TP+FN),在它里面是得到了93%的recall,我们这里认为只有少数类准确率TPR不严谨,如果吧所有样本当做少数类TPR自然是100%,而这没有任何意义。因此我们使用MACC=(TPR+TNR)/2​作为标准。首先我们用原始的LR来跑一个baseline,得到的最优结果如下​​​

 

原始LR结果 

这里说一下,sklearn里的LR的C是在主函数损失上的,也就是C=100二范数较小的时候效果最好。TPR普遍在60%左右,TNR很高就不谈了,整体在81%左右的MACC,这可以理解,毕竟该算法不是面向不平衡的。

那么我们使用kernel中提到的下采样会怎么样呢?我们增加2个用于随机采样的函数,ratio=0的时候就是等规模下采样。​​

随机下采样LR结果

结果有了突飞猛进的进步,而且训练速度大大提升了。

如果我们使用给予样本比例的权重的话​,只需要略微修改LR的初始化函数

clf=LogisticRegression(C=param[‘C’],class_weight=’balanced’)​,得到最优结果如下

代价敏感LR结果

代价敏感的LR的结果略胜一筹(0.3%),但是这个差距很小,考虑到采样速度上的优势,多数人也许会认为这个问题上采样更好。

不可否认的是,即使这个问题不平衡率很高,但是问题本身的特征是经过PCA处理的,同时非常容易处理,导致分类的进行很容易,非集成的采样算法也能够得到理想的结果。而如果场景更加复杂,采样的稳定性就很堪忧了。此外,虽然代价敏感LR结果上MACC只是比采样LR高了0.3%,但是我们可以发现在采样中有2轮的结果的TNR都在95%~96%,虽然和代价敏感的稳定97%~98%档位只有2%的差距,但是对于多数类的信息缺失已经初现弊端。20多万的2%也是有4k之多,并且这早已超过了少数类全部的样本10倍之多。此刻我们引入一个新的评价标准F1-score:

F1-score

其中precision就是查准率(精确率)=TP/(TP+FP),举个例子,好比有个医生在诊断的时候由于很怕遗漏生病的人,然后就认为所有人都是生病的人,那么recall=100%,但是precision就会很低了。我们再来看看采样和代价敏感的f1score

下采样LR的F1
代价敏感LR的F1

由于2个算法的recall都是0.9+,但是precision都只有0.1左右,2个F1都不咋的。但是,我们可以发现代价敏感的LR显然超过了下采样的,提高有50%之多,可见下采样对多数类的“保护”做得很差。

那么集成后的下采样LR表现如何呢,我们先来做个5个集成的下采样LR​,采样分别用不同的随机种子来保证多样性

集成5次的下采样LR的F1

效果有一定的提高,但是和代价敏感的0.1224还是有一定差距,那么我们提高集成次数到10次

集成10次的下采样LR的F1

效果反而变差了,这就是之前所提到的下采样的最大弊端——不稳定。我们将集成次数提高到30次,此刻时间开销已经和代价敏感相同了,然而算法复杂度上集成下采样LR显然输了一手

集成30次的下采样LR的F1

效果仍然远不如代价敏感。我认为更多的集成次数已经没有必要了,首先是效果大可能无法再提高,其次如同FGO中给4星卡喂圣杯然后和5星卡比较一样,需要喂圣杯(依赖集成),采样算法就已经输在起跑线上了。

需要重申的是,这并不是一个批判采样算法的主题​。不可否认,在很多问题上,简单的下采样之后即可得到不错的TPR和TNR,同时时间复杂度也很低。但是我认为在面对不平衡问题的时候,不能对采样过于乐观,由于采样算法的不稳定,依赖集成且容易过拟合的先天缺陷,它们的precision往往是不容乐观的。如果在一个不平衡问题中,少数类是“帅”,多数类是“卒”,我并不想说“弃卒保帅”这种做法肯定是错误的。但是想象一下,在一个门禁安全系统前,系统为了防止陌生人的进入而总是把你当做外人排除,或者你一去医院就被告知病危,这样的世界何尝不是另一种意义的“危险”呢?

分享到:更多 ()

抢沙发

评论前必须登录!