python评分卡模型 简书_金融风控AI—评分卡模型算法(1)

一、概述

办理过信用卡的朋友知道,开卡需要先申请(筛选好坏用户),可能还会根据你的信用情况会有不同的额度。这就是银行的信用风险计量体系。对于信用卡有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

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

家庭成员可以剔除特别高的

第一篇完

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python递归函数是指一个函数在其函数体内调用自己的一种方法。它是一种简洁而有力的编程技巧,适用于解决需要重复进行相同或者相似操作的问题。 在Python中,使用递归函数的语法很简单,只需要在函数体内调用自身并提供适当的终止条件即可。递归函数通常包括两个部分:基本情况和递归情况。 基本情况是指函数可以直接得到结果而不需要调用自身的情况。在遇到基本情况时,递归函数就可以停止递归并返回结果,从而避免无限循环。 递归情况是指函数需要调用自身来解决更小规模的问题的情况。在递归情况下,函数将输入参数缩小到更小的规模,然后再次调用自身,直到达到基本情况。 递归函数可以解决很多问题,比如计算斐波那契数列、计算阶乘、二叉树的遍历等。递归函数的运行过程可以形象地表示为一个函数的调用栈。 需要注意的是,递归函数可能存在性能问题。因为每次递归调用都会创建一个新的函数帧,所以递归函数的内存消耗较大。此外,如果递归调用的深度过大,可能会导致堆栈溢出错误。 为了解决这些问题,可以优化递归函数的实现,比如使用尾递归优化、剪枝等技巧。另外,在使用递归函数时,一定要确定递归结束条件,并尽量避免无限递归的情况。 总之,Python递归函数是一种非常有用的编程技巧,可以简化问题的解决过程。但是在使用时需要注意性能和终止条件,避免出现问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值