基于用户行为贷款预测的大数据分析
一、选题的背景
随着世界经济的蓬勃发展和中国改革开放的逐渐深入,无论是企业的发展还是从人们消费观念的转变,贷款已经成为企业和个人解决经济问题的一种重要方式。随着银行各种贷款业务的推出和人们日益膨胀的需求,不良贷款也就是贷款违约的概率也随之激增。为了避免贷款违约,银行等金融机构在发放贷款时会对借款人的信用风险进行评估或打分,预测贷款违约的概率并根据结果做出是否发放贷款的判断。如何在发放贷款前有效的评价和识别借款人潜在的违约风险,是金融机构信用风险管理的基础和重要环节,用一套科学的模型和系统来判定贷款违约的风险性可以将风险最小化和利润最大化。
二、大数据分析设计方案
1.本数据集的数据内容与数据特征分析
字段名称 | 字段类型 | 字段说明 |
---|---|---|
Id | 数值型 | 用户Id |
Income | 数值型 | 收入 |
Age | 数值型 | 年龄 |
Experience | 数值型 | 多年的用户经验(年) |
Married/Single | 字符型 | 婚姻状况 |
House_Ownership | 字符型 | 房子情况(拥有还是租房或者都不是) |
Car_Ownership | 字符型 | 汽车情况(拥有或者租赁或者其他) |
Profession | 字符型 | 职业 |
CITY | 字符型 | 所在城市 |
STATE | 字符型 | 所在州 |
CURRENT_JOB_YRS | 数值型 | 在目前的工作岗位上有多年的经验 |
CURRENT_HOUSE_YRS | 数值型 | 在当前居所居住的年数 |
Risk_Flag | 数值型 | 拖欠贷款(0表示没有拖欠,1表示拖欠) |
2.数据分析的课程设计方案概述
(1)先对数据集的数据进行所需要的处理,并计算数据集中各种数据与用户贷款的相关性。
(2)对数据集每一种数据与’Risk_Flag'的关系进行python可视化处理,建立准确的用户贷款预测模型,以预测用户是否会贷款。
三、数据分析步骤
1.数据源
本次课程设计的数据集来源于数据科学科研和教学一体化平台。
附上网址:http://idatascience.cn/dataset-detail?table_id=100398
2.数据清洗
# 导入数据 data = pd.read_csv('基于用户行为的贷款预测训练集.csv', index_col=0) # 查看数据集长度 data.shape
显示结果:
数据预处理
# 缩写列名 data.columns = ['Inc', 'Age', 'Exper', 'M/S', 'House', 'Car', 'Pro', 'CITY', 'STATE', 'Job', 'Hous', 'R_F'] # 修改后的列名 print('修改后的列名:', data.columns) # 查看前5行数据 data.head()
显示结果
# 统计缺失值 data.isnull().sum().sum()
# 统计重复值 data.duplicated().sum()
# 删除重复值 data.drop_duplicates(inplace=True)
数据探索
# 查看数据类型 data.dtypes
# 描述性统计 data.describe()
3.大数据分析过程及采用的算法
利用统计分析、数据挖掘和机器学习方法,对数据进行分析处理,获得分析结果,是数据分析处理流程的重要步骤。
●常规的统计方法
●通过使用机器学习的方法,处理采集到的数据。分类、聚类、线性回归、随机森林
●使用的第三方库
如 sklearn 等,或其它
4.数据可视化
绘制是否拖欠人数统计
# 拖欠贷款的客户在客户中的分布柱形图 plt.figure(figsize=(5, 4)) plt.bar(['否'], data['R_F'].value_counts()[0], width=0.4) plt.bar(['是'], data['R_F'].value_counts()[1], width=0.4) plt.ylabel('客户数量', fontsize=12) plt.title('拖欠贷款', fontsize=12) plt.grid() plt.savefig('./image/拖欠贷款的客户在客户中的分布柱形图.png') plt.show()
绘制各年龄拖欠贷款人数统计柱形图
data3 = data[['Age', 'R_F', 'Pro']].groupby(['R_F', 'Age']).count() data3.reset_index(inplace=True) x = data3[data3['R_F'] == 0] plt.figure(figsize=(20,8)) plt.bar(range(len(x)), x['Pro'], tick_label=x['Age'], width=0.5) plt.xlabel('Age', fontsize=14) # 设置x轴标签 plt.ylabel('count', fontsize=14) # 设置y轴标签 plt.title('各年龄没拖欠贷款的人数统计', fontsize=18) plt.xticks(fontsize=14) # 设置x轴大小 plt.yticks(fontsize=14) # 设置y轴大小 plt.grid() # 显示网格线 plt.savefig('./image/各年龄没拖欠贷款的人数统计.png') plt.show()
x = data3[data3['R_F'] == 1] plt.figure(figsize=(20,8)) plt.bar(range(len(x)), x['Pro'], tick_label=x['Age'], width=0.5) plt.xlabel('Age', fontsize=14) # 设置x轴标签 plt.ylabel('count', fontsize=14) # 设置y轴标签 plt.title('各年龄拖欠贷款的人数统计', fontsize=18) plt.xticks(fontsize=14) # 设置x轴大小 plt.yticks(fontsize=14) # 设置y轴大小 plt.grid() # 显示网格线 plt.savefig('./image/各年龄拖欠贷款的人数统计.png') plt.show()
绘制婚姻状况与拖欠贷款的嵌套饼图
inner_x=data['M/S'].value_counts().values inner_label=data['M/S'].value_counts().index plt.figure(figsize=(10,10)) plt.pie(inner_x, labels=inner_label, radius=0.5, autopct='%.1f%%', labeldistance=0.25, textprops={'size':14}, colors=['#d0fefe','#cb416b','grey'], wedgeprops=dict(width=0.5,edgecolor='white')) plt.tight_layout() # 子图自适应位置 # 使用groupby函数分组计算每个活动展示对象年龄 data_6 = data[['Age', 'M/S', 'R_F']].groupby(['M/S', 'R_F']).count().reset_index().sort_values('M/S', ascending=False) outer_x=data_6['Age'] outer_label=data_6['R_F'] plt.pie(outer_x, labels=outer_label, radius=1, labeldistance=0.75, autopct='%.1f%%', textprops={'size':16}, colors=['#95d0fc','pink','#95d0fc','pink'], wedgeprops=dict(width=0.5,edgecolor='white')) plt.title('婚姻状况与拖欠贷款的占比', fontsize=14) plt.legend(inner_label,fontsize=15) plt.savefig('./image/婚姻状况与拖欠贷款的占比.png') plt.show()
绘制房子情况和拖欠贷款的关系
data4 = data[['Inc', 'House', 'R_F']].groupby(['R_F', 'House']).count() data4.reset_index(inplace=True) plt.figure(figsize=(10,8)) plt.bar(np.arange(len(data4[data4['R_F'] == 0])), data4[data4['R_F'] == 0]['Inc'], tick_label=data4[data4['R_F'] == 0]['House'], width=0.3, label='0', color='pink') plt.bar(np.arange(len(data4[data4['R_F'] == 1])) + 0.3, data4[data4['R_F'] == 1]['Inc'], width=0.3, label='1', color='y') plt.title('房子情况与拖欠贷款的的关系', fontsize=14) plt.xlabel('House', fontsize=18) plt.ylabel('Count', fontsize=18) plt.legend(fontsize=14) plt.xticks(np.arange(data4[data4['R_F'] == 0].shape[0]) + 0.3 / 2, data4[data4['R_F'] == 0]['House'], fontsize=14) # 使两个柱状条的中心位于轴点上 plt.yticks(fontsize=14) plt.grid() plt.savefig('./image/房子情况与拖欠贷款的的关系.png') plt.show()
绘制汽车情况个拖欠贷款的关系
data4 = data[['Inc', 'Car', 'R_F']].groupby(['R_F', 'Car']).count() data4.reset_index(inplace=True) plt.figure(figsize=(10,8)) plt.barh(np.arange(len(data4[data4['R_F'] == 0])), data4[data4['R_F'] == 0]['Inc'], tick_label=data4[data4['R_F'] == 0]['Car'], height=0.2, label='0', color='pink') plt.barh(np.arange(len(data4[data4['R_F'] == 1])) + 0.2, data4[data4['R_F'] == 1]['Inc'], height=0.2, label='1', color='y') plt.title('汽车情况与拖欠贷款的关系', fontsize=14) plt.xlabel('Count', fontsize=18) plt.ylabel('Car', fontsize=18) plt.legend(fontsize=14) plt.yticks(np.arange(data4[data4['R_F'] == 0].shape[0]) + 0.2 / 2, data4[data4['R_F'] == 0]['Car'], fontsize=14) # 使两个柱状条的中心位于轴点上 plt.xticks(fontsize=14) plt.grid() plt.savefig('./image/汽车情况与拖欠贷款的关系.png') plt.show()
特征工程
哑变量处理非数值数据
# 统计非数值数据 print(data['M/S'].unique()) print(data['House'].unique()) print(data['Car'].unique()) # 统计非数值数据 print(data['Pro'].nunique()) print(data['CITY'].nunique()) print(data['STATE'].nunique())
# 复制一遍data数据 data_2 = data.copy() # 替换非数值数据 data_2.replace({'single': 0, 'married': 1, 'rented': 0, 'norent_noown': 1, 'owned': 2, 'no': 0, 'yes': 1}, inplace=True)
# 哑变量处理 new_data = pd.get_dummies(data_2[['Pro', 'CITY', 'STATE']]) # 删除Pro、CITY、STATE列 del data_2['Pro'] del data_2['CITY'] del data_2['STATE'] print('删除特征后的数据', data_2.shape)
# 合并哑变量处理的数据 new_data_2 = pd.concat([data_2, new_data], axis=1) # 查看合并后的数据 new_data_2.head()
筛选与定义冲突数据
# 筛选租房、无车,但拖欠贷款的数据 exp1 = (new_data_2['House'] == 0) & (new_data_2['Car'] == 0) & (new_data_2['R_F'] == 1) # 筛选非租非拥有房屋、无车,但拖欠贷款的数据 exp2 = (new_data_2['House'] == 1) & (new_data_2['Car'] == 0) & (new_data_2['R_F'] == 1) # 筛选异常数据 new_data_2 = new_data_2.loc[(exp1 | exp2).apply(lambda x: not(x)), :] # 重新设置行索引 new_data_2.reset_index(inplace=True) # 筛选过后数据维度 new_data_2.shape
# 查看前五行数据 new_data_2.head()
特征筛选
corr_ = new_data_2.corr() # 计算相关系数非零的个数 print('相关系数非零个数为:',np.sum(sum(corr_.iloc[:,0] != 0))) mask = corr_.iloc[:,0] != 0 #返回一个相关系数是否为零的布尔数组 print('相关系数是否为零:\n',mask)
模型建立
from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error X = new_data_2.drop('R_F',axis=1) y = new_data_2['R_F'] # 划分数据集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1223)
# 训练集、测试集维度 print(X_train.shape) print(y_train.shape) print(X_test.shape) print(y_test.shape)
# 随机森林分类模型 from sklearn.ensemble import RandomForestClassifier # 构建模型 model_rf = RandomForestClassifier(oob_score=True, random_state=1223) # 拟合数据 model_rf.fit(X_train, y_train) # 预测结果 pre = model_rf.predict(X_test) y_train_pred = model_rf.predict(X_train) y_test_pred = model_rf.predict(X_test) print('训练集mse:',mean_squared_error(y_train,y_train_pred)) print('测试集mse:',mean_squared_error(y_test,y_test_pred)) print('准确率:',model_rf.oob_score_ )
# 决策树分类模型 from sklearn.tree import DecisionTreeClassifier # 构建模型 dt_model = DecisionTreeClassifier(criterion='entropy') # 模型拟合 dt_model.fit(X_train, y_train) # 预测结果 pre = dt_model.predict(X_test) y_train_pred = dt_model.predict(X_train) y_test_pred = dt_model.predict(X_test) print('训练集mse:',mean_squared_error(y_train,y_train_pred)) print('测试集mse:',mean_squared_error(y_test,y_test_pred))
# 朴素贝叶斯 from sklearn.naive_bayes import GaussianNB # 构建模型 model = GaussianNB() # 模型拟合 model.fit(X_train, y_train) # 预测结果 model.predict(X_test) y_train_pred = model.predict(X_train) y_test_pred = model.predict(X_test) print('训练集mse:',mean_squared_error(y_train,y_train_pred)) print('测试集mse:',mean_squared_error(y_test,y_test_pred))
参数调优
- n_estimators参数择优范围是: 1-101,步长为10。
- 十字交叉验证率选择最优n_estimators
param_test1 = {'n_estimators': range(1,101,10)} grid_search = GridSearchCV(estimator = RandomForestClassifier(random_state=1223), param_grid = param_test1, scoring = 'roc_auc', cv=10) grid_search.fit(X_train, y_train) print(grid_search.best_params_) print(grid_search.best_score_)
-- 因此,最佳的子决策树个数为91
- nmax_features参数择优范围是: 1-11,步长为1。
- 十字交叉验证率选择最优nmax_features
param_test2 = {'max_features': range(1,12,1)} grid_search_1 = GridSearchCV(estimator = RandomForestClassifier(n_estimators=grid_search.best_params_['n_estimators'], random_state=1223), param_grid = param_test2, scoring = 'roc_auc',cv=10) grid_search_1.fit(X_train, y_train) print(grid_search_1.best_params_) print(grid_search_1.best_score_)
-- 选择最大特征数为11
模型预测
# 经过参数优化后的随机森林 rfr_ = RandomForestClassifier(n_estimators=91, max_features=11, oob_score=True, random_state=1223) rfr_.fit(X_train,y_train) y_train_pred = rfr_.predict(X_train) y_test_pred = rfr_.predict(X_test) print('训练集mse:',mean_squared_error(y_train,y_train_pred)) print('测试集mse:',mean_squared_error(y_test,y_test_pred))
print('预测结果', y_test_pred) print('预测精度', rfr_.score(X_test, y_test))
模型评估
from sklearn.metrics import confusion_matrix # 混淆矩阵 print(confusion_matrix(y_test, y_test_pred))
#模型评估 from sklearn.metrics import classification_report,roc_auc_score,plot_roc_curve from sklearn.metrics import average_precision_score,plot_precision_recall_curve result = classification_report(y_test, y_test_pred) rfc_prob = rfr_.predict_proba(X_test)[:,1]
#输出AUC的值 auc_score = roc_auc_score(y_true=y_test,y_score=rfc_prob) #输出AP值 ap_score = average_precision_score(y_true=y_test,y_score=rfc_prob)
#画出PR曲线 plot_precision_recall_curve(estimator=rfr_,X=X_test,y=y_test,pos_label=1) plt.legend() plt.show()
#画出ROC曲线 plot_roc_curve(estimator=rfr_,X=X_test,y=y_test,pos_label=1) plt.legend() plt.show()
5.附完整程序源代码
1 # 导入第三方相关库 2 import pandas as pd 3 import numpy as np 4 import seaborn as sns 5 import matplotlib.pyplot as plt 6 import matplotlib.style as ms 7 from sklearn.model_selection import GridSearchCV 8 9 # 切换绘图风格 10 ms.use("seaborn-dark") 11 import warnings 12 warnings.filterwarnings("ignore") 13 # 用来正常显示中文标签 14 plt.rcParams['font.sans-serif'] = ['SimHei'] 15 # 用来正常显示负号 16 plt.rcParams['axes.unicode_minus'] = False 17 # 导入数据 18 data = pd.read_csv('基于用户行为的贷款预测训练集.csv', index_col=0) 19 # 查看数据集长度 20 data.shape 21 # 缩写列名 22 data.columns = ['Inc', 'Age', 'Exper', 'M/S', 23 'House', 'Car', 'Pro', 'CITY', 'STATE', 'Job', 'Hous', 'R_F'] 24 # 修改后的列名 25 print('修改后的列名:', data.columns) 26 27 # 查看前5行数据 28 data.head() 29 # 统计缺失值 30 data.isnull().sum().sum() 31 # 统计重复值 32 data.duplicated().sum() 33 34 # 删除重复值 35 data.drop_duplicates(inplace=True) 36 37 # 查看数据类型 38 data.dtypes 39 # 描述性统计 40 data.describe() 41 42 # 拖欠贷款的客户在客户中的分布柱形图 43 plt.figure(figsize=(5, 4)) 44 plt.bar(['否'], data['R_F'].value_counts()[0], width=0.4) 45 plt.bar(['是'], data['R_F'].value_counts()[1], width=0.4) 46 plt.ylabel('客户数量', fontsize=12) 47 plt.title('拖欠贷款', fontsize=12) 48 plt.grid() 49 plt.savefig('./image/拖欠贷款的客户在客户中的分布柱形图.png') 50 plt.show() 51 data3 = data[['Age', 'R_F', 'Pro']].groupby(['R_F', 'Age']).count() 52 data3.reset_index(inplace=True) 53 x = data3[data3['R_F'] == 0] 54 55 plt.figure(figsize=(20,8)) 56 plt.bar(range(len(x)), x['Pro'], tick_label=x['Age'], width=0.5) 57 # 设置x轴标签 58 plt.xlabel('Age', fontsize=14) 59 60 # 设置y轴标签 61 plt.ylabel('count', fontsize=14) 62 plt.title('各年龄没拖欠贷款的人数统计', fontsize=18) 63 64 # 设置x轴大小 65 plt.xticks(fontsize=14) 66 # 设置y轴大小 67 plt.yticks(fontsize=14) 68 # 显示网格线 69 plt.grid() 70 plt.savefig('./image/各年龄没拖欠贷款的人数统计.png') 71 plt.show() 72 x = data3[data3['R_F'] == 1] 73 74 plt.figure(figsize=(20,8)) 75 plt.bar(range(len(x)), x['Pro'], tick_label=x['Age'], width=0.5) 76 # 设置x轴标签 77 plt.xlabel('Age', fontsize=14) 78 # 设置y轴标签 79 plt.ylabel('count', fontsize=14) 80 plt.title('各年龄拖欠贷款的人数统计', fontsize=18) 81 # 设置x轴大小 82 plt.xticks(fontsize=14) 83 # 设置y轴大小 84 plt.yticks(fontsize=14) 85 plt.grid() # 显示网格线 86 plt.savefig('./image/各年龄拖欠贷款的人数统计.png') 87 plt.show() 88 inner_x=data['M/S'].value_counts().values 89 inner_label=data['M/S'].value_counts().index 90 plt.figure(figsize=(10,10)) 91 plt.pie(inner_x, 92 labels=inner_label, 93 radius=0.5, 94 autopct='%.1f%%', 95 labeldistance=0.25, 96 textprops={'size':14}, 97 colors=['#d0fefe','#cb416b','grey'], 98 # 子图自适应位置 99 wedgeprops=dict(width=0.5,edgecolor='white')) 100 plt.tight_layout() 101 102 # 使用groupby函数分组计算每个活动展示对象年龄 103 data_6 = data[['Age', 'M/S', 'R_F']].groupby(['M/S', 'R_F']).count().reset_index().sort_values('M/S', ascending=False) 104 outer_x=data_6['Age'] 105 outer_label=data_6['R_F'] 106 plt.pie(outer_x, 107 labels=outer_label, 108 radius=1, 109 labeldistance=0.75, 110 autopct='%.1f%%', 111 textprops={'size':16}, 112 colors=['#95d0fc','pink','#95d0fc','pink'], 113 wedgeprops=dict(width=0.5,edgecolor='white')) 114 plt.title('婚姻状况与拖欠贷款的占比', fontsize=14) 115 plt.legend(inner_label,fontsize=15) 116 plt.savefig('./image/婚姻状况与拖欠贷款的占比.png') 117 plt.show() 118 data4 = data[['Inc', 'House', 'R_F']].groupby(['R_F', 'House']).count() 119 data4.reset_index(inplace=True) 120 121 plt.figure(figsize=(10,8)) 122 plt.bar(np.arange(len(data4[data4['R_F'] == 0])), data4[data4['R_F'] == 0]['Inc'], 123 tick_label=data4[data4['R_F'] == 0]['House'], width=0.3, label='0', color='pink') 124 plt.bar(np.arange(len(data4[data4['R_F'] == 1])) + 0.3, data4[data4['R_F'] == 1]['Inc'], width=0.3, 125 label='1', color='y') 126 plt.title('房子情况与拖欠贷款的的关系', fontsize=14) 127 plt.xlabel('House', fontsize=18) 128 plt.ylabel('Count', fontsize=18) 129 plt.legend(fontsize=14) 130 plt.xticks(np.arange(data4[data4['R_F'] == 0].shape[0]) + 0.3 / 2, data4[data4['R_F'] == 0]['House'], fontsize=14) 131 132 133 # 使两个柱状条的中心位于轴点上 134 plt.yticks(fontsize=14) 135 plt.grid() 136 plt.savefig('./image/房子情况与拖欠贷款的的关系.png') 137 plt.show() 138 data4 = data[['Inc', 'Car', 'R_F']].groupby(['R_F', 'Car']).count() 139 data4.reset_index(inplace=True) 140 141 plt.figure(figsize=(10,8)) 142 plt.barh(np.arange(len(data4[data4['R_F'] == 0])), data4[data4['R_F'] == 0]['Inc'], 143 tick_label=data4[data4['R_F'] == 0]['Car'], height=0.2, label='0', color='pink') 144 plt.barh(np.arange(len(data4[data4['R_F'] == 1])) + 0.2, data4[data4['R_F'] == 1]['Inc'], height=0.2, 145 label='1', color='y') 146 plt.title('汽车情况与拖欠贷款的关系', fontsize=14) 147 plt.xlabel('Count', fontsize=18) 148 plt.ylabel('Car', fontsize=18) 149 plt.legend(fontsize=14) 150 151 # 使两个柱状条的中心位于轴点上 152 plt.yticks(np.arange(data4[data4['R_F'] == 0].shape[0]) + 0.2 / 2, data4[data4['R_F'] == 0]['Car'], fontsize=14) 153 plt.xticks(fontsize=14) 154 plt.grid() 155 plt.savefig('./image/汽车情况与拖欠贷款的关系.png') 156 plt.show() 157 158 159 # 统计非数值数据 160 print(data['M/S'].unique()) 161 print(data['House'].unique()) 162 print(data['Car'].unique()) 163 164 # 统计非数值数据 165 print(data['Pro'].nunique()) 166 print(data['CITY'].nunique()) 167 print(data['STATE'].nunique()) 168 169 # 复制一遍data数据 170 data_2 = data.copy() 171 172 # 替换非数值数据 173 data_2.replace({'single': 0, 'married': 1, 'rented': 0, 174 'norent_noown': 1, 'owned': 2, 'no': 0, 'yes': 1}, inplace=True) 175 176 # 哑变量处理 177 new_data = pd.get_dummies(data_2[['Pro', 'CITY', 'STATE']]) 178 # 删除Pro、CITY、STATE列 179 del data_2['Pro'] 180 del data_2['CITY'] 181 del data_2['STATE'] 182 print('删除特征后的数据', data_2.shape) 183 184 # 合并哑变量处理的数据 185 new_data_2 = pd.concat([data_2, new_data], axis=1) 186 # 查看合并后的数据 187 new_data_2.head() 188 189 # 筛选租房、无车,但拖欠贷款的数据 190 exp1 = (new_data_2['House'] == 0) & (new_data_2['Car'] == 0) & (new_data_2['R_F'] == 1) 191 # 筛选非租非拥有房屋、无车,但拖欠贷款的数据 192 exp2 = (new_data_2['House'] == 1) & (new_data_2['Car'] == 0) & (new_data_2['R_F'] == 1) 193 # 筛选异常数据 194 new_data_2 = new_data_2.loc[(exp1 | exp2).apply(lambda x: not(x)), :] 195 196 # 重新设置行索引 197 new_data_2.reset_index(inplace=True) 198 199 # 筛选过后数据维度 200 new_data_2.shape 201 202 # 查看前五行数据 203 new_data_2.head() 204 corr_ = new_data_2.corr() 205 # 计算相关系数非零的个数 206 print('相关系数非零个数为:',np.sum(sum(corr_.iloc[:,0] != 0))) 207 mask = corr_.iloc[:,0] != 0 #返回一个相关系数是否为零的布尔数组 208 print('相关系数是否为零:\n',mask) 209 from sklearn.model_selection import train_test_split 210 from sklearn.metrics import mean_squared_error 211 X = new_data_2.drop('R_F',axis=1) 212 y = new_data_2['R_F'] 213 # 划分数据集 214 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1223) 215 # 训练集、测试集维度 216 print(X_train.shape) 217 print(y_train.shape) 218 print(X_test.shape) 219 print(y_test.shape) 220 221 # 随机森林分类模型 222 from sklearn.ensemble import RandomForestClassifier 223 # 构建模型 224 model_rf = RandomForestClassifier(oob_score=True, random_state=1223) 225 # 拟合数据 226 model_rf.fit(X_train, y_train) 227 # 预测结果 228 pre = model_rf.predict(X_test) 229 230 y_train_pred = model_rf.predict(X_train) 231 y_test_pred = model_rf.predict(X_test) 232 print('训练集mse:',mean_squared_error(y_train,y_train_pred)) 233 print('测试集mse:',mean_squared_error(y_test,y_test_pred)) 234 print('准确率:',model_rf.oob_score_ ) 235 # 决策树分类模型 236 from sklearn.tree import DecisionTreeClassifier 237 238 # 构建模型 239 dt_model = DecisionTreeClassifier(criterion='entropy') 240 # 模型拟合 241 dt_model.fit(X_train, y_train) 242 # 预测结果 243 pre = dt_model.predict(X_test) 244 245 y_train_pred = dt_model.predict(X_train) 246 y_test_pred = dt_model.predict(X_test) 247 print('训练集mse:',mean_squared_error(y_train,y_train_pred)) 248 print('测试集mse:',mean_squared_error(y_test,y_test_pred)) 249 # 朴素贝叶斯 250 from sklearn.naive_bayes import GaussianNB 251 # 构建模型 252 model = GaussianNB() 253 # 模型拟合 254 model.fit(X_train, y_train) 255 # 预测结果 256 model.predict(X_test) 257 258 y_train_pred = model.predict(X_train) 259 y_test_pred = model.predict(X_test) 260 print('训练集mse:',mean_squared_error(y_train,y_train_pred)) 261 print('测试集mse:',mean_squared_error(y_test,y_test_pred)) 262 param_test1 = {'n_estimators': range(1,101,10)} 263 grid_search = GridSearchCV(estimator = RandomForestClassifier(random_state=1223), param_grid = param_test1, 264 scoring = 'roc_auc', cv=10) 265 grid_search.fit(X_train, y_train) 266 print(grid_search.best_params_) 267 print(grid_search.best_score_) 268 param_test2 = {'max_features': range(1,12,1)} 269 grid_search_1 = GridSearchCV(estimator = RandomForestClassifier(n_estimators=grid_search.best_params_['n_estimators'], 270 random_state=1223), param_grid = param_test2, scoring = 'roc_auc',cv=10) 271 grid_search_1.fit(X_train, y_train) 272 print(grid_search_1.best_params_) 273 print(grid_search_1.best_score_) 274 275 # 经过参数优化后的随机森林 276 rfr_ = RandomForestClassifier(n_estimators=91, max_features=11, oob_score=True, random_state=1223) 277 rfr_.fit(X_train,y_train) 278 y_train_pred = rfr_.predict(X_train) 279 y_test_pred = rfr_.predict(X_test) 280 print('训练集mse:',mean_squared_error(y_train,y_train_pred)) 281 print('测试集mse:',mean_squared_error(y_test,y_test_pred)) 282 print('预测结果', y_test_pred) 283 print('预测精度', rfr_.score(X_test, y_test)) 284 from sklearn.metrics import confusion_matrix 285 286 # 混淆矩阵 287 print(confusion_matrix(y_test, y_test_pred)) 288 289 #模型评估 290 from sklearn.metrics import classification_report,roc_auc_score,plot_roc_curve 291 from sklearn.metrics import average_precision_score,plot_precision_recall_curve 292 293 result = classification_report(y_test, y_test_pred) 294 rfc_prob = rfr_.predict_proba(X_test)[:,1] 295 296 #输出AUC的值 297 auc_score = roc_auc_score(y_true=y_test,y_score=rfc_prob) 298 #输出AP值 299 ap_score = average_precision_score(y_true=y_test,y_score=rfc_prob) 300 #画出PR曲线 301 plot_precision_recall_curve(estimator=rfr_,X=X_test,y=y_test,pos_label=1) 302 plt.legend() 303 plt.show() 304 #画出ROC曲线 305 plot_roc_curve(estimator=rfr_,X=X_test,y=y_test,pos_label=1) 306 plt.legend() 307 plt.show()
四、总结
一个组织想要预测谁是消费贷款产品的潜在违约者。他们有基于他们所观察到的顾客历史行为的数据。因此,当他们获得新客户时,他们希望预测谁的风险更大,谁没有。所以想寻找数据集所提供的用户基本信息,消费行为,还款情况等,建立准确的用户贷款预测模型,以预测用户是否会贷款。通过个人行为贷款预测分析能够发现这与汽车,房子和婚姻等信息息息相关。
在分析过程当中最困难还是模型的训练和不断踩坑的分析图,通过不断尝试各种方法查资料等最终实现了这些,将来我将继续学习希望在未来能够对数据分析更加了解。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署