2020-10-30
< view all posts最近在Kaggle上看到了这样一个kernel,解决的问题和我们的业务类似,也是做信用卡欺诈检测。在这个kernel的标题上注明了,它的模型可以达到95%准确率。
从这个准确率来看,模型的效果应该是很好的,所以我阅读了一下它的代码。但是发现作者对数据的处理流程是这样的:
1、因为数据不平衡,先对负样本(非欺诈的交易)进行下采样
2、之后再划分训练集和验证集
3、训练模型,95%是在验证集上得到的准确率
这里暴露了一个问题,那就是对验证集也做了下采样,导致验证集的正负样本比和真实数据出现了偏差。因为测试集是不能暴露的,验证集作为模型调参的依据,应该尽可能一致地体现测试集数据的特点。从这个角度上来说,改变验证集的正负样本比明显是有问题的。在10条交易中找1条欺诈,和在1000条交易中找1条欺诈,是难度完全不同的两个问题。改变了验证集上的样本分布,它就不能表达模型的实际效果了。
以上是从验证集的意义去讨论的,其实我们也可以很容易地证明,改变正负样本比对模型的评估指标的基线指是有影响的。因为对不平衡数据,准确率不是一个很好的指标,下面我们用更全面的F1指标来进行进行证明:
假设验证集或测试集的正样本率为r,即 p(y=1) = r ,p(y=0) = 1 - r 首先我们指定一个基线模型,这个模型以随机的概率q去预测一个样本为正。根据F1的定义,很容易计算到,对这个基线模型,有
F1 = 2rq/(r+q)
这里我们先认为r是常数,而q是变量,因为我们先要找到这个基线模型的最优参数。那么求导有:
d/dq 2rq/(r+q) = 2r^2/(r+q)^2
很显然,除了取不到q=-r这个点以外,F1的导数始终是大于0的。而1>r>0,说明F1在q>0上是单调增,在q=1时取得最大值。
这样我们就证明了,对于一个二分类问题的F1指标,在所有随机猜测的基线模型中,总是预测正样本(即1)的基线模型是最优的。并且这个最优基线 max base F1 = 2r / (r + 1)
这就解释了为什么开头的例子中,对负样本下采样后的模型指标是虚高的:假设真实数据的正样本率为0.01,那么最优基线的理论F1大约是1.98%。如果有一个模型自称能够达到60%的F1,那么我们一般会认为这是一个很有效的模型。但如果这个60%F1的数据是错误地,在对负样本做了下采样的验证或测试集上得到的,例如下采样后的正样本率是0.5,最优基线的理论F1实际应该是2*0.5/1.5 = 66.6%。
也就是说,实际这个模型的效果甚至还不如总是猜测样本为正的伪分类器的效果。但因为在错误的数据集上做验证,反而会造成一种这个模型效果很好的假象。这是一个比较极端的例子,但在实际建模中,我们之前确实有时候会在样本分布不同的验证集上相互比较模型评估指标的绝对值。其实这样的比较是有问题的,因为评估指标总是需要有参照才能比较,否则就无法排除样本的分布等等因素对指标数值的影响。
总而言之,为了真实地反映模型效果,不应该改变验证和测试集的样本分布。
参考:What is the baseline of the F1 score for a binary classifier?