一、概述
办理过信用卡的朋友知道,开卡需要先申请(筛选好坏用户),可能还会根据你的信用情况会有不同的额度。这就是银行的信用风险计量体系。对于信用卡有4类评分卡:
1)申请评分卡(A卡)
2)行为评分卡(B卡)
3)催收评分卡(C卡)
4)欺诈评分卡(F卡)
这些评分卡算法一样,只是训练的数据不同,所用的参数也就不同。
蚂蚁金服的芝麻信用也是这样的。
二、模型开发
模型的开发主要包含以下几大部分工作:数据获取、数据预处理、探索分析、特征选择、模型训练、模型评估、建立评分系统。
1、数据获取
本项目数据来源于kaggle竞赛Give Me Some Credit。有训练数据共计15万条。
打开数据文件大概这个样子:

字段描述如下

2、数据预处理
这部分主要做2个事情:缺失值处理和异常值处理。
a、缺失值处理
pd的describe()函数,可以了解数据集的缺失值情况。
#载入数据
data = pd.read_csv('cs-training.csv')
#数据集确实和分布情况
data.describe(include='all').to_csv('DataDescribe.csv')#了解数据集的分布情况
打开DataDescribe.csv

我们可以看大部分数据有15万条,其中月收入只有12万条,缺了近3万条,家属数量14.6万条。
对于缺失值,根据不同的情况我们分类处理:
(1) 如果缺失的不多,比如家属数量缺失不多,可以直接删除含有缺失值的样本。用dropna()
(2) 如果缺失较多,不宜直接全部删除,根据样本之间的相似性填补缺失值。比如用平均值
(3)如果缺失较多,不宜直接全部删除, 根据变量之间的相关关系填补缺失值。比如用随机森林法填补。
(4)如果缺失巨大,就失去分析意义,可以将整个字段删除
平均值填补只要一句话:
data=data.fillna({'MonthlyIncome':data['MonthlyIncome'].mean()})
随机森林法填补:
# 用随机森林对缺失值预测填充函数
def set_missing(df):
# 把已有的数值型特征取出来
process_df = df.iloc[:,[5,0,1,2,3,4,6,7,8,9]]
# 分成已知该特征和未知该特征两部分
known = process_df[process_df.MonthlyIncome.notnull()].values
unknown = process_df[process_df.MonthlyIncome.isnull()].values
# X为特征属性值
X = known[:, 1:]
# y为结果标签值
y = known[:, 0]
# fit到RandomForestRegressor之中
rfr = RandomForestRegressor(random_state=0, n_estimators=200,max_depth=3,n_jobs=-1)
rfr.fit(X,y)
# 用得到的模型进行未知特征值预测
predicted = rfr.predict(unknown[:, 1:]).round(0)
print(predicted)
# 用得到的预测结果填补原缺失数据
df.loc[(df.MonthlyIncome.isnull()), 'MonthlyIncome'] = predicted
return df
调用随机森林:
data=set_missing(data)#用随机森林填补比较多的缺失值
data=data.dropna()#删除比较少的缺失值
b、异常值处理
异常值是指明显偏离大多数抽样数据的数值,或者直接违背常识的数据,比如年龄是负数。对于违背常识的记录直接删除,而对于其他异常数据需要具体分析:
删除。先取出异常记录,看看数据,如果不太多,也没有特别的可以删除。因为异常值可能会影响结论。如果取出的异常记录有明显的相关性,那么这些记录可以总结出一个规则。
放任不管。也许异常值代表的是真实的情况,这些值即使异常,也不会影响模型。
视为缺失值进行填充。如果删除数据可能会损失信息,而如果放任不管可能又影响我们的模型,所以可以考虑用均值、临近值进行填充。
具体采用哪种方式其实最好都试一下,看看最后得到的模型怎么样。因为所有这些操作都是有假设条件的,而你的数据是否满足这些条件,试过才知道。

从图看有异常值不少,不过一般只把异常的0值去掉。


对于RevolvingUtilizationOfUnsecuredLines及DebtRatio都是百分数类型。其中第一项肯定不能大于100%而且统计一下这部分异常数据不多,果断删掉。第二项债务百分比不敢确定是否可债务大于100%,统计了一下有3w多条,而且取出来看了一下不是很特别,同样可以试一下删除或者放入不管或者填充看看最后不同的效果。



这3个逾期不还次数指标意义相似放一起看,发现有2个数据特别显眼,是96,98。虽然按箱型图的含义所有圆圈都是异常值,但仔细分析这三个指标发现正常值绝大部分是0,这就导致了箱型图的1/4线和3/4线都是0,所以我们通常把头顶2个值作为异常值。我把这部分异常值取出来发现数量不多,只有200多条,理论上可以直接删除或者放在里面置之不理。但是我看了这部分数据发现非常异常。这208条数据有125条是违约用户,违约占比62%,而全量数据里面违约占比7%不到,所以我觉得应该把这部分数据作为一条规则来处理,遇到这三个指标有超过90的数值,直接报告警。那么是否可以把这部分数据留着置之不理呢,后面我试了,发现会对变量之间的相关性有很大影响(后面会详细讲)。

同样这个指标我们把50以上作为异常值。

这个指标pass

月收入可以去掉特别高的数据

家庭成员可以剔除特别高的
第一篇完
网友评论