金融信贷风控(五)——评分卡模型的评价标准

评分卡模型的评价标准

模型的区分度

评分卡模型需要对好、坏人群给出一定的区分度。
衡量区分度的常用方法:

  1. 好、坏人群分数(或违约概率)的分布差异:KS
  2. 好、坏人群分数(或违约概率)的距离:Divergence
  3. 好、坏人群浓度的差异:Gini

KS(Kolmogorov-Smirnov)

阅读资料:
【模型 区分度】神秘的KS值和GINI系数
笔记︱风控分类模型种类(决策、排序)比较与模型评估体系(ROC/gini/KS/lift)
如何向门外汉讲解KS值
这里写图片描述
这里写图片描述
KS值越大,表示模型能够将正、负客户区分开的程度越大。
通常来讲,KS>0.2即表示模型有较好的预测准确性。

绘制方式与ROC曲线略有相同,都要计算TPR和FPR。但是TPR和FPR都要做纵轴,横轴为把样本分成多少份。
步骤:
1. 按照分类模型返回的概率降序排列
2. 把0-1之间等分N份,等分点为阈值,计算TPR、FPR
3. 对TPR、FPR描点画图即可
这里写图片描述
这里写图片描述
python代码:

### 计算KS值
def KS(df, score, target):
    '''
    :param df: 包含目标变量与预测值的数据集,dataframe
    :param score: 得分或者概率,str
    :param target: 目标变量,str
    :return: KS值
    '''
    total = df.groupby([score])[target].count()
    bad = df.groupby([score])[target].sum()
    all = pd.DataFrame({'total':total, 'bad':bad})
    all['good'] = all['total'] - all['bad']
    all[score] = all.index
    all = all.sort_values(by=score,ascending=False)
    all.index = range(len(all))
    all['badCumRate'] = all['bad'].cumsum() / all['bad'].sum()
    all['goodCumRate'] = all['good'].cumsum() / all['good'].sum()
    KS = all.apply(lambda x: x.badCumRate - x.goodCumRate, axis=1)
    return max(KS)

Divergence

好坏样本分数的“距离”指标。
Divergence越大,两类样本的距离越大,差异越大。

Divergence=(μgoodμbad)212(vargood+varbad) D i v e r g e n c e = ( μ g o o d − μ b a d ) 2 1 2 ( v a r g o o d + v a r b a d )

其中 μgood μ g o o d μbad μ b a d 为好坏样本分数(概率)的均值, vargood v a r g o o d varbad v a r b a d 为对应的方差。

Gini

这里写图片描述
这里写图片描述

模型的准确度

这里写图片描述

ROC,AUC参看之前的文章机器学习性能度量
以及详解AUC计算过程
混淆矩阵:

预测结果
真实结果正例反例
正例True PositiveFalse Negative
反例False PositiveTrue Negative

(0,1)对应将所有的正例排在负例前面:
这里写图片描述
这里写图片描述
这里写图片描述

sklearn计算auc:

import numpy as np
from sklearn.metrics import roc_curve

y = np.array([1,1,2,2])
pred = np.array([0.1,0.4,0.35,0.8])
fpr, tpr, thresholds = roc_curve(y, pred, pos_label=2)
print(fpr)
print(tpr)
print(thresholds)

from sklearn.metrics import auc
print(auc(fpr, tpr))

#绘制ROC曲线
import matplotlib.pyplot as plt
auc_score=auc(fpr,tpr)
fig,ax=plt.subplots()
ax.plot(fpr,tpr,label='AUC=%.5f'%auc_score)
ax.set_title('Receiver Operating Characteristic')
ax.plot([0, 1], [0, 1], '--', color=(0.6, 0.6, 0.6))
ax.legend()
fig.show()

模型的稳定性

  • 训练集 vs 测试集的稳定性
  • 在使用阶段的稳定性

由于模型是以特定时期的样本所开发的,此模型是否适用于开发样本之外的族群,必须经过稳定性测试才能得知。稳定度指标(population stability index ,PSI)可衡量测试样本及模型开发样本评分的的分布差异,为最常见的模型稳定度评估指针。其实PSI表示的就是按分数分档后,针对不同样本,或者不同时间的样本,population分布是否有变化,就是看各个分数区间内人数占总人数的占比是否有显著变化。公式如下:
这里写图片描述

将两类样本按相同的方式分成若干份,两组样本在各份中
公式: psi = sum((实际占比-预期占比)/ln(实际占比/预期占比))

PSI=i(RiBi)ln(Ri/Bi) P S I = ∑ i ( R i − B i ) l n ( R i / B i )

从概率到分数

评分卡最终的产出是分数,且与违约概率负相关:

Score=Base Point+PDOln(2)(y) S c o r e = Base Point + P D O l n ( 2 ) ( − y )

其中 y=logp1p=logpbadpgood y = l o g p 1 − p = l o g p b a d p g o o d
Base Point为一个基准分,
PDO(Point-to-Double Odds),好坏比每升高一倍,分数升高PDO。

证明:
好坏比升高一倍时:

y=log(2pgoodpbad)=log2logpbadpgood=log2y − y ′ = l o g ( 2 ∗ p g o o d p b a d ) = l o g 2 − l o g p b a d p g o o d = l o g 2 − y

score=BasePoint+PDOlog2(y)=BasePoint+PDOlog2(y)+PDO=score+PDO s c o r e ′ = B a s e P o i n t + P D O l o g 2 ( − y ′ ) = B a s e P o i n t + P D O l o g 2 ( − y ) + P D O = s c o r e + P D O

def Prob2Score(prob, basePoint, PDO):
    #将概率转化成分数且为正整数
    y = np.log(prob/(1-prob))
    return int(basePoint+PDO/np.log(2)*(-y))

可参看:
逻辑回归模型结果转为标准评分卡Ⅰ

  • 5
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值