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: