目录
参考另一篇:[机器学习] 性能评估指标(精确率、召回率、ROC、AUC)
背景介绍
在模型建立之后,必须对模型的效果进行评估,因为数据挖掘是一个探索的过程,评估-优化是一个永恒的过程。在分类模型评估中,最常用的两种评估标准就是KS值和GINI, AUC值.可能有人会问了,为什么不直接看正确率呢?你可以这么想,如果一批样本中,正样本占到90%,负样本只占10%,那么我即使模型什么也不做,把样本全部判定为正,也能有90%的正确率咯?所以,用AUC值够保证你在样本不均衡的情况下也能准确评估模型的好坏,而KS值不仅能告诉你准确与否,还能告诉你模型对好坏客户是否有足够的区分度。
这里先整体给大家一个直观的介绍。
概括:
Confusion Matrix -> Lift,Gain,ROC。
ROC -> AUC,KS -> GINI。
在介绍之前,我们先重新明确一下这些图表的名称,中文、英文、简称,全部来熟悉一下:
记住这个之后,我们来理解一下他们之间的关系。
拟人化概括
其实,这些图之间的关系不是很复杂。我尝试着用一个小故事概括一下人物之间的关系。
故事是这样的:
首先,混淆矩阵是个元老,年龄最大也资历最老。创建了两个帮派,一个夫妻帮,一个阶级帮。
之后,夫妻帮里面是夫妻两个,一个Lift曲线,一个Gain曲线,两个人不分高低,共用一个横轴。
再次,阶级帮里面就比较混乱。
1. 帮主是ROC曲线。
2. 副帮主是KS曲线,AUC面积
3. AUC养了一个小弟,叫GINI系数
下图是曲线与指标的综合对比图
一 ROC曲线和AUC值
在逻辑回归、随机森林、GBDT、XGBoost这些模型中,模型训练完成之后,每个样本都会获得对应的两个概率值,一个是样本为正样本的概率,一个是样本为负样本的概率。把每个样本为正样本的概率取出来,进行排序,然后选定一个阈值,将大于这个阈值的样本判定为正样本,小于阈值的样本判定为负样本,然后可以得到两个值,一个是真正率,一个是假正率。
真正率即判定为正样本且实际为正样本的样本数/所有的正样本数,假正率为判定为正样本实际为负样本的样本数/所有的负样本数。每选定一个阈值,就能得到一对真正率和假正率,由于判定为正样本的概率值区间为[0,1],那么阈值必然在这个区间内选择,因此在此区间内不停地选择不同的阈值,重复这个过程,就能得到一系列的真正率和假正率,以这两个序列作为横纵坐标,即可得到ROC曲线了。而ROC曲线下方的面积,即为AUC值。
对于AUC值,也许有一个更直观的理解,那就是,在按照正样本概率值对所有样本排序后,任意选取一对正负样本,正样本排在负样本之前的概率值,即为AUC值。也就是说,当所有的正样本在排序后都能排在负样本之前时,就证明所有的样本都被正确分类了,此时的AUC值也会为1。那么AUC值也就很好算了,如果有N个负样本,其中正样本有M个,那么可取的所有带正样本的样本对数对于排在第一位的正样本来说,有M+N-1个,但其中包含M-1对(正,正)的样本,而对于后面所有的正样本而言,能够取到的正样本概率大于负样本对数肯定小于其位置-1。
二 KS曲线
KS曲线其实数据来源和本质和ROC曲线是一致的,只是ROC曲线是把真正率和假正率当作横纵轴,而KS曲线是把真正率和假正率都当作是纵轴,横轴则由选定的阈值来充当。
KS(Kolmogorov-Smirnov):KS用于模型风险区分能力进行评估,指标衡量的是好坏样本累计分部之间的差值。好坏样本累计差异越大,KS指标越大,那么模型的风险区分能力越强。
计算步骤
- 按照模型的结果对每个账户进行打分
- 所有账户按照评分排序,从小到大分为10组(或20组)
- 计算每个评分区间的好坏账户数。
- 计算每个评分区间的累计好账户数占总好账户数比率(good%)和累计坏账户数占总坏账户数比率(bad%)。
- 计算每个评分区间累计坏账户占比与累计好账户占比差的绝对值(累计bad%-累计good%),然后对这些绝对值取最大值即得此评分模型的K-S值。
def calc_ks(y_predproab,y_true):
'''
params:
y_predproab:预测值概率/正样本分组
y_true:真实值/正负样本标记label
return:
ks
'''
fpr,tpr,threshold = roc_curve(y_true,y_predproab)
ks = format_4(max(abs(tpr - fpr)))
return ks
下面这一段解释得更详细的KS和AUC的区别是参考的这篇博客:
https://blog.csdn.net/sinat_30316741/article/details/80018932
由于KS值能找出模型中差异最大的一个分段,因此适合用于cut_off,像评分卡这种就很适合用ks值来评估。但是ks值只能反映出哪个分段是区分最大的,而不能总体反映出所有分段的效果,因果AUC值更能胜任。
ROC值一般在0.5-1.0之间。值越大表示模型判断准确性越高,即越接近1越好。ROC=0.5表示模型的预测能力与随机结果没有差别。
KS值表示了模型将+和-区分开来的能力。值越大,模型的预测准确性越好。一般,KS>0.2即可认为模型有比较好的预测准确性。
KS值一般是很难达到0.6的,在0.2~0.6之间都不错。一般如果是如果负样本对业务影响极大,那么区分度肯定就很重要,此时K-S比AUC更合适用作模型评估,如果没什么特别的影响,那么用AUC就很好了。
区分度指标(KS)是度量具体模型下正常样本和违约样本分布的最大差距,首先按照样本的信用分数或预测违约率从小到大进行排序,然后计算每一个分数或违约率下好坏样本的累计占比。正常和违约样本的累计占比差值的最大值即为区分度指标(KS)
风控分类模型种类(决策、排序)比较与模型评估体系(ROC/gini/KS/lift)
实际上是就是你建立好模型后,按照评分从大到小排列后:检验你所谓的好客户和坏客户两类客户分布的差异性,即模型区分度。分布根据好坏两个客户评分的累积密度分布曲线,画出来的:比如好坏客户共100个,按照评分排序后前百分之十的客户即10个,其中好的客户有8个,坏的客户有2个(总体样本中好客户80个,坏客户20个),那么前10%的客户的累积密度为:好客户10%,坏客户10%。同理前20%的客户中其中好的客户有15个,坏的客户有5个那么前20%的客户的累积密度为:好客户18.75%,坏客户25%
以此类推可以得出前30%,40%。。。。100%的累积密度。以10%,20%,30%。。。100%为横坐标,以两类客户累积密度为纵坐标,即可画出KS曲线图。
三 GINI系数
Gini系数是20世纪初意大利学者科拉多·基尼根据劳伦茨曲线所定义的判断年收入分配公平程度的指标。在模型评价中,Gini统计值衡量坏账户数在好账户数上的的累积分布与随机分布曲线之间的面积,好账户与坏账户分布之间的差异越大,GINI指标越高,表明模型的风险区分能力越强。用于模型风险区分能力进行评估。
GINI统计值衡量坏账户数在好账户数上的的累积分布与随机分布曲线之间的面积,好账户与坏账户分布之间的差异越大,GINI指标越高,表明模型的风险区分能力越强。
纵坐标是tpr,在信用评分模型中就是坏用户率,横坐标是(tp+fp)/(tp+fp+tn+fn) ,总样本中预测为正例的占比。中间的对角线表示样本模型的随机分布,也可以称之为绝对公平线。
曲线(洛伦兹曲线)是使用模型的真实累积分布情况,阈值越低,预测值中正例占比越高,tpr也越大。
GINI系数的计算步骤如下:
1. 计算每个评分区间的好坏账户数。
2. 计算每个评分区间的累计好账户数占总好账户数比率(累计good%)和累计坏账户数占总坏账户数比率(累计bad%)。
3. 按照累计好账户占比和累计坏账户占比得出下图所示曲线ADC。
4. 计算出图中阴影部分面积,阴影面积占直角三角形ABC面积的百分比,即为GINI系数。
四 Lift , Gain
前三个指标应用场景更多一些
Lift曲线的衡量的是模型通过某个阈值划定预测结果的命中率,对比不用模型随机划定结果的命中率的提升度。简单来说,就是相较于不用这个模型,用了模型后,效果提升了多少。
Lift图衡量的是,与不利用模型相比,模型的预测能力“变好”了多少,lift(提升指数)越大,模型的运行效果越好。
计算公式如下:
不使用模型positive的占比:正样本占总样本的占比,作为模型的baseline。代表不使用模型,自然分类的效果。
使用后模型的占比:预测为positive的样本中分类正确的占比
作图步骤:
1. 根据学习器的预测结果(注意,是正例的概率值,非0/1变量)对样本进行排序(从大到小)-----这就是截断点依次选取的顺序
2. 按顺序选取截断点,并计算Lift和Gain ---也可以只选取n个截断点,分别在1/n,2/n,3/n等位置
例图:
Gain与Lift 相当类似。Lift chart是不同阈值下Lift和Depth(样本中预测为正例的占比,也是图中数据的百分位,data sets)的轨迹,Gain chart是不同阈值下PV+和Depth的轨迹,而PV+=lift*pi1= tp/(tp+fp),所以它们显而易见的区别就在于纵轴刻度的不同:
Gain图是描述整体精准度的指标。
五 模型稳定度指标PSI
群体稳定性指标PSI(Population Stability Index)是衡量模型的预测值与实际值偏差大小的指标。
PSI表示样本在分组后,针对不同样本或者不同时间样本,population是否发生了变化,即看各个分数区间内人数占总人数的占比是否有显著变化。
例如,在建模前,对于时间跨度大的样本,对用户分组,按照时间区间将第一个样本时间作为期望值,可衡量样本量是否稳定。
最常用的还是衡量测试样本及模型开发样本评分的的分布差异。按分数分档后,针对不同样本,或者不同时间的样本,看人数占比是否明显。
比如训练一个logistic回归模型,预测时候会有个概率输出p。测试集上的输出设定为p1吧,将它从小到大排序后10等分,如0-0.1,0.1-0.2,......。
现在用这个模型去对新的样本进行预测,预测结果叫p2,按p1的区间也划分为10等分。实际占比就是p2上在各区间的用户占比,预期占比就是p1上各区间的用户占比。
意义就是如果模型跟稳定,那么p1和p2上各区间的用户应该是相近的,占比不会变动很大,也就是预测出来的概率不会差距很大。
PSI 小于0.1时候模型稳定性很高,0.1-0.2一般,需要进一步研究,大于0.2模型稳定性差,建议修复。
PS:除了按概率值大小等距十等分外,还可以对概率排序后按数量十等分,两种方法计算得到的psi可能有所区别但数值相差不大。
计算步骤
- 统计总进件量(数据库统计),如总进件量为3400条数据
- 将总进件量按区间统计出各分区间量
- 算出各区间占比(本区间数/总进件数)
- 设定期望占比
- 计算各区间psi并最终进行求和
参考: