一、数据预处理
1、读入数据
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data=pd.read_csv(r'rankingcard.csv',index_col=0)
data.head()
看一下冰山一角的真实数据,像年龄,收入这样连续型的数据,肯定是需要先做个分箱操作的(先提一下)。
2 、简单的预处理
- 去重
- 重置索引
- 填补缺失值
这里家庭成员数(NumberOfDependents)直接使用的众数填充,方法比较简单粗暴。
data.drop_duplicates(inplace=True)
data.index=range(data.shape[0])
data['NumberOfDependents'].fillna(value=0,inplace=True)
3、使用随机森林填补缺失的月收入值
缺失的收入值都填充同样的值,肯定会对模型的准确率造成一定的影响。使用随机森林反向预测填补缺失值不失为一个好主意!
def fill_missing_rf(X,y,to_fill):
""" 使用随机森林填补一个特征的缺失值的函数
参数: X:要填补的特征矩阵
y:完整的,没有缺失值的标签
to_fill:字符串,要填补的那一列的名称 """
#构建我们的新特征矩阵和新标签
df = X.copy()
fill = df.loc[:,to_fill]
df = pd.concat([df.loc[:,df.columns != to_fill],pd.DataFrame(y)],axis=1)
# 找出我们的训练集和测试集
Ytrain = fill[fill.notnull()]
Ytest = fill[fill.isnull()]
Xtrain = df.iloc[Ytrain.index,:]
Xtest = df.iloc[Ytest.index,:]
#用随机森林回归来填补缺失值
from sklearn.ensemble import RandomForestRegressor as rfr
rfr = rfr(n_estimators=100).fit(Xtrain, Ytrain)
Ypredict = rfr.predict(Xtest)
return Ypredict
定义评分卡模型本身的特征和标签:
X = data.iloc[:,1:]
y = data["SeriousDlqin2yrs"]
X.shape
利用自定义函数计算缺失值:
#求得需要填补的缺失值
y_pred = fill_missing_rf(X,y,"MonthlyIncome")
#确认得到y_pred个数
y_pred.shape
#确认实际缺失值的个数
data.loc[:,"MonthlyIncome"].isnull().sum()
将得到的结果覆盖原始表格:
#确认个数没有问题,我们就可以将数据覆盖了
data.loc[data.loc[:,"MonthlyIncome"].isnull(),"MonthlyIncome"] = y_pred
data.info()
4、异常值处理
发现有年龄为0的用户,查看一下个数。
只有一个,直接删掉。
(data["age"] == 0).sum()
data = data[data["age"] != 0]
其他指标也有些奇奇怪怪的值,因为不懂业务,可以问一下业务人员,这里还是先统计一下,删除异常值。
# 有225个样本存在这样的情况,并且这些样本,我们观察一下,标签并不都是1,他们并不都是坏客户。
data[data.loc[:,"NumberOfTimes90DaysLate"] > 90]
data[data.loc[:,"NumberOfTimes90DaysLate"] > 90].count()
# 98 96 为异常值,应该把它们删除。
data.loc[:,"NumberOfTimes90DaysLate"].value_counts()
data = data[data.loc[:,"NumberOfTimes90DaysLate"] < 90]
# 一定要恢复索引
data.index = range(data.shape[0])
data.info()
# 查看各个分位数的数据情况
# 不做量纲统一和标准化,因为业务人员需要原本量纲作为参考。
data.describe([0.01,0.1,0.25,0.5,0.75,0.9,0.99]).T
5、处理标签分布不均
银行借贷,违约的人毕竟是相对少数。在样本严重分布不均的情况下,模型不做任何判断,准确率也可以高达99%。
为了使得样本分布均匀,可以使用下采样
和 上采样
。
因为这里的违约数据本来就不多,所以采用上采样了。