python在⾦融领域的应⽤-信⽤卡评分模型
random在python中的意思⼀、背景
信⽤卡评分是以⼤量数据的统计结果为基础,根据客户提供的资料和历史数据对客户的信⽤进⾏评估,评分卡模型⼀般分为三类:A 卡:申请评分卡,B卡:⾏为评分卡,C卡:催收评分卡。
本⽂主要涉及的为申请评分卡,申请评分卡的⽬标主要是区分好客户和坏客户,评分卡的结果为⾼分数的申请⼈意味着⽐低分数的申请⼈的风险低。
⼆、项⽬流程
数据源分析
数据源⾃于kaggle Give Me Some Credit 15万条样本数据,10个影响客户好坏的特征值,特征属性主要包括:
==基本特征==:借款⼈的年龄
==偿还债务能⼒==:借款⼈收⼊,负债率等
==信⽤往来==:两年内35-59天逾期次数,60-89天逾期次数等;
==财产状况==:包括了开放式信贷和贷款数量、不动产贷款或额度数量;
==其他因素==:借贷⼈的家属数量;
三、数据预处理
1.⾸先导⼊数据,对数据集相关情况进⾏了解,是否存在缺失值;
datasets = pd.read_csv('./cs_training.csv')
del datasets['Unnamed: 0']
#查看缺失值
print(datasets.info())
#查看数据集的详细信息
print(datasets.describe())
其中MonthlyIncome和NumberOfDependents存在缺失值
2.对异常值进⾏分析,发现年龄和逾期还款次数存在异常值过滤掉为0 的数据,删除逾期还款次数异常值;
#对年纪进⾏分析发现其中有为0的异常值,将其过滤
fig,ax = plt.subplots(figsize=(5,4))
ax.boxplot(datasets['age'])
plt.xlabel('Age')
plt.ylabel('Values')
plt.show()
datasets = datasets[datasets['age']>0]
逾期还款次数
columns_worse = ['NumberOfTime30-59DaysPastDueNotWorse','NumberOfTimes90DaysLate','NumberOfTime60-89DaysPastDueNotWorse'] datasets.boxplot(column=columns_worse)
plt.show()
#剔除异常值后数值分布
datasets = datasets.drop(datasets[datasets['NumberOfTime30-59DaysPastDueNotWorse']>80].index)
columns_worse = ['NumberOfTime30-59DaysPastDueNotWorse','NumberOfTimes90DaysLate','NumberOfTime60-89DaysPastDueNotWorse'] datasets.boxplot(column=columns_worse)
plt.show()
3.对缺失值进⾏处理,对于NumberOfDependents数据,确实值相对较少,直接删除不影响整体数据,对于MonthlyIncome缺失值较多,采⽤随机森林预测的⽅法对缺失值进⾏填补;
#删除NumberOfDependents为空的数据
datasets = datasets.drop(datasets[datasets['NumberOfDependents'].isnull()].index)
#对MonthlyIncome缺失值预测
#数据集剔除因变量
df = datasets.iloc[:,[1,2,3,4,5,6,7,8,9,10]]
#需要进⾏预测的数据集
uknown = df[df['MonthlyIncome'].isnull()].iloc[:,[0,1,2,3,5,6,7,8,9]]
#训练集数据
known = df[~df['MonthlyIncome'].isnull()]
#⾃变量数据
known_X = known.iloc[:,[0,1,2,3,5,6,7,8,9]]
#因变量数据
known_Y = known['MonthlyIncome']
#采⽤随机森林算法,⾸先是进⾏参数的选取
def params_fit(train_X,train_Y):
s_list = []
i_lists = []
for i in range(100,200,10):
rf = RandomForestRegressor(n_estimators=i,random_state=42)
scores = cross_val_score(rf,train_X,train_Y,cv=3).mean()
s_list.append(scores)
i_lists.append(i)
max_scores = max(s_list)
max_es = s_list.index(max_scores)*10+100
print(s_list)
print('====分割线=====')
# 获取最⼤深度
paras = {'max_depth':np.arange(3,10,1)}
rfs = RandomForestRegressor(n_estimators=max_es,random_state=42)
gs = GridSearchCV(rfs,param_grid=paras,cv=3)
fun = gs.fit(train_X,train_Y)
sc = fun.best_score_
para = fun.best_params_
result = rf.predict(test_X)
r2 = r2_score(test_Y,result)
print(para)
return max_es,para['max_depth']
paras = params_fit(known_X,known_Y)
#获取评估器个数和最⼤深度值
print(paras)
#对缺失值填补
def set_missing(known_X,known_Y,uknown,datasets):
rf = RandomForestRegressor(n_estimators=150,max_depth=3,random_state=42) rf.fit(known_X,known_Y)
result = rf.predict(uknown)
datasets.loc[datasets['MonthlyIncome'].isnull(),'MonthlyIncome'] = result
return datasets
#缺失值填补后的数据集
dataset = set_missing(known_X,known_Y,uknown,datasets)
print(dataset.shape)
print(dataset.info())
四、数据探索性分析
查看年龄的分布
sns.distplot(dataset['age'])
plt.show()
统计好/坏客户分布
values = dataset['SeriousDlqin2yrs'].value_counts()
index = list(values.index)
value = list(values)
fig,ax = plt.subplots()
fig.set_size_inches(7,5)
for a,b in zip(index,value):
<(a,b+0.01,b,ha='center',va='bottom')
plt.show()
根据正常的逻辑0为好客户 1为坏客户 将其转换成常规的表达⽅式 0为坏客户 1 为好客户,
在数据中0为好客户,1为坏客户,将其转换成常规的表⽰⽅法,1为好客户0为坏客户。
#根据正常的逻辑0为好客户 1为坏客户将其转换成常规的表达⽅式 0为坏客户 1 为好客户
datasets['SeriousDlqin2yrs'] = 1- datasets['SeriousDlqin2yrs']
print(datasets['SeriousDlqin2yrs'].value_counts())
五、变量选取
特征变量的选择即如何选择合适的变量,对于数据分析和数据建模⾮常重要,选择合适的变量对模型性能的提升扮演着⾄关重要的⾓⾊,在本⽂中是采⽤的是将模型变量进⾏WOE编码⽅式离散化,根据IV值进⾏变量选择然后建⽴逻辑回归模型。
5.1变量分箱
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论