评分卡模型之数据预处理

1. 简要介绍

评分卡是信用风险评估和互联网金融领域常用的建模方法. 评分卡模型通常适用于信用评估领域, 例如信用卡风险评估和贷款发放业务. 

在银行借贷场景中, 评分卡就可以用来衡量客户的风险大小. 一般来说, 评分卡分数越高, 客户的信用越好, 风险越小. 

评分卡开发流程: 

2. 数据处理

首先我们的数据是.csv形式, 包含150000个样本, 10个特征, 1个标签, 第一列为索引.

data = pd.read_csv(r"rankingcard.csv", index_col=0)

SeriousDlqin2yrs:出现90天或更长时间的逾期行为 (标签 )
RevolvingUtilizationOfUnsecuredLines:贷款以及信用卡可用额度与总额度比例
age:借款人借贷年龄
NumberOfTime30-59DaysPastDueNotWorse:过去两年内出现30-59天逾期但是没有发展的坏的次数
DebtRatio:每月偿还债务,赡养费,生活费用除以月收入
MonthlyIncome:月收入
NumberOfOpenCreditLinesAndLoans:开放式贷款和信贷数量
NumberOfTimes90DaysLate:过去两年内出现90天逾期或更坏的次数
NumberRealEstateLoansOrLines:抵押贷款和房地产贷款数量,包括房屋净值信贷额度
NumberOfTime60-89DaysPastDueNotWorse:过年两年内出现60-89天逾期但是没有发展得更坏的次数
NumberOfDependents:家庭中不包括自身的家属人数(配偶,子女等) 

 data.info:

 2.1 去除重复值

在现实中我们难免会存在重复的数据样本, 即存在两个或两个以上样本中的所有特征值都一样, 这可能是人为失误, 也可能是机器失误. 对于两个人来说, 名字、性别、工资这些特征, 确实是存在相同的可能性, 但再加上借贷数量、家属人数等特征完全相同, 这大概率是不可能的. 

利用dataframe.duplicated()查看一下数据中是否存在相同样本.

flag = data.duplicated()

函数返回的是一个布尔序列.  <class 'pandas.core.series.Series'>

 False代表跟上面样本不重复, True则代表重复.

由于样本数量太多, 这样看不明显, 再利用.sum()对其计数.

print("sum:{}".format(flag.sum()))

 得到:

sum:609

我们知道, True =1 , Flase =0, 那么就存在609个重复样本, 删去.

data.drop_duplicates(inplace=True)

然后我们再查看数据的信息:

 重复值就删掉了. 当然你可以不必检查, 直接使用 .drop_duplicates()函数

不要忘了重置数据的索引:

data.reset_index(drop=True)

 或者:

data.index = range(data.shape[0])

2.2 填补缺失值

从上面的data.info得知, "MonthlyIncome" 以及 "NumberOfDependents" 这两个特征缺失了一些数据, 特别是 "MonthlyIncome".

利用 .isnull()函数, 我们发现 "NumberOfDependents"仅缺失了2.5%,  我们可以考虑使用均值来进行填补.

这里我们使用 .fillna函数(), 同时恢复索引

data["NumberOfDependents"].fillna(data["NumberOfDependents"].mean(), inplace=True) 
data.reset_index(drop=True)

而 "MonthlyIncome", 收入, 缺失了大约有20%, 并且对于评分卡模型来说, 收入是一个非常重要的评分因素, 所以不能简单得采取均值去填补.

我们可采取这样的思想, “既然我们能使用A, B , C去预测 D, 那也可使用A, C, D去预测B ”. 

对于一个拥有n个特征的数据来说, 若其特征X有缺失值, 我们就把特征X作为标签, 其他n-1个特征和原本的标签组成新的特征矩阵. 那么X中没有缺失的部分, 就作为Y_train, 缺失的部分, 就是需要我们预测的部分, 作为Y_test.

这里我们可以采用随机森林算法来对缺失部分进行预测.    随机森林介绍

from sklearn.ensemble import RandomForestRegressor


X = data.iloc[:, 1:]
y = data.iloc[:, 0]

fill = X.loc[:, "MonthlyIncome"]  # 获取有缺失值的那一列特征矩阵

X_new = pd.concat([X.loc[:, X.columns != "MonthlyIncome"], y], axis=1) # 将其他特征和标签重新组合成新矩阵

Ytrain = fill[fill.notnull()]
Ytest = fill[fill.isnull()]  # 利用notnull()和isnull()返回的索引得到Yrain, Ytest

Xtrain = X_new.loc[Ytrain.index, :] 
Xtest = X_new.loc[Ytest.index, :]   # 同样得到Xtrain, Xtest

rgr = RandomForestRegressor(n_estimators=100)
rgr = rgr.fit(Xtrain, Ytrain)
Ypredict = rgr.predict(Xtest)

最后, 将得到的预测值对特征 “MonthlyIncome”缺失的地方进行填充.

data.loc[data.loc[:, "MonthlyIncome"].isnull(), "MonthlyIncome] = Ypredict

data.info:

 2.3 小结

往往我们从生活中获取到的数据都是不完整, 存在错误的数据, 这样的数据不能直接被拿来使用. 为了保证数据的完整性和准确性, 我们则需要采取一系列手段对原始数据进行处理. 如上文所述. 

关于处理数据异常值, 由于银行数据的特殊性,  举个例子, 月收入很高很高这样的情况, 它是可以存在的, 是合理的. 那么我们要处理的应该是不符合现实的数据, 例如收入为负数等等. 若异常的数据样本的量少, 可以考虑直接删除.

另外数据还可能存在样本不均衡问题, 由于本人能力有限, 这里就不再阐述.


More information:

评分卡模型

信用标准评分卡模型开发及实现

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值