评分卡模型需要对好、坏人群给出一定的区分度。
衡量区分度的常用方法:
阅读资料:
【模型 区分度】神秘的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越大,两类样本的距离越大,差异越大。
ROC,AUC参看之前的文章机器学习性能度量
以及详解AUC计算过程。
混淆矩阵:
预测结果 | ||
真实结果 | 正例 | 反例 |
正例 | True Positive | False Negative |
反例 | False Positive | True Negative |
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()
由于模型是以特定时期的样本所开发的,此模型是否适用于开发样本之外的族群,必须经过稳定性测试才能得知。稳定度指标(population stability index ,PSI)可衡量测试样本及模型开发样本评分的的分布差异,为最常见的模型稳定度评估指针。其实PSI表示的就是按分数分档后,针对不同样本,或者不同时间的样本,population分布是否有变化,就是看各个分数区间内人数占总人数的占比是否有显著变化。公式如下:
将两类样本按相同的方式分成若干份,两组样本在各份中
公式: psi = sum((实际占比-预期占比)/ln(实际占比/预期占比))
评分卡最终的产出是分数,且与违约概率负相关:
证明:
好坏比升高一倍时:
def Prob2Score(prob, basePoint, PDO):
#将概率转化成分数且为正整数
y = np.log(prob/(1-prob))
return int(basePoint+PDO/np.log(2)*(-y))
可参看:
逻辑回归模型结果转为标准评分卡Ⅰ