基于R语言的申请评分卡

Python014

基于R语言的申请评分卡,第1张

信贷行业中常见的评分卡包括:申请评分卡(Application)、行为评分卡(Behavior)、催收评分卡(Collection)以及反欺诈评分卡(Anti-Fraud),简称为A卡、B卡、C卡和F卡。

A卡,主要应用于贷前准入环节对新用户的信用评级。

B卡,主要应用于贷中管理环节对存量用户的行为预测。

C卡,主要应用于贷后催收环节对存量用户是否催收的预测管理。

F卡,主要应用于贷前准入环节对新用户可能存在的欺诈行为进行预测。

本文通过历史数据建立Logistic回归模型,预测用户出现违约的概率,从而建立申请评分卡模型。

本文数据来自“klaR”包中的German credit data。

加载要用到的数据,并进行初步数据观察:

该数据集包含了1000个样本,每个样本包括21个变量,变量含义如下:

数据清洗主要工作包括缺失值和异常值处理。

查看缺失值情况:

从以上结果可看出,本数据集不存在缺失值。

查看定量指标异常值情况:

从图2可以看出,定量指标中存在异常值。下面,让我们具体来看一下:

根据具体情况来看,定量指标中存在的异常值是基本符合实际情况的,而且数据集样本数量较少,因此不对异常值做处理。(本例比较特殊,实际工作中的情况肯定会比较复杂)

本数据集包含了定量和定性两类指标,接下来我们用不同的方法,筛选出对违约状态影响最大的指标,作为构建模型的变量。

首先,根据简单随机抽样,将数据集划分为训练集和测试集:

以下用随机森林法和Logistic回归方法,寻找对因变量影响最显著的自变量:

综合以上两种方法的结果,我们筛选出了对违约状态影响最显著的四个指标 :duration(3)、age(3)、amount(2)和installment_rate(2)。

通过R中的informationvalue包,计算各指标的IV值,得到各定性指标间的重要性度量,选取其中的high predictive指标:

根据以上结果,我们选择status、credit_history、savings和purpose四个high predictive指标构建模型。

综上,我们共选择了8个变量作为入模变量。

计算定量指标的WOE之前,需要先对定量指标进行分段。下面,优先采用最优分段,其原理是基于条件推理树(conditional inference trees, Ctree)的递归分割算法,核心算法用函数ctree()表示。

从上图可以看出,woe值相差较大,分段效果不错。以下针对amount、age采用相同分段方法。

installment_rate只有1、2、3、4四个值,四个值对应的woe值差别较大,且具有单调性,采用等距分段。

接下来我们需要对定性指标做必要的降维处理,方便计算其WOE值。首先,我们查看一下入模的定性指标的概况:

由以上概况可知,定性指标status、credit_history、和savings的维数最高为5维,最低为4维,维数适中,可以不进行处理。

定性指标purpose的维数多于7维,明显高于其他定性指标。为了避免“维数灾难”,我们根据三条准则进行降维:1.维度间属性相似;2.合并后woe有明显变化;3.单个维度样本量不应过小。

用klaR包中的woe()函数获取入模变量的woe值。

至此,我们已经获得了入模变量对应的woe值。值的注意的是,我们之前将好客户设定为0,坏客户设定为1,所以woe值越大,代表客户违约的概率越大,但traindata中的woe实际是按照好客户为1,坏客户为0计算的,所以与之前变量分箱中计算的woe正好相反。

下面正式开始构建模型,并转换为标准评分卡。

从以上逻辑回归的结果来看,各个变量都通过了显著性检验。同时,为防止多重共线性问题的出现,我们对模型进行VIF检验:

从结果可知,所有变量VIF均小于4,可以判断模型中不存在多重共线性问题。

根据 信用评分卡模型的建立 ,我们可以得到:

获取基础分以及训练集中各变量的分数:

输出CSV格式的标准评分卡:

对测试集中的样本做同样的降维处理:

从以上结果可知,模型准确率ACC为0.77,AUC为0.805,Gini系数为0.61,整体效果尚可。

本文通过对Germancredit数据的挖掘分析,从数据清洗、变量筛选、WOE计算、建模分析到模型验证,创建了一个简单的申请评分卡。

本文用到的数据集比较简单,在实操中,数据清洗应该会占用更多时间和精力。

本文仅进行了一次样本抽样,在实操中,应进行K折交叉检验,提升模型准确度。

开发的模型是基于某一时间的特定样本的,随着时间的推移和信贷政策的变化,样本会发生变化,从而造成模型的区分能力和稳定性变差。一般需要定期对模型的使用情况进行检测并报告模型区分能力和稳定性的变化情况,必要时应采取包括修正模型或重建模型等措施。这是后面需要认真学习的地方!

信用标准评分卡模型开发及实现

信用评分卡模型的建立

https://blog.csdn.net/kevin7658/article/details/50780391

IV 与 WOE:

IV表示一个变量的预测能力:

<=0.02,没有预测能力,不可用

0.02~0.1 弱预测性

0.1~0.2 有一定预测能力

0.2+高预测性

 IV还可以用来挑选变量,IV就越大,它就越应该进入到入模变量列表中。

Psi

def calculate_psi(expected, actual, buckets=10): # test, base

   def psi(expected_array, actual_array, buckets):

       def scale_range(input, min, max):

           input += -(np.min(input))

           input /= np.max(input) / (max - min)

           input += min

           return input

       # 按照概率值分10段

       breakpoints = np.arange(0, buckets + 1) / (buckets) * 100

       breakpoints = scale_range(breakpoints, np.min(expected_array), np.max(expected_array))

       expected_percents = np.histogram(expected_array, breakpoints)[0] / len(expected_array)

       # print(expected_percents)

       actual_percents = np.histogram(actual_array, breakpoints)[0] / len(actual_array)

       def sub_psi(test, base): # test,base

           if base == 0:

 base = 0.0001

           if test == 0:

 test = 0.0001

           value = (test - base) * np.log(test / base)

           return(value)

       psi_value = np.sum(sub_psi(expected_percents[i], actual_percents[i]) for i in range(0, len(expected_percents)))

       return(psi_value)

   if len(expected.shape) == 1:

       psi_values = np.empty(len(expected.shape))

   else:

       psi_values = np.empty(expected.shape[0])

   for i in range(0, len(psi_values)):

       if len(psi_values) == 1:

           psi_values = psi(expected, actual, buckets)

       else:

           psi_values[i] = psi(expected[:,i], actual[:,i], buckets)

   return(psi_values)

WOE的全称是“Weight of Evidence”,即证据权重。WOE是对原始自变量的一种编码形式。

要对一个变量进行WOE编码,需要首先把这个变量进行分组处理(也叫离散化、分箱等等,说的都是一个意思)。分组后,对于第i组,WOE的计算公式如下:

IV的全称是Information Value,中文意思是信息价值,或者信息量。

从直观逻辑上大体可以这样理解“用IV去衡量变量预测能力”这件事情:我们假设在一个分类问题中,目标变量的类别有两类:Y1,Y2。对于一个待预测的个体A,要判断A属于Y1还是Y2,我们是需要一定的信息的,假设这个信息总量是I,而这些所需要的信息,就蕴含在所有的自变量C1,C2,C3,……,Cn中,那么,对于其中的一个变量Ci来说,其蕴含的信息越多,那么它对于判断A属于Y1还是Y2的贡献就越大,Ci的信息价值就越大,Ci的IV就越大,它就越应该进入到入模变量列表中。

一个变量的IV值即是各个分组IV值之和

群体稳定性指标(population stability index),用于衡量某个变量的稳定性或者模型整体的稳定性。

psi = sum((实际占比-预期占比)* ln(实际占比/预期占比))

训练一个logistic回归模型,预测时候会有个概率输出p。你测试集上的输出设定为p1吧,将它从小到大排序后10等分,如0-0.1,0.1-0.2,......。

现在你用这个模型去对新的样本进行预测,预测结果叫p2,按p1的区间也划分为10等分。

实际占比就是p2上在各区间的用户占比,预期占比就是p1上各区间的用户占比。

意义就是如果模型跟稳定,那么p1和p2上各区间的用户应该是相近的,占比不会变动很大,也就是预测出来的概率不会差距很大。

一般认为psi小于0.1时候模型稳定性很高,0.1-0.25一般,大于0.25模型稳定性差,建议重做。

而在评分卡项目中略有不同:(1)可以用于衡量某个变量的稳定性,按变量原本分组得到的各组样本个数占比,与模型上线之后得到的数据中分组得到的各组样本个数占比进行比较。(2)在评分卡模型中,模型PSI计算中,分组是按照评分高低排序,而后分为十等分,而后进行计算。