评分卡项目总结
一、分析目的
信用评分A卡制作,判断用户是否违约。
二、数据处理
这一步不仅涉及列名修改、去重、缺失值、异常值等常规处理,还有WOE分箱处理。
2.1、列名格式规范性处理
修改部分列名,比如数据中的‘NumberOfTime60-89DaysPastDueNotWorse’和‘NumberOfTime30-59DaysPastDueNotWorse’两列。由于一些算法或方法,列名中的某些符号会带来问题甚至报错,例如这里的"-",会在回归公式中被认为是减号,所以换成"_"。
train_data.columns=train_data.columns.map(lambda x:x.replace('-','_'))
2.2、重复数据处理
删除重复行数据。重复数据,容易导致回归系数标准误降低,使得对应p值减小。
train_data.drop_duplicates(inplace=True)
2.3、缺失值处理
2.3.1、查看缺失值分布情况
我们使用missingno库的matrix()方法查看各特征缺失值情况。
import missingno as msno
msno.matrix(train_data)
plt.show()
从上图看,‘MonthlyIncome’和‘NumberOfDependents’两列存在缺失值,前者占比最多大于80%,后者占比较少。
2.3.2、缺失值处理逻辑
1、常规的缺失值处理方法是占比超过80%缺失值数据直接删除。对于信用评分卡来说,由于所有变量都需要分箱,故这里缺失值作为单独的箱子即可。
2、对于最后一列‘NumberOfDependents’,缺失值占比只有2.56%,作为单独的箱子信息不够,故做单一值填补,这列表示家庭人口数,有右偏的倾向,且属于计数的数据,故使用中位数填补。
2.3.2、单一值替换缺失值
将最后一列‘NumberOfDependents’的缺失值替换成中位数。
NOD_median=train_data['NumberOfDependents'].median()
train_data['NumberOfDependents'].fillna(NOD_median,inplace=True)
2.4、异常值处理
异常值常见的处理方法有删除所在的行、替换成缺失值(与缺失值一起处理)或盖帽法处理。结合业务逻辑和算法需求判断是否需要处理异常值以及如何处理,一般情况下盖帽法即可,即将极端异常的值改成不那么异常的极值,当然一些算法例如决策树中连续变量的异常值也可以不做处理。我们先定义好盖帽法函数,需要的时候再拿来用。
def block(x,lower=True,upper=True):
# x是输入的Series对象,lower表示是否替换1%分位数,upper表示是否替换99%分位数
ql=x.quantile(0.01)
qu=x.quant