2019-01-18修改,新增ks值的R语言实现
风控模型中计算K-S值方法:
K-S值主要验证风控模型对违约对象的区分能力,通常是在风控模型预测完全体样本的风控评分后,将全体样本按是否违约分为两部分,然后用K-S值检验两组样本的风控评分是否有显著差异
将全体样本按风控评分从低到高排序均分成十组,分别计算每组的实际好样本数、实际坏样本数、累计好样本数、累计坏样本数、累计好样本数占比(总好样本数)、累计坏样本数占比(总坏样本数)、abs(累计好样本数占比-累计坏样本数占比)
K-S值=max(abs(累计好样本数占比-累计坏样本数占比)),K-S值只能反映出哪个分段是区分最大的
全体样本被分为十等份,每份样本风控评分的最大值可视为阈值(小于阈值则预测为好样本),则累计好样本数占比为真阳性率,累计坏客户占比为假阳性率。K-S曲线的横座标是等分值,纵座标分别是TPR+FRP累计值
K-S值>0.2即可认为模型具有比较好的预测准确性,值越大表示模型的区分度越好
ks_value=function(result,pre_prob,true_label){
TPR <- NULL
FPR <- NULL
#预测概率从小到大排序
for(i in seq(from=0,to=1,by=0.1)){
#判为正类实际也为正类
TP <- sum((result$pre_prob <= i) * (result$true_label == 1))
#判为正类实际为负类
FP <- sum((result$pre_prob <= i) * (result$true_label == 0))
#判为负类实际为负类
TN <- sum((result$pre_prob > i) * (result$true_label == 0))
#判为负类实际为正类
FN <- sum((result$pre_prob > i) * (result$true_label == 1))
#真阳性率
TPR <- c(TPR,round(TP/(TP+FN),3))
#伪阳性率
FPR <- c(FPR,round(FP/(FP+TN),3))
}
max(TPR-FPR)
}