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

六、模型分析

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

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

6.1 WOE转换

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

#替换成woe函数

def replace_woe(series,cut,woe): list=[] i=0 while i=0: if value>=cut[j]: j=-1 else: j -=1 m -= 1 list.append(woe[m]) i += 1 return list

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

# 替换成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)) data.to_csv('WoeData.csv', index=False)

6.2 Logisic模型建立

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

导入数据

data = pd.read_csv('WoeData.csv')

#应变量

Y=data['SeriousDlqin2yrs']

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

X=data.drop(['SeriousDlqin2yrs','DebtRatio','MonthlyIncome', 'NumberOfOpenCreditLinesAndLoans','NumberRealEstateLoansOrLines','NumberOfDependents'],axis=1) X1=sm.add_constant(X) logit=sm.Logit(Y,X1) result=logit.fit() print(result.summary())

输出结果:

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

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

6.3 模型检验

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

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

实现代码:

#应变量

Y_test = test['SeriousDlqin2yrs']

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

X_test = test.drop(['SeriousDlqin2yrs', 'DebtRatio', 'MonthlyIncome', 'NumberOfOpenCreditLinesAndLoans','NumberRealEstateLoansOrLines', 'NumberOfDependents'], axis=1) X3 = sm.add_constant(X_test) resu = result.predict(X3)#进行预测 fpr, tpr, threshold = roc_curve(Y_test, resu) rocauc = auc(fpr, tpr)#计算AUC plt.plot(fpr, tpr, 'b', label='AUC = %0.2f' % rocauc)#生成ROC曲线 plt.legend(loc='lower right') plt.plot([0, 1], [0, 1], 'r--') plt.xlim([0, 1]) plt.ylim([0, 1]) plt.ylabel('真正率') plt.xlabel('假正率') plt.show()

输出结果:

图6-2 ROC曲线

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

七、信用评分

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

7.1 评分标准

依据以上论文资料得到:

a=log(p_good/P_bad)

Score = offset + factor * log(odds)

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

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

p = 20 / math.log(2)

q = 600 - 20 * math.log(20) / math.log(2) baseScore = round(q + p * coe[0], 0)

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

7.2 部分评分

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

#计算分数函数

def get_score(coe,woe,factor): scores=[] for w in woe: score=round(coe*w*factor,0) scores.append(score) return scores

计算各变量得分情况:

# 各项部分分数

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所示:

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

八、自动评分系统

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

#根据变量计算分数

def compute_score(series,cut,score): list = [] i = 0 while i < len(series): value = series[i] j = len(cut) - 2 m = len(cut) - 2 while j >= 0: if value >= cut[j]: j = -1 else: j -= 1 m -= 1 list.append(score[m]) i += 1 return list

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

test1 = pd.read_csv('TestData.csv')

test1['BaseScore']=Series(np.zeros(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('ScoreData.csv', index=False)

批量计算的部分分结果:

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

九、总结以及展望

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

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

参考文献

代码网盘地址

python信用评分卡_基于Python的信用评分卡模型分析(二)相关推荐

  1. python电影推荐算法_基于Python的电影推荐算法

    原标题:基于Python的电影推荐算法 第一步:收集和清洗数据 数据链接:https://grouplens.org/datasets/movielens/ 下载文件:ml-latest-small ...

  2. python人脸识别库_基于Python的face_recognition库实现人脸识别

    Python Python开发 Python语言 基于Python的face_recognition库实现人脸识别 一.face_recognition库简介 face_recognition是Pyt ...

  3. python多叉树遍历_基于Python的多叉树遍历算法

    [ 综直厘翹 S 赛理 ) 信息记录材料 2019 年 5 月第 20 卷第 5 期 基于 Python 的多叉树遍历算法 钱雨波 , 王金祥 ( 指导老师 ) ( 延边大学 吉林 延边 1 3300 ...

  4. 基于python的房地产数据分析_基于Python的数据分析实战项目

    本文中项目资料来源于网易云课堂,代码为纯手工码字滴,请放心食用,不定期更新,欢迎对Python.数据分析以及编程感兴趣的同学留言沟通. 详细介绍了数十个数据分析相关的实战项目,大量使用pandas.n ...

  5. python兼职平台信号处理_基于Python的数字信号处理初步

    作者:许欢 来源:EETOP 行者无疆(论坛usrname:ICNO.1) 的博客 Python 是目前的热门语言,一直觉得掌握一门编程语言对作为搞技术的来说还是很有必要的,结合工作中能用到的一些数据 ...

  6. python深度神经网络量化_基于Python建立深度神经网络!你学会了嘛?

    原标题:基于Python建立深度神经网络!你学会了嘛? 图1 神经网络构造的例子(符号说明:上标[l]表示与第l层:上标(i)表示第i个例子:下标i表示矢量第i项) 单层神经网络 图2 单层神经网络示 ...

  7. 用python做炒股软件-python程序源码_基于python的炒股软件

    股票模拟交易系统设计与实现 不但能够进行界面的设计,还可以实现各个窗口的关联,通过WPF实现和其余窗口的关联,而且WPF中的类不但能够和其中一个窗口进行关联,还可以跟许多功能操作接口,WPF在对窗口对 ...

  8. 用python做双人五子棋_基于python的socket实现单机五子棋到双人对战

    基于python的socket实现单机五子棋到双人对战,供大家参考,具体内容如下 本次实验使用python语言.通过socket进行不同机器见的通信,具体可以分为以下四步:1.创建ServerSock ...

  9. 用python做生物信息数据分析_基于Python的自动获取生物信息数据的软件设计

    基于 Python 的自动获取生物信息数据的软件设计 * 周斯涵,刘月兰 ** [摘 要] [摘 要] 从国际生物信息学数据库中采集数据来进行相关领域的分析, 但随着数据库规模不断扩大 , 数据来源种 ...

最新文章

  1. FreeRTOS学习笔记之信号量
  2. linux下安装glibc-2.14,解决“`GLIBC_2.14‘ not found”问题
  3. java 判断天是星期及_java判断日期是星期几的方法总结
  4. Hi3559AHi3519AHi3556A规格对比
  5. Azure 部署 Asp.NET Core Web App
  6. 如何预测未来房价的发展
  7. 星巴克人造肉产品来了,植物牛肉餐品真香?
  8. matlab蚁群算法代码,蚁群算法的matlab实现
  9. 通过增强的 Windows Forms 支持为 .NET 应用程序精心制作华丽的 UI
  10. 设计模式(外观模式)
  11. BackTrack4 官方指南
  12. 全面精通Web 2.0,做互联网潮头人
  13. 计算机sci期刊 周期短,周期短的SCI期刊有哪些
  14. 可汗学院公开课——统计学笔记Task1
  15. 锐捷(七)设备软件版本升级更新
  16. div四角边框直角、倒角、 圆角、倒圆角
  17. 网上流传“魔方文化启示录”
  18. 菜鸟的三遍读书法进阶
  19. 空间注意力机制和通道注意力机制详解
  20. LAMP--MySQL数据库

热门文章

  1. 勒索软件再次降临 教育网为什么成为重灾区
  2. java中String字符串的替换函数:replace与replaceAll的区别
  3. [汇编与C语言关系]1.函数调用
  4. Android实用笔记——使用ViewFlipper实现屏幕切换动画
  5. 判断字符串解析是JsonObject或者JsonArray
  6. 手把手教你制作easyUI+bootstrap工作站,主要学习tabs方法
  7. Oracle 11gR2 RAC OCR和votingdisk故障恢复案例
  8. 要求或禁止在堆中产生对象
  9. 4399小游戏flash插件怎么下载_Flash即将关闭,但这个小游戏平台,或许可以帮你找回4399的回忆...
  10. 【符号修改】之修改静态库内部的符号