信用评分系统运行原理上篇
源码
https://gitee.com/pingfanrenbiji/Credit-Card-Score
在jupyter中打开该项目
导入代码库
# Numpy是以矩阵为基础的数学计算模块,纯数学import numpy as np# pandas是提供高性能易用数据类型和分析工具的第三方库import pandas as pd# 绘制图形import matplotlib.pyplot as plt# seaborn是基于matplotlib开发的可视化库,比matplotlib更加容易使用,而且图例的风格更加现代化import seaborn as sns# Matplotlib 是Python 的一个绘图库。 它包含了大量的工具,你可以使用这些工具创建各种图形,包括简单的散点图,正弦曲线,甚至是三维图形%matplotlib inline
读取数据字典
分别解释下每个变量代表什么含义
SeriousDlqin2yrs 好坏客户RevolvingUtilizationOfUnsecuredLines 信用卡和个人信用额度的总余额,除了房地产和没有分期付款债务,如汽车贷款除以信用额度age 出生年龄NumberOfTime30-59DaysPastDueNotWorse 过去两年借款35-59天逾期但是不糟糕的次数DebtRatio 每月债务支付、赡养费、生活费用除以毛利MonthlyIncome 月收入NumberOfOpenCreditLinesAndLoans 开放式贷款(分期付款汽车贷款或抵押贷款)和信用额度(信用卡)的次数NumberOfTimes90DaysLate >= 90天逾期NumberRealEstateLoansOrLines 抵押贷款和房地产贷款包括房屋净值信贷额度NumberOfTime60-89DaysPastDueNotWorse 过去两年借款60-89天逾期但是不糟糕的次数NumberOfDependents 家属数量不包括自己
REAL数据类型说明
REAL 数据类型保存单精度浮点数 REAL 值需要 4 个存储字节保存为 REAL 类型的值可精确到 7 个有效数字
读取训练数据
df = pd.read_csv("./GiveMeSomeCredit/cs-training.csv").drop("Unnamed: 0", axis=1)
drop是删除函数 axis=1表示列 删除 指定列名为 "Unnamed: 0" 的列
查看前5行数据
查看缺失值和异常值
通过 info() 可以看出一共有150000条信息,MonthyIncome 和 NumberOfDependents 存在缺失的情况,MonthyIncome 缺失29731个数据,NumberOfDependents 缺失3924个数据。
数据集计算
df.describe().T.assign(missing_rate = df.apply(lambda x : (len(x)-x.count())/float(len(x))))
使用 describe() 来看数据集中的计数、均值、最大最小值、标准差和第一、二、三个四分位值,同时增加了缺失率的计算
缺失值处理:
1、由于 MonthyIncome 缺失较多,因此不适合直接进行删除,这边根据变量之间存在的关系来填补缺失值,并采用随机森林的方法;
2、NumberOfDependents 的缺失较少,对于整体的样本影响有限,因此这边直接进行删除操作,后续也可以进行一些其他的填补操作。
随机森林函数
原理分析:
参数解释:
random_state:随机种子
n_estimators:也就是最大的弱学习器的个数。 一般来说n_estimators太小,容易欠拟合,n_estimators太大,计算量会太大,并且n_estimators到一定的数量后,再增大n_estimators获得的模型提升会很小,所以一般选择一个适中的数值。 默认是100
max_depth:决策树最大深度
n_jobs:设定工作的core数量. 等于-1的时候,表示cpu里的所有core进行工作
删除缺失值、删除重复值
df.dropna()df.drop_duplicates()
异常值处理
偏离大多数抽样数据的数值,通常指测定值中与平均值的偏差超过两倍标准差的测定值
通常采用离群值检测的方法对异常值进行检测
画一个分箱图
df["RevolvingUtilizationOfUnsecuredLines"].plot(kind="box", grid=True)
grid=True:显示网格
使用2来代替大于2的值
revNew = []for val in df.RevolvingUtilizationOfUnsecuredLines: if val <= 2: revNew.append(val) else: revNew.append(2.)
再次分箱
对age分箱
df.age.plot.box(grid=True)
发现 age 属性中存在0值情况,而这些数据明显是异常值,因此对其进行处理
df = df[df["age"] > 0]
对三个属性进行分箱
df.boxplot(column=["NumberOfTime30-59DaysPastDueNotWorse", "NumberOfTime60-89DaysPastDueNotWorse", "NumberOfTimes90DaysLate"],rot=30)
rot:int或float,默认为0 标签的旋转角度(以度为单位)相对于屏幕坐标
上面的箱线图可以看出 NumberOfTime30-59DaysPastDueNotWorse,NumberOfTime60-89DaysPastDueNotWorse,NumberOfTimes90DaysLate三个特征都存在两个异常值
查看具体的异常值
df["NumberOfTime30-59DaysPastDueNotWorse"].unique()df["NumberOfTime60-89DaysPastDueNotWorse"].unique()df["NumberOfTimes90DaysLate"].unique()
可以看出96和98是异常值数据
用指定列数据的中位数来替换异常值
def replaceOutlier(data): New = [] med = data.median() for val in data: if ((val == 98) | (val == 96)): New.append(med) else: New.append(val) return New
删除了异常值之后 再看这3个列的箱线图
查看DebtRatio的箱线图
使用中位数绝对偏差进行异常值检测
第一个参数是 指定列数据第二个参数是 阈值
如果列数据是数组 则转换成array
shape返回是数据表的矩阵行列数
对于矩阵的行数 也可以使len(x)函数输出的矩阵长度 也就是所谓的行数
对数列中的每一行取中位数
再用每一行中的每一个数据减去中位数
再对差值取中位数
再用一个公式 norm.ppf(0.75) * (每个数据和中位数差距) / 每个中位数的中位数 得到一个异常值分值
分值大于阈值的话 返回true
分值小于阈值返回false
检测出最小的异常值 用于替换异常值
minUpperBound = min([val for (val, out) in zip(df.DebtRatio, mad_based_outlier(df.DebtRatio)) if out == True])
这句话的意思是 mad_based_outlier(df.DebtRatio) 返回true的时候 说明大于阈值 是异常值
找到所有的异常值 然后取最小值 得到最小的异常值
替换异常值
大于异常值的数都用异常值替换
查看这一列的数据情况
画一个箱线图
查看月收入的数据情况
对月收入画箱线图
同样的方式 找最小的异常值 大于最小异常值的数值都用异常值替换
其他参数类似 不重复说了
数据切分
将数据切分成训练集和测试集
导入库
from sklearn.model_selection import train_test_split
训练数据和测试数据分割
Y = df["SeriousDlqin2yrs"]X = df.iloc[:, 1:]# 测试和训练数据进行3:7的比例进行切分 random_state定一个值是的每次运行的时候不会被随机分X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=123)
train = pd.concat([Y_train, X_train], axis=1)test = pd.concat([Y_test, X_test], axis=1)
train.to_csv('TrainData.csv',index=False)test.to_csv('TestData.csv',index=False)
探索性分析
一般用直方图、散点图、箱线图分析
下面利用直方图和核密度估计画图,Age、MonthlyIncome、NumberOfOpenCreditLinesAndLoans大致呈正太分布,符合统计分析
fig = plt.figure()# alpha:设定图表颜色fig.set(alpha=0.2)# subplot2grid 在一张大图里分列几个小图 #在网格的特定位置创建轴对象# 允许轴对象跨越多个行或列# 纵轴2,横轴3 位于第一个位置plt.subplot2grid((2, 3), (0, 0))# hist 直方图 # bins 设定直方图中分组的数量# figsize 是一个tuple,用来指定width和height的inch(厘米)train["age"].plot(kind="hist", bins=30, figsize=(12, 6), grid=True)plt.title("Hist of Age")
# 解决中文的显示问题plt.rcParams["font.sans-serif"]=["SimHei"]# 解决保存图像是负号'-'显示为方块的问题plt.rcParams["axes.unicode_minus"] = False
plt.tight_layout() # 调整子图之间的间距,紧凑显示图像plt.show()
特征选择
1、变量分箱 将连续变量离散化 将多状态的离散变量合并成少状态
2、变量分箱重要性
a 稳定性 避免特征中无意义的波动对评分带来波动
b 健壮性 避免极端值的影响
3、变量分箱优势
a 可以将缺失值作为独立的箱带入模型中
b 将所有的变量变换到相似的尺度上
变量分箱劣势
a 计算量大
b 分箱之后需要编码
4、变量分箱常用方法
a 有监督
a-1 Best-Ks
a-2 ChiMerge (卡放分箱)
b 无监督
b-1 等距
b-2 等频
b-3 聚类
后续
下一篇写下 特征分箱等实现逻辑
信用评分系统运行原理上篇相关推荐
- 信用评分系统运行原理下篇
前言 信用评分系统运行原理上篇 信用评分系统运行原理中篇-分箱逻辑 绘制相关性系数热力图 corr = train.corr() # 计算各变量的相关性系数xticks = ['x0','x1','x ...
- 信用评分系统运行原理中篇-分箱逻辑
前言 本篇承接上篇 信用评分系统运行原理上篇 分箱逻辑比较复杂 设计到很多的算法 为了确保分析的准确性 我通过pycharm编译器Debug的方式跑这段代码 一步一步的分析代码的实现逻辑 编译器环境的 ...
- 室内空气流动原理图_家庭新风系统示意图 新风系统运行原理介绍
健康舒适的人居环境是我们一致的生活诉求, 实现这一目标, 家 居环境仅仅拥有恒温恒湿还不够,还必须恒氧,拥有 24 小时不间断 的新鲜空气供应. 家庭新风系统即为实现这一目标而诞生, 它根据房 间大小 ...
- 银行信用评分卡建模原理
今天学习了一下评分卡的内容,博主自己也对这个不了解,由于业务的需求,今天自学了下相关的内容.我把自己学习的一些东西整理下,发到这个博客里面. 背景 1.先讲一下背景内容,什么是评分卡:其实评分卡呢,就 ...
- 信用卡评分模型(数据获取+数据预处理+探索分析+变量选择+模型开发+模型评估+信用评分+建立评分系统)
最近两次遇到关于信用卡评分的题目,遂了解一波. Reference: 基于python的信用卡评分模型(超详细!!!) https://www.jianshu.com/p/f931a4df202c h ...
- python信用评分卡_基于Python的信用评分卡模型分析(二)
上一篇文章基于Python的信用评分卡模型分析(一)已经介绍了信用评分卡模型的数据预处理.探索性数据分析.变量分箱和变量选择等.接下来我们将继续讨论信用评分卡的模型实现和分析,信用评分的方法和自动评分 ...
- 「实战案例」基于Python语言开发的信用评分卡
信用风险计量模型可以包括跟个人信用评级,企业信用评级和国家信用评级.人信用评级有一系列评级模型组成,常见是A卡(申请评分卡).B卡(行为模型).C卡(催收模型)和F卡(反欺诈模型). 今天我们展示的是 ...
- Python语言实现信用评分卡建模分析
背景介绍 信用评分技术是一种应用统计模型,其作用是为信用卡申请人计算一个风险评估分值的方法. 而这种用途的统计模型就称为信用评分卡.信用评分卡可以根据客户提供的资料.客户的历史数据以及第三方平台(支付 ...
- 基于 Python 的信用评分模型开发-附数据和代码
来源 | 知乎 作者 | Carl 文章链接 | https://zhuanlan.zhihu.com/p/35284849 信用评分模型可用"四张卡"来表示,分别是 A卡(Ap ...
最新文章
- java中velocity定义宏标签_velocity自定义标签和指令(转:zwj)
- python数据分析类库_python数据分析类库系列-Pandas入门之数据结构Series
- leetcode算法题--排序链表★
- xtrabackup备份mysql_配置xtrabackup备份mysql数据库
- EM算法(Expectation Maximization Algorithm)
- 每个人都应该使用的Python 3中被忽略的3个功能
- ffmpeg 纯静态编译,以及添加自定义库流程摘要
- “3D几何与视觉技术”全球在线研讨会(9月2日到12月16日)
- Thinking in AJAX(二) —— 基于AJAX的WEB设计
- 解决ie6中fixed不起作用的问题
- kafka 丢弃数据_Kafka快速入门
- 看看DelayQueue源码
- C++ 在线IDE 编译器
- 苹果Mac文件加速下载工具:Download Shuttle Pro
- 移动光猫搭建虚拟服务器,折腾光猫/路由器[MIPS架构](1):用Samba服务器搭建家庭文件共享中心...
- 《福州往事》(抒情散文)
- grpc流式传输心得
- html判断闰年,javascript怎么判断是否闰年?
- vue实现icon刷新动画
- 推荐几本学习Java的教材