源码

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 聚类

后续

下一篇写下 特征分箱等实现逻辑

信用评分系统运行原理上篇相关推荐

  1. 信用评分系统运行原理下篇

    前言 信用评分系统运行原理上篇 信用评分系统运行原理中篇-分箱逻辑 绘制相关性系数热力图 corr = train.corr() # 计算各变量的相关性系数xticks = ['x0','x1','x ...

  2. 信用评分系统运行原理中篇-分箱逻辑

    前言 本篇承接上篇 信用评分系统运行原理上篇 分箱逻辑比较复杂 设计到很多的算法 为了确保分析的准确性 我通过pycharm编译器Debug的方式跑这段代码 一步一步的分析代码的实现逻辑 编译器环境的 ...

  3. 室内空气流动原理图_家庭新风系统示意图 新风系统运行原理介绍

    健康舒适的人居环境是我们一致的生活诉求, 实现这一目标, 家 居环境仅仅拥有恒温恒湿还不够,还必须恒氧,拥有 24 小时不间断 的新鲜空气供应. 家庭新风系统即为实现这一目标而诞生, 它根据房 间大小 ...

  4. 银行信用评分卡建模原理

    今天学习了一下评分卡的内容,博主自己也对这个不了解,由于业务的需求,今天自学了下相关的内容.我把自己学习的一些东西整理下,发到这个博客里面. 背景 1.先讲一下背景内容,什么是评分卡:其实评分卡呢,就 ...

  5. 信用卡评分模型(数据获取+数据预处理+探索分析+变量选择+模型开发+模型评估+信用评分+建立评分系统)

    最近两次遇到关于信用卡评分的题目,遂了解一波. Reference: 基于python的信用卡评分模型(超详细!!!) https://www.jianshu.com/p/f931a4df202c h ...

  6. python信用评分卡_基于Python的信用评分卡模型分析(二)

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

  7. 「实战案例」基于Python语言开发的信用评分卡

    信用风险计量模型可以包括跟个人信用评级,企业信用评级和国家信用评级.人信用评级有一系列评级模型组成,常见是A卡(申请评分卡).B卡(行为模型).C卡(催收模型)和F卡(反欺诈模型). 今天我们展示的是 ...

  8. Python语言实现信用评分卡建模分析

    背景介绍 信用评分技术是一种应用统计模型,其作用是为信用卡申请人计算一个风险评估分值的方法. 而这种用途的统计模型就称为信用评分卡.信用评分卡可以根据客户提供的资料.客户的历史数据以及第三方平台(支付 ...

  9. 基于 Python 的信用评分模型开发-附数据和代码

    来源 | 知乎  作者 | Carl 文章链接 | https://zhuanlan.zhihu.com/p/35284849 信用评分模型可用"四张卡"来表示,分别是 A卡(Ap ...

最新文章

  1. java中velocity定义宏标签_velocity自定义标签和指令(转:zwj)
  2. python数据分析类库_python数据分析类库系列-Pandas入门之数据结构Series
  3. leetcode算法题--排序链表★
  4. xtrabackup备份mysql_配置xtrabackup备份mysql数据库
  5. EM算法(Expectation Maximization Algorithm)
  6. 每个人都应该使用的Python 3中被忽略的3个功能
  7. ffmpeg 纯静态编译,以及添加自定义库流程摘要
  8. “3D几何与视觉技术”全球在线研讨会(9月2日到12月16日)
  9. Thinking in AJAX(二) —— 基于AJAX的WEB设计
  10. 解决ie6中fixed不起作用的问题
  11. kafka 丢弃数据_Kafka快速入门
  12. 看看DelayQueue源码
  13. C++ 在线IDE 编译器
  14. 苹果Mac文件加速下载工具:Download Shuttle Pro
  15. 移动光猫搭建虚拟服务器,折腾光猫/路由器[MIPS架构](1):用Samba服务器搭建家庭文件共享中心...
  16. 《福州往事》(抒情散文)
  17. grpc流式传输心得
  18. html判断闰年,javascript怎么判断是否闰年?
  19. vue实现icon刷新动画
  20. 推荐几本学习Java的教材

热门文章

  1. JS:正则表达式详细语法基础
  2. 二进制位运算中‘1’的个数
  3. 用Java实现一个简单的链表迭代器
  4. mysql配置master_mysql 主从配置(master/slave)
  5. Win7 无法进行Windows自动更新
  6. loadrunner-3-1创建测试场景
  7. python 判断当前系统的Python编译器类型
  8. VMWare虚拟系统上网设置及VMWare虚拟机三种工作模式详解
  9. MySQL性能优化的参数简介
  10. Android开发之APN网络切换