python信用评分卡_基于Python的信用评分卡模型分析(二)
上一篇文章基于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的信用评分卡模型分析(二)相关推荐
- python电影推荐算法_基于Python的电影推荐算法
原标题:基于Python的电影推荐算法 第一步:收集和清洗数据 数据链接:https://grouplens.org/datasets/movielens/ 下载文件:ml-latest-small ...
- python人脸识别库_基于Python的face_recognition库实现人脸识别
Python Python开发 Python语言 基于Python的face_recognition库实现人脸识别 一.face_recognition库简介 face_recognition是Pyt ...
- python多叉树遍历_基于Python的多叉树遍历算法
[ 综直厘翹 S 赛理 ) 信息记录材料 2019 年 5 月第 20 卷第 5 期 基于 Python 的多叉树遍历算法 钱雨波 , 王金祥 ( 指导老师 ) ( 延边大学 吉林 延边 1 3300 ...
- 基于python的房地产数据分析_基于Python的数据分析实战项目
本文中项目资料来源于网易云课堂,代码为纯手工码字滴,请放心食用,不定期更新,欢迎对Python.数据分析以及编程感兴趣的同学留言沟通. 详细介绍了数十个数据分析相关的实战项目,大量使用pandas.n ...
- python兼职平台信号处理_基于Python的数字信号处理初步
作者:许欢 来源:EETOP 行者无疆(论坛usrname:ICNO.1) 的博客 Python 是目前的热门语言,一直觉得掌握一门编程语言对作为搞技术的来说还是很有必要的,结合工作中能用到的一些数据 ...
- python深度神经网络量化_基于Python建立深度神经网络!你学会了嘛?
原标题:基于Python建立深度神经网络!你学会了嘛? 图1 神经网络构造的例子(符号说明:上标[l]表示与第l层:上标(i)表示第i个例子:下标i表示矢量第i项) 单层神经网络 图2 单层神经网络示 ...
- 用python做炒股软件-python程序源码_基于python的炒股软件
股票模拟交易系统设计与实现 不但能够进行界面的设计,还可以实现各个窗口的关联,通过WPF实现和其余窗口的关联,而且WPF中的类不但能够和其中一个窗口进行关联,还可以跟许多功能操作接口,WPF在对窗口对 ...
- 用python做双人五子棋_基于python的socket实现单机五子棋到双人对战
基于python的socket实现单机五子棋到双人对战,供大家参考,具体内容如下 本次实验使用python语言.通过socket进行不同机器见的通信,具体可以分为以下四步:1.创建ServerSock ...
- 用python做生物信息数据分析_基于Python的自动获取生物信息数据的软件设计
基于 Python 的自动获取生物信息数据的软件设计 * 周斯涵,刘月兰 ** [摘 要] [摘 要] 从国际生物信息学数据库中采集数据来进行相关领域的分析, 但随着数据库规模不断扩大 , 数据来源种 ...
最新文章
- FreeRTOS学习笔记之信号量
- linux下安装glibc-2.14,解决“`GLIBC_2.14‘ not found”问题
- java 判断天是星期及_java判断日期是星期几的方法总结
- Hi3559AHi3519AHi3556A规格对比
- Azure 部署 Asp.NET Core Web App
- 如何预测未来房价的发展
- 星巴克人造肉产品来了,植物牛肉餐品真香?
- matlab蚁群算法代码,蚁群算法的matlab实现
- 通过增强的 Windows Forms 支持为 .NET 应用程序精心制作华丽的 UI
- 设计模式(外观模式)
- BackTrack4 官方指南
- 全面精通Web 2.0,做互联网潮头人
- 计算机sci期刊 周期短,周期短的SCI期刊有哪些
- 可汗学院公开课——统计学笔记Task1
- 锐捷(七)设备软件版本升级更新
- div四角边框直角、倒角、 圆角、倒圆角
- 网上流传“魔方文化启示录”
- 菜鸟的三遍读书法进阶
- 空间注意力机制和通道注意力机制详解
- LAMP--MySQL数据库
热门文章
- 勒索软件再次降临 教育网为什么成为重灾区
- java中String字符串的替换函数:replace与replaceAll的区别
- [汇编与C语言关系]1.函数调用
- Android实用笔记——使用ViewFlipper实现屏幕切换动画
- 判断字符串解析是JsonObject或者JsonArray
- 手把手教你制作easyUI+bootstrap工作站,主要学习tabs方法
- Oracle 11gR2 RAC OCR和votingdisk故障恢复案例
- 要求或禁止在堆中产生对象
- 4399小游戏flash插件怎么下载_Flash即将关闭,但这个小游戏平台,或许可以帮你找回4399的回忆...
- 【符号修改】之修改静态库内部的符号