目录
使用C5.0决策树识别高风险银行贷款
实验目的
根据银行过去的历史数据,包括贷款者的主要特征、贷款金额、是否违约等数据样本,建立决策树模型,用于预测新样本是否可以贷款
实验要求
1、利用已发生的1000多条数据样本,20个条件属性包括支票余额、期限、信用记录、用途、贷款金额、储蓄余额、工作年限、利率、个人状态、债务、居住时间、财产、年龄、还贷计划、住房、信用卡数量、主从卡、有无电话、是否老外、工作;1个结论属性:是否违约。建立决策树分类模型;
2、对于新样本,根据准备贷款人的特征,预测输出审批通过或拒绝。
实验原理
基于R语言与数据样本,建立决策树模型。对模型进行训练、评估和优化。
实验仪器、设备、材料或软件等
1、Windows环境
2、R 3.6.3 安装
3、Rstudio 安装
已装跳过
实验内容及步骤
一、环境准备
- Windows 环境
- R3.6.3 安装
- RStudio 安装
二、收集数据
- 训练样本和测试样本(文末有链接)
- 将数据文件放入目录
三、数据预处理
-
载入数据文件
credit <- read.csv(“credit.csv”)
-
查看数据字段定义
str(credit)
-
看支票余额的分布情况
使用指令“table(credit$checking_balance)”,可以看到数据存在四个区间:“< 0 DM”、“> 200 DM”、“1 – 200 DM”和“unknown”。可见,其中有存款,说明风险较低。其中DM是德国马克,一种货币。
-
查看存款余额的分布情况
“table(credit$savings_balance)”查看存款余额的分布情况,可见五个区间:“< 100 DM”、“101 – 500 DM”、“501 – 1000DM”、“> 1000 DM”和“unknown”。说明银行有存款,贷款风险低。
-
查看货款期限的月分布情况
使用“summary(credit$months_loan_duration)”可以查看贷款期限的月分布情况
从数据中可以得知:最小值、第一四分位数、中位数、平均数、第三四分位数和最大值。可见其中Mean平均数(20.9)大于Median中位数(18.0),而第三四分位数(24.0)也大于中位数(18.0),则说明数据呈右偏分布,属于中存在一些较大的极端值。
通过直方图可以更好地观测数据“hist(credit$months_loan_duration)”:
从图中可以看出,数据中存在两个较大的极端值。
-
查看贷款金额的分布情况
使用指令“summary(credit$amount)”查看贷款金额的分布情况。从结果中可以看出Mean > Median,数据呈右偏分布。直方图如下:
-
违约分布情况
查看违约的分布情况,可以看出数据中是否违约的数量,其中1为正常、2为违约,那么也就是有30%的违约率。
-
生成随机数
设置随机种子“set.seed(12345)”。
-
随机排序样本
“Credit_rand <- credit[order(runif(1000)),]”,其中runif返回0`1之间1000个数;order按1000个数排列大小并返回位置。
-
拆分出训练集和测试集
训练集“credit_train <- credit_rand[1:900,]”:
测试集“credit_train <- credit_test[901,1000,]”:
图片所示只是其中一部分。
-
检查训练集和测试集的类别分布
分别使用指令“prop.table(table(credit_train$default))”和“prop.table(table(credit_rest$default))”来查看训练集和测试集的类别分布,可见两者均接近原始比例。
四、训练模型
-
安装C5.0算法包
install.packages(“C50”)
-
加载算法库
library(C50)
-
建模(属性+类别)
将类别转换为因子形式(default列中存在的yes或no转换):
credit_train$default <- as.factor(credit_train$default)
生成模型,排除结论属性
Credit_model <- C5.0(credit_train[-17],credit_train$default)
-
查看模型
credit_model
- credit_model:这是创建的C5.0分类模型的对象或名称。
- Call:这是模型的调用信息,显示了模型的构建方式。在这里,它指明了使用了C5.0算法,对credit_train[-17](即去掉第17列的特征)进行分类,目标变量是credit_train$default。
- Classification Tree:这表明构建的是一棵分类树,用于将数据分为不同的类别。
- Number of samples:这表示模型训练时使用的样本数量,这里是900个样本。
- Number of predictors:这是指模型用于进行分类的预测变量(特征)的数量,这里是20个。
- Tree size:这是生成的分类树的大小,即树中的节点数目,这里是57个。
- Non-standard options:这是一些非标准选项的提示信息,其中包括“attempt to group attributes”,这可能是指模型在构建树时尝试将某些属性(特征)进行分组或处理。
-
查看模型性能(训练样本)
summary(credit_model)
这里,树的大小为57,产生了127个错误,错误率为14.1%,则训练集准确度为85.9%。
五、评估模型
-
使用测试集样本进行预测
Credit_pred <- predict(credit_model,credit_test)
-
安装和加载混淆矩阵支持包
install.packages(“gmodels”)
library(gmodels)
-
使用测试集进行评估
CrossTable(credit_test$default,credit_pred,prop.chisq = FALSE,prop.c = FALSE,prop.r = FALSE,dnn = c('actual default','predicted default'))
从得出的交叉表中可以看出,在实际贷款违约状态为1(违约)的68个样本中,模型正确预测为1的有54个,模型错误预测为2的有14个。
- 54个被正确分类为违约,占了实际违约总数的0.540(54%)。
- 14个被错误分类为不违约,占了实际违约总数的0.140(14%)。
在实际贷款违约状态为2(不违约)的32个样本中,模型正确预测为2的有21个,模型错误预测为1的有11个。
- 21个被正确分类为不违约,占了实际不违约总数的0.210(21%)。
- 11个被错误分类为违约,占了实际不违约总数的0.110(11%)。
那么测试集的准确率为:54% + 21% = 75%。
六、优化模型
采用集成学习的方法,进行优化;本次使用AdaBoosting方法,简单说就是生成多颗决策树,对结果进行投票,准确率更高;生成多棵树的输入依据是样本权值的不同,每次迭代后对判断错误的样本升高权重。(Adaptive Boosting,自适应增强)
-
建模(属性+类别)
生成模型,排除结论属性。
credit_boost15 <- C5.0(credit_train[-17],credit_train$default,trials=15)
-
查看模型
credit_boost15
-
查看模型性能(训练样本)
summary(credit_boost15)
-
使用测试集样本进行预测
credit_pred_boost15 <- predict(credit_boost15,credit_test)
-
使用测试集进行评估
CrossTable(credit_test$default,credit_pred_boost15,prop.chisq = FALSE,prop.c = FALSE,prop.r = FALSE,dnn = c('actual default','predicted default'))
由图可知,在实际贷款违约状态为1(违约)的68个样本中,模型正确预测为1的有61个,模型错误预测为2的有7个。
- 61个被正确分类为违约,占了实际违约总数的0.610(61%)。
- 7个被错误分类为不违约,占了实际违约总数的0.070(7%)。
在实际贷款违约状态为2(不违约)的32个样本中,模型正确预测为2的有19个,模型错误预测为1的有13个。
- 19个被正确分类为不违约,占了实际不违约总数的0.190(19%)。
- 13个被错误分类为违约,占了实际不违约总数的0.130(13%)。
综上,测试集准确率:61% + 13% = 80%
七、预测新案例
-
读取新样本(部署预测)
credit_new <- read.csv(“credit_new.csv”)
-
预测
credit_pred_boost15_results <- predict(credit_boost15,credit_new)
-
显示预测结果
credit_pred_boost15_results
其中,Levels为1表示违约,为2表示不违约。
那么,也就是说针对新样本中的数据,模型得出结果针对1可以进行贷款,而针对2则不能进行贷款。
end
文中数据:
链接:https://pan.baidu.com/s/11o4YASVH_5opamlsGaaF_Q?pwd=5eo4
提取码:5eo4
学习记录,勿喷。