目录
1.评分卡模型
1.1基本概念
评分卡模型是常用的金融风控手段之一
风控,就是风险控制,我们采取各种措施和方法,减少风险发生的可能性,或风险发生时造成的损失。
根据客户的各种属性和行为数据,利用信用评分模型,对客户的信用进行评分,从而决定是否给予授信,授信的额度和利率,减少在金融交易中存在的交易风险。
按照不同的业务阶段,可以划分为三种:
- 贷前:申请评分卡(Application score card),称为A卡
- 贷中:行为评分卡(Behavior score card),称为B卡
- 贷后:催收评分卡(Collection score card),称为C卡
1.2客户评分计算
变量名称 | 变量范围 | 得分 |
---|---|---|
基准分 | - | 650 |
年龄 | age < 18 | -8 |
18 <= age <25 | -2 | |
25<=age<35 | 8 | |
35<=age<55 | 13 | |
55<=age | 5 | |
性别 | 男 | 4 |
女 | 2 | |
未知 | -2 | |
婚姻状况 | 已婚 | 8 |
未婚 | -2 | |
未知 | -3 | |
学历 | 本科及以上 | 12 |
大专 | 8 | |
其他 | 1 | |
贷款申请次数(二代征信) | >3次 | -8 |
=3次 | 0 | |
=2次 | 5 | |
<=1次 | 13 |
客户评分 = 基准分 + 年龄评分 + 性别评分 + 婚姻状况评分 + 学历评分 + 贷款申请次数
某客户年龄为27岁,性别为男,婚姻状况为已婚,学历为本科,贷款申请次数为1次,那么他的评分=?
650 (基准分) + 8(年龄评分) + 4(性别评分) + 8(婚姻评分) + 12(学历评分) + 13(贷款申请次数) = 695
评分卡的最高分和最低分是多少?
- 最低分:650-8-2-3+1-8=630
- 最高分:650+13+4+8+12+13=700
1.3评分卡模型使用步骤
- Step1,数据获取,包括获取存量客户及潜在客户的数据
存量客户,已开展融资业务的客户,包括个人客户和机构客户;
潜在客户,将要开展业务的客户
- Step2,EDA,获取样本整体情况,进行直方图、箱形图可视化
- Step3,数据预处理,包括数据清洗、缺失值处理、异常值处理
- Step4,变量筛选,通过统计学的方法,筛选出对违约状态影响最显著的指标。主要有单变量特征选择和基于机器学习的方法
- Step5,模型开发,包括变量分段、变量的WOE(证据权重)变换和逻辑回归估算三个部分
- Step6,模型评估,评估模型的区分能力、预测能力、稳定性,并形成模型评估报告,得出模型是否可以使用的结论
- Step7,生成评分卡(信用评分),根据逻辑回归的系数和WOE等确定信用评分的方法,将Logistic模型转换为标准评分的形式
- Step8,建立评分系统(布置上线),根据生成的评分卡,建立自动信用评分系统
1.4WOE编码
Weight of Evidence,证据权重,是自变量的一种编码,常用于特征变换用来衡量自变量与因变量的相关性。
B代表风险客户,G代表正常客户
对于某一变量某一分组的WOE,衡量了这组里面的好坏客户的占比与整体样本好坏样本占比的差异。
对于二分类问题共100条记录,一个自变量只有两个值value1, value2,如何计算value1, value2对应的woe1, woe2?
- value1有50条记录,其中40条对应label 1,另外10条对应label 0
- value2有50条记录,其中25条对应label 1,另外25条对应label 0
WOE差异越大,对风险区分能力会降低吗?
差异越大,对风险区分越明显
1.4.1WOE计算
- 对于连续型变量,分成N个bins
- 对于分类型变量保持类别group不变
- 计算每个bin or group中event和non-event的百分比
1.4.2WOE的作用
- 将连续型变量转化为woe的分类变量
- 对相似的bin或group进行合并(woe相似)
计算过程中需要注意的:
- 每个bin or group记录不能过少,至少有5%的记录
- 不要用过多的bin or group,会导致不稳定性
- 对bin or group中全为0或者1的特列,用 修正的woe
1.5WOE的好兄弟—IV
IV,Information Valuewoe,只考虑了风险区分的能力,没有考虑能区分的用户有多少。IV衡量一个变量的风险区分能力,即衡量各变量对y的预测能力,用于筛选变量。
IV是与WOE密切相关的一个指标,在应用实践中,评价标准可参考如下:
IV范围 | 变量预估(预测效果) |
---|---|
小于0.02 | 几乎没有 |
0.02~1 | 弱 |
0.1~0.3 | 中等 |
0.3~0.5 | 强 |
大于0.5 | 难以置信,需要确认 |
怎样使用IV值进行特征变量的筛选?
比如筛选掉IV < 0.1的变量,因为该特征对于y的预测能力很弱
1.5.1WOE和IV计算步骤
-
Step1,对于连续型变量,进行分箱(binning),可以选择等频、等距,或者自定义间隔,对于离散型变量,如果分箱太多,则进行分箱合并
-
Step2,统计每个分箱里的好人数(bin_goods)和坏人数(bin_bads)
-
Step3,分别除以总的好人数(total_goods)和坏人数(total_bads),得到每个分箱内的边际好人占比margin_good_rate和边际坏人比margin_bad_rate
-
Step4,计算每个分箱的WOE
-
Step5,计算每个分箱里的IV,最终求和,即得到最终的IV
2.评价指标—KS
评估指标KS, Kolmogorov-Smirnov,由两位苏联数学家A.N. Kolmogorov和N.V. Smirnov提出。在风控中,KS常用于评估模型区分度。区分度越大,说明模型的风险排序能力(ranking ability)越强。
- KS曲线:计算每个Score分箱区间累计坏账户占比与累计好账户占比差的绝对值
- KS值:在这些绝对值中取最大值,是衡量好坏客户分数距离的上限值
- KS含义:如果排除掉一定比例的坏用户,会有多少比例的好用户会被误杀掉
2.1KS作用
KS统计量是好坏距离或区分度的上限
KS越大,表明正负样本区分程度越好
3.DBSCAN聚类
DBSCAN聚类是一种基于密度的聚类算法,其他他聚类方法大多是基于样本之间的距离进行聚类。
最终确定的簇的个数不确定
DBSCAN聚类将数据分成三类:
- 核心点,在半径Eps内含有超过MinPts数目的点
- 边界点,在半径Eps内点的数量小于MinPts,但是落在核心点的邻域内的点
- 噪音点,既不是核心点,也不是边界点
3.1DBSCAN算法流程
- 将所有点标记为核心点,边界点、噪音点
- 删除噪音点
- 为距离在Eps之内的所有核心点之间赋予一条边
- 每组连通的核心点形成一个簇
- 将每个边界点指派到和它关联的核心点的簇中
3.2DBSCAN工具使用
import numpy as np
import sklearn.cluster as skc
from sklearn import metrics
import matplotlib.pyplot as plt
mac2id = dict()
online_times = []
f = open('data/', encoding='utf-8')
for line in f:
# 读取每条数据中的mac地址,
# 开始上网时间,上网时长
mac = line.split(',')[2]
online_time = int(line.split(',')[6])
start_time = int(line.split(',')[4].split(' ')[1].split(':')[0])
# mac2id是一个字典:
# key是mac地址
# value是对应mac地址的上网时长以及开始上网时间(精度为小时)
if mac not in mac2id:
mac2id[mac] = len(online_times)
online_times.append((start_time, online_time))
else:
online_times[mac2id[mac]] = [(start_time, online_time)]
# -1:根据元素的个数自动计算此轴的长度
# X:上网时间
real_X = np.array(online_times).reshape((-1, 2))
X = real_X[:, 0:1]
# 调用DBSCAN方法进行训练,
# labels为每个数据的簇标签
db = skc.DBSCAN(eps=0.01, min_samples=20).fit(X)
labels = db.labels_
# 打印数据被记上的标签,
# 计算标签为-1,即噪声数据的比例。
print('Labels:')
print(labels)
raito = len(labels[labels[:] == -1]) / len(labels)
print('Noise raito:', format(raito, '.2%'))
# 计算簇的个数并打印,评价聚类效果
n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)
print('Estimated number of clusters: %d' % n_clusters_)
print("Silhouette Coefficient: %0.3f" % metrics.silhouette_score(X, labels))
# 打印各簇标号以及各簇内数据
for i in range(n_clusters_):
print('Cluster ', i, ':')
print(list(X[labels == i].flatten()))
# 画直方图,分析实验结果
plt.hist(X, 24)
plt.show()
3.3关于DBSCAN
eps越大,类别数会怎样?
Eps越大,类别数越少,如果参数很大都为同一个簇
min_samples如果为1,是不合理的,因为每个点都会是独立的簇
DBSCAN优点:
- 可以对任意形状的稠密数据集进行聚类
- 事先不需要知道聚类的数量
- 聚类的同时发现异常点,对数据集中的异常点不敏感
DBSCAN缺点:
- 如果样本集的密度不均匀、聚类间距差相差很大时,聚类质量较差
- 调参有些复杂(相对于KMeans算法),主要需要对距离阈值ϵ,邻域样 本数阈值MinPts联合调参,不同的参数组合对最后的聚类结果影响较大
4.总结与回顾
- 数据获取
金融机构自身,第三方机构
- EDA(探索性数据分析)
统计每个字段的缺失值情况、异常值情况、平均值、中位数、最大值、最小值、分布情况等
为后续指定计划
- 数据清洗
对数据中脏数据,缺失值,异常值进行处理
异常点检测,可以通过聚类检测异常值,先把数据聚成不同的类,选择不属于任何类的数据作为异常值
1)DBSCAN算法,将与数据稠密区域紧密相连的数据对象划分为一个类,因此分离的数据就会作为异常值
2)KMeans算法,把数据聚成k类,计算每个样本和对应的簇中心的距离,找到距离最大的的点作为异常值
- 变量分箱
-
等频分箱,把自变量从小到大排序,根据自变量的个数等分为k部分,每部分作为一个分箱。
-
等距分箱,把自变量从小到大排序,将自变量的取值范围分为k个等距的区间,每个区间作为一个分箱。
-
聚类分箱,用k-means聚类法将自变量聚为k类,但在聚类过程中需要保证分箱的有序性。
- WOE编码
特征离散化,是将数值型特征(一般是连续型的)转变为离散特征,比如woe转化,将特征进行分箱,再将每个分箱映射到woe值上,即转换为离散特征
woe编码的好处:
1)简化模型,使模型变得更稳定,降低了过拟合的风险
2)对异常数据有很强的鲁棒性,实际工作中的那些很难解释的异常数据一般不会做删除处理,如果特征不做离散化,这个异常数据带入模型,会给模型带来很大的干扰