一、目录

  1. 样本概述和说明

    1. 数据源
    2. 目标变量的定义
    3. 样本统计
    4. 数据可视化
  2. 特征工程
    1. 缺失值处理
    2. 同值化处理
    3. 业务相关性
    4. IV值筛选变量
    5. 皮尔森系数
  3. 最优分箱
    1. 等距分箱
    2. 卡方分箱
  4. 模型评估
    1. 准确率
    2. 召回率
    3. ROC曲线
    4. KS值
  5. 评分卡
  6. 模型结果

二、样本概述和说明

1.数据源
本文的数据源从Lending Club官方网站下载
开发数据集:2017.01-2017.06
验证数据集:2017.07-2017.09

选取的开发数据集共计202234条数据,变量总数为145个,验证数据集共计122703条数据,变量总数为145个。其145个变量的部分解释如下:



2. 目标变量的定义
在释义中,绿色标注的就是目标变量,为了方便将其变量名标注为y,其变量名和统计个数如下:

根据业务场景对其进行定义,一般逾期超过30天以上的客户定义为信用较差的客户,对于一些客户无法直接定义其信用的优劣,则将这部分不确定的客户,定义为信用中等的客户,具体的定义如下:

#定义新函数 , 给出目标Y值
def coding(col, codeDict):colCoded = pd.Series(col, copy=True)for key, value in codeDict.items():colCoded.replace(key, value, inplace=True)return colCoded
codeDict = {'Current':0,'Fully Paid':0,'Late (31-120 days)':1,'Charged Off':1,'Late (16-30 days)':2,'In Grace     Period':2,'Default':2}

3. 样本统计

表现窗口:在时间轴上从观察点向后推得的表现窗口,用来提取目标变量和进行表现排除。
观察窗口:从观察点向前推一段时间得到观察窗口,用来提取自变量信息和进行观察窗口排除,观察窗口一般长度通常为6-12个月。



可以看出其特征值数量过大,需要进行有效的筛选,而且其坏样本的占比比较低,仅6-7%,在后续的处理中需要做不平衡样本处理。
4. 数据可视化
数据可视化可以比较直观的观察数据,对数据有一个整体的了解,在开发样本中,风险评估(grade)处于B和C的比较多,换言之,申请贷款的人风险评估大多数处于中等偏上。

工作年限大于十年的提交贷款申请的人数远超过其他工年年限的申请人数。

数据基本符合正太分布:

三、特征工程

针对特征值比较多的数据,需要筛选特征值,其常用的方法如下:

  • 缺失值比率:根据缺失率大小来决定是否删除该特征值,一般来说包含太多的缺失值的数据包含有用的信息可能性很小。
  • 同值化处理:根据特征值的取值的一致程度来决定是否删除该特征值,一般来说如果特征值包含的数值大部分为同一值时,则其有用的信息可能性很小。
  • 高相关过滤:主要是指对于两列数据变化趋势相似,包含的信息相似的情况下,只需要保留其中一列即可。
  • 组合算法降维:主要是利用机器学习的方法,如随机森铃等,通过算法找出信息量较高的特征值。
    1. 缺失值处理
    对于处理值处理,方法有很多,常用的方法如下:
  • 对于缺失值占比比较高的,直接舍弃
  • 利用数值0,均值,中位数,众数等方法填充
  • 用上下数据进行填充
  • 利用机器学习算法拟合和预测缺失值

在这里首先对目标变量缺失的4行进行删除,再进行缺失值统计,并针对缺失值超多90%的特征值进行删除,其中针对缺失值比较少的如il_util(13%)用数值0进行填充,变量数由145个变为102个


2.同值化处理
对于变量的同值性过高时,其包含的有用信息可能性很小,所以针对这类特征值进行同值化处理,根据业务情况,其阈值定义为93%,变量数由102个变为85个

3.业务相关性
从业务角度出发删除一些不相关的信息,这样不但可以减少特征值,还可以有效地保护客户的信息,如贷款后的信息(如last_credit_pull_d),不必要的个人信息(如),高度重复信息(sub_grade,风险评估细分),变量数由85个变为62个。

# next_pymnt_d : 客户下一个还款时间
# emp_title :数据分类太多,实用性不大
# last_pymnt_d :最后一个还款日期
# zip_code :邮政编码前三位
# last_credit_pull_d :最近一个贷款的时间
# sub_grade : 与grade重复,分类太多
# title: title与purpose的信息基本重复
# issue_d : 放款时间,申请模型用不上
# earliest_cr_line : 贷款客户第一笔借款日期
# total_rec_prncp : 已还本金
# total_rec_int :   已还利息
df5 = df4.drop(['emp_title','last_credit_pull_d','sub_grade','title','issue_d','earliest_cr_line','funded_amnt_inv','next_pymnt_d','last_pymnt_amnt','last_pymnt_d','total_rec_prncp', 'out_prncp','out_prncp_inv','total_pymnt','total_pymnt_inv','installment','bc_open_to_buy','percent_bc_gt_75','tot_hi_cred_lim','mths_since_recent_inq','total_bc_limit','zip_code','addr_state'], axis = 1)

4.IV值筛选变量
WOE的全称是“Weight of Evidence”,即证据权重。WOE是对原始自变量的一种编码形式。而要对一个变量进行WOE编码,需要首先把这个变量进行分箱。

P_good 是特征所在分段内的好样本数量占所有好样本(全部数据中)数量的比例,而 P_bad同理。
woe的含义类似于信息熵,同时很重要的一点是它对数据进行了归一化处理,也就是将所有不同特征划在了统一的尺度上。

IV值是Information Values的简称,他是衡量某一特征数据中的信息量的度量单位,如果信息含量足够大,则表示其为有价值的特征。

IV值的预测能力如下:
IV : < 0.02 : 无预测能力
IV :0.02-0.10 : 预测能力弱
IV :0.10-0.30 : 预测能力中
IV : >0.30 : 预测能力强
首先利用数据字典将目前62个变量中的object数据类型的变量转换为数字变量,再采用等距分箱对特征值进行处理。

mapping_dict = {"grade":{"A": 0,"B": 1,"C": 2, "D": 3, "E": 4,"F": 5,"G": 6},"initial_list_status": {"w": 0,"f": 1,},"emp_length": {"10+ years": 11,"9 years": 10,"8 years": 9,"7 years": 8,"6 years": 7,"5 years": 6,"4 years":5,"3 years": 4,"2 years": 3,"1 year": 2,"< 1 year": 1,"n/a": 0},"verification_status":{"Not Verified":0,"Source Verified":1,"Verified":2},"purpose":{"credit_card":0,"home_improvement":1,"debt_consolidation":2,       "other":3,"major_purchase":4,"medical":5,"small_business":6,"car":7,"vacation":8,"moving":9, "house":10, "renewable_energy":11,"wedding":12},"home_ownership":{"MORTGAGE":0,"ANY":1,"NONE":2,"OWN":3,"RENT":4}}
df6 = df5.replace(mapping_dict)

计算其WOE值和IV值,并删掉IV<0.02的变量,变量由62个变为29个

def filter_iv(data, group=10):iv_value,all_iv_detail = cal_iv(data, group=group)##利用IV值,先删除掉IV值<0.02的特征'''IV值小于0.02,变量的预测能力太弱'''list_value = iv_value[iv_value.ori_IV <= 0.02].var_namefilter_data = iv_value[['var_name','ori_IV']].drop_duplicates()print(filter_data)new_list = list(set(list_value))print('小于0.02的变量有:',len(new_list))print(new_list)#new_list.sort(key = list_value.index)   drop_list = new_listnew_data = data.drop(drop_list, axis = 1)return new_data, iv_value

5.皮尔森系数
对皮尔森系数绘图,观察多重共性的变量,对其进行分析,保留相关性低于阈值0.6的变量,保证其系数都是独立不相关的。

通过用随机森林进行拟合,得出特征的权重,比较保留下了变量,其对照表如下:

四、最优分箱

分箱的方法主要包括等距分箱,等频分箱,最优分箱等,其优势在于:

1.离散特征的增加和减少都很容易,易于模型的快速迭代;
2.稀疏向量内积乘法运算速度快,计算结果方便存储,容易扩展;
3.离散化后的特征对异常数据有很强的鲁棒性;
4.离散化后可以进行特征交叉,由M+N个变量变为M*N个变量,进一步引入非线性,提升表达能力;
5.特征离散化以后,起到了简化了逻辑回归模型的作用,降低了模型过拟合的风险。

这里主要采用的是常规的等距分箱和评分卡中常用的卡方分箱,通过投票的方式得到最优的分箱结果:

五、模型评估

因为在统计样本的时候提到,该数据的坏样本占比为6-7%,数据属于不平衡样本,所以训练模型要对样本进行处理。对于不平衡样本的处理方法有很多,比如:

  • 欠采样(从好样本里面随机抽取与坏样本同样多的数据进行模型拟合,但是抛弃了大数据好样本的数据,可能会造成较大的偏差)
  • 过采样(将坏样本反复抽取并生成与好样本同样多的数据进行模型拟合,只是单纯的重复了正例,可能会过拟合)
  • SMOTE算法(本质是过采样,通过在局部区域进行K-近邻生成了新的坏样本,可以理解为是一种集成学习,但是也可能会过拟合)
    这里主要采用的是SMOTE算法对样本进行预处理后,导入到逻辑回归模型中,并对模型进行评估,其KS值为24.37%,对于评分卡而言,结果尚可。
precision    recall  f1-score   support0.0       0.65      0.63      0.64    1846901.0       0.64      0.66      0.65    184690avg / total       0.65      0.65      0.65 The confusion_matrix is:[[117264  67426][ 63159 121531]]accuracy_score 0.646475174617
precision_score 0.643167493133
recall_score 0.658026964102
ROC_AUC is 0.706879521886


同时也需要查看模型对标签的区分度,也就是K-S曲线:

KS需要TPR和FPR两个值:真正类率(true positive rate ,TPR), 计算公式为TPR=TP/ (TP+ FN),刻画的是分类器所识别出的 正实例占所有正实例的比例。另外一个是假正类率(false positive rate, FPR),计算公式为FPR= FP / (FP + TN),计算的是分类器错认为正类的负实例占所有负实例的比例。KS=max(TPR-FPR)。其中:
TP:真实为1且预测为1的数目
FN:真实为1且预测为0的数目
FP:真实为0的且预测为1的数目
TN:真实为0的且预测为0的数目

K-S score 0.24373544859

六、评分卡

评分卡设定的分值刻度可以通过将分值表示为好坏比率(或者说是概率)的对数线性表达式来定义:


对于信用评分的计算方法如下:

根据以上概念,这里我们需要提前设置初始变量,也就是Score以及对应的odds,这里假设初始分值为600分,对应好坏比率为20,好坏比率每翻一番,其分值增加20分,即:

通过代入WOE值,得到评分卡

七、模型结果

根据评分卡计算每个开发样本的分数,从而得到开发样本的模型结果,其KS为24.82%,GINI为34.62%,结果尚可。应为验证样本没有参与开发模型,所以利用同样的操作对验证样本进行数据清洗,并得到评分卡,在对每一条数据进行评分,最终得到验证样本的模型结果为KS为29.71%,GINI为40.84%。对于申请评分卡而言,说明该模型分类的能力尚可,且开发结果和验证结果基本一致,说明该模型比较稳定。


评分模型的表现评估。
KS: 用以评估模型对好、坏客户的判别区分能力,计算累计坏客户与累计好客户百分比的最大差距。KS值范围在0%-100%,判别标准如下:
KS: <20% : 差
KS: 20%-40% : 一般
KS: 41%-50% : 好
KS: 51%-75% : 非常好
KS: >75% : 过高,需要谨慎的验证模型
GINI: 用以评估模型表现,按照评分大小从小到大对客户进行排序,计算每个分数段能捕捉到的累计坏客户百分比。GINI值范围在0%-100%,判别标准如下:
GINI: <30% : 差
GINI: 30%-40% : 一般
GINI: 41%-50% : 好
GINI: 51%-60% : 非常好
GINI: >60% : 过高,需要谨慎的验证模型

评分结果在开发样本中分数呈现正态分布:

从概率密度函数中,可以好坏客户一部分是分离的:

评分卡构建时最重要的是特征工程和分箱逻辑,这两项需要考虑因素很多,而且对结果的影响因素很大,要谨慎对待。

参考资料:

  1. 《机器学习》(周志华)
  2. 《Python数据分析与挖掘实战》(张良均)
  3. 评分卡的建立方法
  4. 信用标准评分卡模型开发及实现
  5. Prosper借贷平台贷款者违约预测
  6. 基于python的评分卡模型开发
  7. 构建评分卡模型
  8. Scorecard 评分卡模型
  9. 金融信贷风控

利用python构建信用卡评分相关推荐

  1. 基于python的信用卡评分模型

    基于python的信用卡评分模型 1. 项目背景介绍 1.1 信用风险和评分卡模型的基本概念 信用风险指的是交易对手未能履行约定合同中的义务造成经济损失的风险,即受信人不能履行还本付息的责任而使授信人 ...

  2. python推荐系统-利用python构建一个简单的推荐系统

    摘要: 快利用python构建一个属于你自己的推荐系统吧,手把手教学,够简单够酷炫. 本文将利用python构建一个简单的推荐系统,在此之前读者需要对pandas和numpy等数据分析包有所了解. 什 ...

  3. 基于python的系统构建_利用python构建一个简单的推荐系统

    摘要: 快利用python构建一个属于你自己的推荐系统吧,手把手教学,够简单够酷炫. 本文将利用python构建一个简单的推荐系统,在此之前读者需要对pandas和numpy等数据分析包有所了解. 什 ...

  4. python推荐_利用Python构建一个简单的推荐系统

    原标题:利用Python构建一个简单的推荐系统 摘要:快利用python构建一个属于你自己的推荐系统吧,手把手教学,够简单够酷炫.在此之前读者需要对pandas和numpy等数据分析包有所了解. 什么 ...

  5. python量化——利用python构建Fama-French三因子模型

    工具介绍 在构建模型之前,首先介绍所需的工具. import pandas as pd import tushare as ts pro = ts.pro_api() import statsmode ...

  6. 利用Python构建Wiki中文语料词向量模型

    利用Python构建Wiki中文语料词向量模型试验 完整代码下载地址:利用Python构建Wiki中文语料词向量模型 本实例主要介绍的是选取wiki中文语料,并使用python完成Word2vec模型 ...

  7. 信用卡迎来史上最强风控?利用数据挖掘进行信用卡评分,提高银行的客户风险识别能力

    **下半年,信用卡圈却又发生了一次大的地震.**多家银行开始严格管控使用信用卡,论坛和网上各种哀嚎,很多卡友遇到刷卡限制.降额,甚至封卡. 这是为什么呢? 根< 2020年第一季度支付体系运行总 ...

  8. 如何用python完成评分功能呢_利用python基于电影评分数据进行

    本文以Movielens 1M数据集为例,利用Python,对电影的各项数据进行分析,分析对于不同的性别的电影评分,以及性别差异对评分的差异 加载python库以及数据: import pandas ...

  9. 如何利用Python构建布林带交易策略?

    如何用Python构建布林带交易策略? 布林带是一个技术指标,广泛用于股票市场和外汇市场.它是由三条线组成的带状区域,由均线和标准差计算而得.布林带交易策略是一种利用布林带指标进行交易的策略.本文将介 ...

  10. 如何利用python构建A股的可视化复盘流程

    一,目标确定 利用大盘的成交量,红盘个股个数,同时结合南北资金的流动情况,可以大致观察到近期的市场热度,同时从技术层面来看,结合K线均线,也可以了解到目前的市场趋势.个股的运行,离不到行业的趋势,也离 ...

最新文章

  1. Nginx负载均衡实现之四层与七层负载
  2. 【ES8(2017)】String扩展 padStart / padEnd
  3. BeautifulSoup 用法总结
  4. python 数据结构转换层_python – 具有Maxpooling1D和channel_first的Keras模型
  5. ORACLE常用监控语句(未完待续)
  6. 阿里云ECS云服务器通过SAP HANA认证 海量数据处理技术助力企业数字化转型
  7. 软考初级程序员---题目(六)
  8. 向量空间 内积空间 欧氏空间 希尔伯特空间
  9. 锂电池保护板测试软件,锂电池保护板的简单检测方法
  10. 浅入浅出Vivado IP之DDS Compiler
  11. Silvaco Vcsel example01 解析
  12. idea自动生成器 生成构造器 get/set方法等
  13. 单片机毕设选题 - stm32心率脉搏血压体征监测手表(嵌入式 物联网)
  14. java int short区别_Java基础之数据比较Integer、Short、int、short
  15. docker部署xxl-job2.3.0
  16. Hbase Locality
  17. 林燕妮: 一见杨过误终生
  18. FFS(快速文件系统)–Unix文件系统
  19. 让dropout在图像超分辨领域大放异彩![2022 CVPR]
  20. problem solving automation

热门文章

  1. 自己搭建Markdown的wiki管理系统
  2. Insyde uefi 隐藏设置_UEFI+GPT安装Windows10
  3. Dijkstra最短路算法
  4. 西门子g120变频器接线图_西门子G120变频器使用小的注意事项!!!
  5. JUCE框架教程(2)—— 创建一个基本的音频/MIDI 插件第一部分:设置
  6. NOSQL,MongoDB是什么?
  7. 微信投票python脚本_微信刷票Python脚本教程
  8. 美团iOS逆向工程分析
  9. 热力学与统计物理笔记(WIP)
  10. 一个二本本科生如何才能进入腾讯,阿里,百度这些大厂?