信贷模型分析-C5.0

信贷模型分析

(前面转载过一篇C5.0的文章,里面只有一些代码。我在运行中遇到过一些问题,现已解决,已将自己运行的代码放在此篇文章最后。并且将整个过程进行了一定的说明。)

使用C5.0决策树识别高风险银行贷款
因为决策树准确性高,以通俗易懂的方法建立统计模型的能力强,所以它广泛地应用于银行业。由于许多国家的政府机构密切监控贷款业务,所以银行的高管必须要能够解释为什么一个申请者被拒绝贷款申请,而其他人获得批准。此信息对于希望判断为何自己的信用等级是不符合要求的消费者也是有用的。

一、 数据初步分析

credit<-read.csv("/Users/wenfeng/Desktop/机器学习/机器学习实验2/credit.csv",stringsAsFactors = FALSE)
#检查数据
table(credit$checking_balance)
table(credit$savings_balance)

#五数分析
summary(credit$months_loan_duration)
summary(credit$amount)
#查看分类变量
table(credit$default)

在这里插入图片描述

较大的支票和储蓄账户余额与较小的贷款违约可能性相联系,初步看起来是一个安全的假设

#利用随机数来获取训练数据和测试数据,需要重复分析时,可选用set.seed()函数
#set.seed()函数是为了保证你随机生成的随机数前后一致,看效果.
#set.seed()括号里面的参数可以是任意数字,是代表你设置的第几号种子而已,不会参与运算,是个标记而已。
set.seed(12345)
credit_rand<-credit[order(runif(1000)),]
#credit_rand
#比较数据集
summary(credit$amount)
summary(credit_rand$amount)
head(credit$amount)
head(credit_rand$amount)

在这里插入图片描述

#分割数据集
credit_train<-credit_rand[1:900,]
credit_test<-credit_rand[901:1000,]
#查看分类变量的比例
prop.table(table(credit_train$default))
prop.table(table(credit_test$default))

在这里插入图片描述

这大体是一个平衡的分割,可以继续建立决策树了。
(假设银行已经根据贷款的金额对数据进行了排序,最大金额的贷款就排在了最后面,如果使用90%的数据作为训练集,剩下的10%座位测试集,那么我们就只能对小额贷款建立模型,这样是有问题的)

二、 模型训练

credit_train$default<-as.factor(credit_train$default)
credit_model <- C5.0(credit_train[-17], credit_train$default)
summary(credit_model)

在credit_train中,第17列是类变量default,所以需要将其作为一个自变量从训练数据框中删除,但将其作为用于分类的目标因子向量。
在这里插入图片描述

上面的输出结果显示:
1) 如果支票帐户余额是未知的,则划为不太可能违约类
2) 否则,如果少于0,或者1——200,或者200以上
3) 信用记录非常好,完美
4) 有多个受抚养人,则归为很可能违约类

输出的混淆矩阵如下,表示模型对训练数据错误分类的记录数:
在这里插入图片描述

由于决策树有过拟合的倾向,训练数据中报告的错误率可能过于乐观,因此,我们需要基于测试集来评估决策树模型。

三、 评估模型性能

credit_pred <- predict(credit_model, credit_test)
CrossTable(credit_test$default, credit_pred,
           prop.chisq = FALSE, prop.c = FALSE, prop.r = FALSE,
           dnn = c('actual default', 'predicted default'))

在这里插入图片描述

在100个贷款申请者中,模型只预测了57个申请者确实没有违约,模型的准确率为73%。但是该模型执政却越策了32个贷款违约者中的50%。这是一个潜在的严重的问题,我们需要对预测结果进一步改善。

四、提高模型性能
C5.0对C4.5改进的一种方法就是通过加入自适应增强算法。这是许多决策树构建的一个过程,然后这些决策树通过投票表决的方法为每个案例选择最佳的分类。
credit_boost10 <- C5.0(credit_train[-17], credit_train$default,
trials = 10)
credit_boost10
summary(credit_boost10)
在这里插入图片描述

由上述可以看出,仅犯错29个,与之前13.9%相比,有很大的进步。我们需要进一步在测试数据中看他有没有类似的提高。

credit_boost_pred10 <- predict(credit_boost10, credit_test)
CrossTable(credit_test$default, credit_boost_pred10,
prop.chisq = FALSE, prop.c = FALSE, prop.r = FALSE,
dnn = c(‘actual default’, ‘predicted default’))
在这里插入图片描述

在增强模型后,我们的总的错误率由27%下降到23%。合理地降低了近25%的错误率,但是,模型在预测方面仍然不够好。缺乏更大的提高的原因可能是选取的是一个较小的数据集

五、犯一些比其他错误更严重的错误
给一个很有可能违约的申请者一笔贷款是一种很严重的错误。一种减少错误地否定申请者数量的方法是拒绝大量处于边界线的申请者。数年内,如果贷款者从来没有还钱,那么银行所承受的大量损失就远远超过了他从有风险的贷款者身上的利息。为防止一颗决策树犯更严重的错误,我们能够将一个惩罚因子分配到不同类型的错误上。将其设置到一个代价矩阵中,用来指定每种错误相对于其他错误有多少辈的重要性。

## Making some mistakes more costly than others
# create a cost matrix
error_cost <- matrix(c(0, 1, 4, 0), nrow = 2)
error_cost

在这里插入图片描述

# apply the cost matrix to the tree
credit_cost <- C5.0(credit_train[-17], credit_train$default,
                          costs = error_cost)
credit_cost_pred <- predict(credit_cost, credit_test)

CrossTable(credit_test$default, credit_cost_pred,
           prop.chisq = FALSE, prop.c = FALSE, prop.r = FALSE,
           dnn = c('actual default', 'predicted default'))

在这里插入图片描述

与增强模型相比,犯错率达到了32%,但只有25%的贷款违约者被预测为非违约者,相对前面的模型有了很大提高。如果代价估算正确,那么增加错误肯定为代价、减少错误否定的方法是可以接受的。

最后,附完整代码如下:

#----------------------------------------
# 功能描述:演示C50建模过程
# 数据集:汉堡大学信贷模型,信贷数据
#
#----------------------------------------
#第一步:收集数据
# import the CSV file
credit<-read.csv("/Users/wenfeng/Desktop/机器学习/机器学习实验2/credit.csv",stringsAsFactors = FALSE)

install.packages("C50")
library(C50)

install.packages("gmodels")
library(gmodels)

install.packages("RWeka")
library(RWeka)

str(credit)
#检查数据
table(credit$checking_balance)
table(credit$savings_balance)

#五数分析
summary(credit$months_loan_duration)
summary(credit$amount)
#查看分类变量
table(credit$default)
#利用随机数来获取训练数据和测试数据,需要重复分析时,可选用set.seed()函数
#set.seed()函数是为了保证你随机生成的随机数前后一致,看效果.
#set.seed()括号里面的参数可以是任意数字,是代表你设置的第几号种子而已,不会参与运算,是个标记而已。
set.seed(12345)
credit_rand<-credit[order(runif(1000)),]
#credit_rand
#比较数据集
summary(credit$amount)
summary(credit_rand$amount)
head(credit$amount)
head(credit_rand$amount)
#分割数据集
credit_train<-credit_rand[1:900,]
credit_test<-credit_rand[901:1000,]
#查看分类变量的比例
prop.table(table(credit_train$default))
prop.table(table(credit_test$default))

#训练模型
#---------------------------------------------
# 创建分类器:
# m <- C5.0(train, class, trials = 1, costs = NULL)
# train: 一个包含训练数据的数据框
# class: 包含训练数据每一行的分类的一个因子向量
# trials: 为一个可选数值,用于控制自助法循环的次数(默认为1)
# costs: 为一个可选矩阵,用于给出与各种类型错误相对应的成本
# 该函数返回一个C5.0模型对象,该对象可用于预测
#
# 进行预测:
# p <- predict(m, test, type = "class")
# m: 由C5.0(train, class, trials = 1, costs = NULL) 训练的一个模型
# test: 一个包含测试数据的数据框,该数据框和用来创建分类器的训练数据有相同的特征
# type: 取值为“”或者“”标示预测是最可能的类别值或者是原始的预测概率
# 该函数返回一个向量,根据参数type的取值,该向量含有预测的类别值或者原始的预测概率
#
# example:
# credit_model <- C5.0(credit_train, loan_default)
# credit_prediction <- predict(credit_model, credit_test)
#----------------------------------------------
#构建决策数据模型
credit_train$default<-as.factor(credit_train$default)
credit_model <- C5.0(credit_train[-17], credit_train$default)
summary(credit_model)

credit_pred <- predict(credit_model, credit_test)
CrossTable(credit_test$default, credit_pred,
           prop.chisq = FALSE, prop.c = FALSE, prop.r = FALSE,
           dnn = c('actual default', 'predicted default'))

## Making some mistakes more costly than others
credit_boost10 <- C5.0(credit_train[-17], credit_train$default,
                       trials = 10)
credit_boost10
summary(credit_boost10)

credit_boost_pred10 <- predict(credit_boost10, credit_test)
CrossTable(credit_test$default, credit_boost_pred10,
           prop.chisq = FALSE, prop.c = FALSE, prop.r = FALSE,
           dnn = c('actual default', 'predicted default'))

## Making some mistakes more costly than others
# create a cost matrix
error_cost <- matrix(c(0, 1, 4, 0), nrow = 2)
error_cost

# apply the cost matrix to the tree
credit_cost <- C5.0(credit_train[-17], credit_train$default,
                    costs = error_cost)
credit_cost_pred <- predict(credit_cost, credit_test)

CrossTable(credit_test$default, credit_cost_pred,
           prop.chisq = FALSE, prop.c = FALSE, prop.r = FALSE,
           dnn = c('actual default', 'predicted default'))
  • 8
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值