python 评分模型 python模型得分_信用评分

上一篇文章《基于Python的信用评分卡模型分析(一)》已经介绍了信用评分卡模型的数据预处理、探索性数据分析、变量分箱和变量选择等。接下来我们将继续讨论信用评分卡的模型实现和分析,信用评分的方法和自动评分系统。

六、模型分析

证据权重(Weight of Evidence,WOE)转换可以将Logistic回归模型转变为标准评分卡格式。引入WOE转换的目的并不是为了提高模型质量,只是一些变量不应该被纳入模型,这或者是因为它们不能增加模型值,或者是因为与其模型相关系数有关的误差较大,其实建立标准信用评分卡也可以不采用WOE转换。这种情况下,Logistic回归模型需要处理更大数量的自变量。尽管这样会增加建模程序的复杂性,但最终得到的评分卡都是一样的。

在建立模型之前,我们需要将筛选后的变量转换为WoE值,便于信用评分。

6.1 WOE转换

我们已经能获取了每个变量的分箱数据和woe数据,只需要根据各变量数据进行替换,实现代码如下:

#替换成woe函数

defreplace_woe(series,cut,woe):

list=[]

i= 0

whilei<len(series):

value=series[i]

j=len(cut) -2

m=len(cut) -2

whilej>= 0:

ifvalue>=cut[j]:

j= -1

else:

j -= 1

m -= 1

list.append(woe[m])

i += 1

returnlist

我们将每个变量都进行替换,并将其保存到文件中:

# 替换成woe

data[ 'RevolvingUtilizationOfUnsecuredLines'] = Series(replace_woe(data[ 'RevolvingUtilizationOfUnsecuredLines'], cutx1, woex1))

data[ 'age'] = Series(replace_woe(data[ 'age'], cutx2, woex2))

data[ 'NumberOfTime30-59DaysPastDueNotWorse'] = Series(replace_woe(data[ 'NumberOfTime30-59DaysPastDueNotWorse'], cutx3, woex3))

data[ 'DebtRatio'] = Series(replace_woe(data[ 'DebtRatio'], cutx4, woex4))

data[ 'MonthlyIncome'] = Series(replace_woe(data[ 'MonthlyIncome'], cutx5, woex5))

data[ 'NumberOfOpenCreditLinesAndLoans'] = Series(replace_woe(data[ 'NumberOfOpenCreditLinesAndLoans'], cutx6, woex6))

data[ 'NumberOfTimes90DaysLate'] = Series(replace_woe(data[ 'NumberOfTimes90DaysLate'], cutx7, woex7))

data[ 'NumberRealEstateLoansOrLines'] = Series(replace_woe(data[ 'NumberRealEstateLoansOrLines'], cutx8, woex8))

data[ 'NumberOfTime60-89DaysPastDueNotWorse'] = Series(replace_woe(data[ 'NumberOfTime60-89DaysPastDueNotWorse'], cutx9, woex9))

data[ 'NumberOfDependents'] = Series(replace_woe(data[ 'NumberOfDependents'], cutx10, woex10))

( '', index= False)

6.2 Logisic模型建立

我们直接调用statsmodels包来实现逻辑回归:

导入数据

data = ( '')

#应变量

Y=data[ 'SeriousDlqin2yrs']

#自变量,剔除对因变量影响不明显的变量

X=([ 'SeriousDlqin2yrs', 'DebtRatio', 'MonthlyIncome', 'NumberOfOpenCreditLinesAndLoans', 'NumberRealEstateLoansOrLines', 'NumberOfDependents'],axis= 1)

X1=(X)

logit=(Y,X1)

result=logit.fit

print()

输出结果:

python 评分模型 python模型得分_python 评分模型_02

图6-1 逻辑回归模型结果.png

通过图6-1可知,逻辑回归各变量都已通过显著性检验,满足要求。

模型检验

到这里,我们的建模部分基本结束了。我们需要验证一下模型的预测能力如何。我们使用在建模开始阶段预留的test数据进行检验。通过ROC曲线和AUC来评估模型的拟合能力。

在Python中,可以利用,它能方便比较两个分类器,自动计算ROC和AUC。

实现代码:

#应变量

Y_test = test[ 'SeriousDlqin2yrs']

#自变量,剔除对因变量影响不明显的变量,与模型变量对应

X_test = ([ 'SeriousDlqin2yrs', 'DebtRatio', 'MonthlyIncome', 'NumberOfOpenCreditLinesAndLoans', 'NumberRealEstateLoansOrLines', 'NumberOfDependents'], axis= 1)

X3 = (X_test)

resu = (X3) #进行预测

fpr, tpr, threshold = roc_curve(Y_test, resu)

rocauc = auc(fpr, tpr) #计算AUC

(fpr, tpr, 'b', label= 'AUC = %'% rocauc) #生成ROC曲线

(loc= 'lower right')

([ 0, 1], [ 0, 1], 'r--')

([ 0, 1])

([ 0, 1])

( '真正率')

( '假正率')

输出结果:

python 评分模型 python模型得分_信用评分_03

图6-2 ROC曲线

从上图可知,AUC值为,说明该模型的预测效果还是不错的,正确率较高。

七、信用评分

我们已经基本完成了建模相关的工作,并用ROC曲线验证了模型的预测能力。接下来的步骤,就是将Logistic模型转换为标准评分卡的形式。

评分标准

python 评分模型 python模型得分_python 评分模型_04

python 评分模型 python模型得分_信用评分_05

依据以上论文资料得到:

a=log(p_good/P_bad)

Score = offset + factor * log(odds)

在建立标准评分卡之前,我们需要选取几个评分卡参数:基础分值、 PDO(比率翻倍的分值)和好坏比。这里, 我们取600分为基础分值,PDO为20 (每高20分好坏比翻一倍),好坏比取20。

# 我们取600分为基础分值,PDO为20(每高20分好坏比翻一倍),好坏比取20。

p = 20/ ( 2)

q = 600- 20* ( 20) / ( 2)

baseScore = round(q + p * coe[ 0], 0)

个人总评分=基础分+各部分得分

部分评分

下面计算各变量部分的分数。各部分得分函数:

#计算分数函数

defget_score(coe,woe,factor):

scores=[]

forw inwoe:

score=round(coe*w*factor, 0)

(score)

returnscores

计算各变量得分情况:

# 各项部分分数

x1 = get_score(coe[ 1], woex1, p)

x2 = get_score(coe[ 2], woex2, p)

x3 = get_score(coe[ 3], woex3, p)

x7 = get_score(coe[ 4], woex7, p)

x9 = get_score(coe[ 5], woex9, p)

我们可以得到各部分的评分卡如图7-1所示:

python 评分模型 python模型得分_python 评分模型_06

图7-1 各变量的评分标准

八、自动评分系统

根据变量来计算分数,实现如下:

#根据变量计算分数

defcompute_score(series,cut,score):

list = []

i = 0

whilei < len(series):

value = series[i]

j = len(cut) - 2

m = len(cut) - 2

whilej >= 0:

ifvalue >= cut[j]:

j = -1

else:

j -= 1

m -= 1

list.append(score[m])

i += 1

returnlist

我们来计算test里面的分数:

test1 = ( '')

test1[ 'BaseScore']=Series((len(test1)))+baseScore

test1[ 'x1'] = Series(compute_score(test1[ 'RevolvingUtilizationOfUnsecuredLines'], cutx1, x1))

test1[ 'x2'] = Series(compute_score(test1[ 'age'], cutx2, x2))

test1[ 'x3'] = Series(compute_score(test1[ 'NumberOfTime30-59DaysPastDueNotWorse'], cutx3, x3))

test1[ 'x7'] = Series(compute_score(test1[ 'NumberOfTimes90DaysLate'], cutx7, x7))

test1[ 'x9'] = Series(compute_score(test1[ 'NumberOfTime60-89DaysPastDueNotWorse'], cutx9, x9))

test1[ 'Score'] = test1[ 'x1'] + test1[ 'x2'] + test1[ 'x3'] + test1[ 'x7'] +test1[ 'x9'] + baseScore

test1.to_csv( '', index= False)

批量计算的部分分结果:

python 评分模型 python模型得分_信用评分_07

图8-1 批量计算的部分结果

九、总结以及展望

本文通过对kaggle上的Give Me Some Credit数据的挖掘分析,结合信用评分卡的建立原理,从数据的预处理、变量选择、建模分析到创建信用评分,创建了一个简单的信用评分系统。

基于AI 的机器学习评分卡系统可通过把旧数据(某个时间点后,例如2年)剔除掉后再进行自动建模、模型评估、并不断优化特征变量,使得系统更加强大。