R语言实现 分而治之——应用决策树

2007——2008年的全球金融危机凸显了透明度和严密性在银行业务中的重要性。由于信贷供应受到了限制,所以银行正日益紧缩其贷款体系,转向机器学习来更准确地识别高风险贷款。
因为决策树的准确性高,以通俗易懂的方法建立统计模型的能力强,所以它广泛地应用于银行业。由于许多国家的政府机构密切监控贷款业务,所以银行的高管必须能够解释为什么一个申请者被拒绝贷款申请,而其他人获得批准。此信息对于希望判断为何自己的信用评级是不符合要求的消费者也是有用的。
通过电话和网络,将自动化的信用评分模型用于即时进行的信贷审批是很有可能的。在本节中,我们将使用C5.0决策树建立一个简单的信贷审批模型。我们也将看到应该如何调整模型的结果,从而使导致机构财务损失的误差最小化。
在这里插入图片描述

Step 1: Exploring and preparing the data ----

我们信贷模型背后的思想就是确定使得申请者违约风险较高的因素,因此,我们需要获得大量的过去银行贷款的数据,以及贷款是否违约,同时还需要申请者的信息。

credit <- read.csv("F:\\rwork\\Machine Learning with R (2nd Ed.)\\Chapter 05\\credit.csv")
str(credit)

在这里插入图片描述
让我们来看看table()函数对贷款的一对特征输出的一些结果,似乎很有可能预测出违约者。特征(变量) checking_balance 和savings_balance 表示支票和储蓄账户余额,并记录为分类变量:

table(credit$checking_balance)
table(credit$savings_balance)

在这里插入图片描述
由于贷款数据是从德国获取的,所以货币以德国马克(DeutscheMark,DM)为单位。较大的支票和储蓄账户余额应该与较小的贷款违约可能性相联系,这看起来是–个安全的假设。
有些贷款的特征是数值型变量,比如贷款期限( months_loan_duration)和信贷申请的金额(amount)。

summary(credit$months_loan_duration)
summary(credit$amount)

在这里插入图片描述
贷款金额介于25018424马克之间,贷款期限为472个月,其贷款期限的中位数为18个月,贷款金额的中位数为2320马克。
变量default表示贷款申请者是否未能符合约定的付款条件而陷人违约。所有申请贷款的有30%陷入违约:

table(credit$default)

银行贷款给违约率高的客户是不可取的,因为这意味着很有可能银行不能完全收回它的投资。如果我们成功,我们的模型将能识别可能违约的申请者,从而减少违约的数量。

随机地从1~1000的整数序列中选择900个值

set.seed(123)
train_sample <- sample(1000, 900)
str(train_sample)

在这里插入图片描述
将数据划分为训练数据( 90%或者900条记录)和测试数据( 10%或者100条记录)

credit_train <- credit[train_sample, ]
credit_test  <- credit[-train_sample, ]
prop.table(table(credit_train$default))
prop.table(table(credit_test$default))

在这里插入图片描述

Step 2: Training a model on the data ----

#install.packages('C50')
library(C50)
credit_model <- C5.0(credit_train[-17], credit_train$default)
credit_model

在这里插入图片描述

summary(credit_model)

在这里插入图片描述
上面的输出显示了决策树的前几个分枝,前4行可以用通俗易懂的语言来表达:
1)如果支票账户余额是未知的,则归类为不太可能违约。
2)否则,如果支票账户余额少于0马克,或者1 ~ 200马克之间。
3)信用记录非常好,甚至完美,归类为很有可能违约。
括号中的数字表示符合该决策准则的案例的数量以及根据该决策不正确分类的案例的数量。例如,在第一行中,(412/54) 表示有412个案例符合该决策条件,有54个案例被错误地归类为no,也就是说不太可能违约。换句话说,就是有54个申请者确实违约了,尽管模型的预测与此相反。
在这里插入图片描述
输出的部分说明模型对除了900个训练实例中的99个实例以外的所有实例进行了正确的分类,错误率为11%。

Step 3: Evaluating model performance ----

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

在这里插入图片描述

在100个贷款申请者的记录测试中,我们的模型正确预测了55个申请者确实没有违约,而15个申请者确实违约了,模型的准确率为73%,而错误率为27%。在训练数据上模型的性能略差,但并不令人意外,因为对于未知的数据,模型的性能往往会差些。

Step 4: Improving model performance ----

我们模型的错误率很可能过高而不能将其应用于实时的信用评估申请中。事实上,如果该模型对每一个测试案例的预测结果为“没有违约”( no default), 那么此时模型的正确率将为68%,结果并不比我们的模型差太多,但需要少得多的努力!从900个案例中预测贷款违约似乎是一个具有挑战性的问题。

更糟糕的是,我们的模型在识别贷款违约申请者上的性能尤其不佳。幸运的是,有几种简单的方法可以用来调整C5.0算法,这可能有助于提高模型的性能,无论是整体性能还是对于更大代价的错误。

C5.0算法对C4.5算法改进的一.种方法就是通过加入自适应增强( adaptive boosting) 算法。这是许多决策树构建的一个过程,然后这些决策树通过投票表决的方法为每个案例选择最佳的分类。

由于boosting算法可以更广泛应用于任何机器学习算法,所以在本书的第11章中有该算法的详细信息。就目前而言,只需要说明boosting算法植根在这样一种概念中:通过将很多能力较弱的学习算法组合在-一起,就可以创建一个团队,这比任何一个单独的学习算法都强得多。每–个模型都有–组特定的优点和缺点,对于特定的问题,可能更好,也可能更差,而使用优点和缺点互补的多种学习方法的组合,可以显著地提高分类器的准确性。
C5.0()函数可以很轻松地将boosting 算法添加到C5.0决策树中。我们只需要添加一一个额外的参数trials,表示在模型增强团队中使用的独立决策树的数量。参数trials设置了一个上限,如果该算法识别出额外的试验似乎并没有提高模型的准确性,那么它将停止添加决策树。我们将开始于10个试验(trials=10)一个已经成为事实标准的数字,因为研究表明,这能降低关于测试数据大约25%的错误率。

credit_boost10 <- C5.0(credit_train[-17], credit_train$default,
                       trials = 10)
credit_boost10

在这里插入图片描述
通过10次迭代,决策树变小。如果愿意,可以在命令提示符下,通过输入summary(credit_ boost10)看到所有的10棵决策树。
让我们来看看我们训练数据的表现:

summary(credit_boost10)

在这里插入图片描述

在900个训练案例中,该分类器犯了13个错误,错误率为1.4%。我们注意到在加入boosting算法之前,训练案例的错误率为11%。因此,与之前相比,这是很大的提高。然而,这仍有待观察,我们是否能在测试数据中看到类似的提高呢?让我们一起来看看:

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%上升到了到现在的30%。可能是由于我们采用的是一个相对较小的训练数据集,也可能这本身就是一个很难解决的问题。
给一个很有可能违约的申请者一笔贷款是一 种很严重的错误。一种减少错误地否定申请者数量的方法是拒绝大量处于边界线的申请者。数年内,如果贷款者从来没有还钱,那么银行所蒙受的大量损失就远远超过了它从有风险的贷款者身上赚到的利息值。
为了防止一棵决策树犯更严重的错误,C5.0算法能够允许我们将一个惩罚因子分配到不同类型的错误上。这些惩罚因子设定在-一个代价矩阵中,用来指定每种错误相对于其他任何错误有多少倍的严重性。假设我们认为一个贷款违约者使银行损失了4倍,不亚于一个错失的机遇,则代价矩阵可以定义为:

matrix_dimensions <- list(c("no", "yes"), c("no", "yes"))
names(matrix_dimensions) <- c("predicted", "actual")
error_cost <- matrix(c(0, 1, 4, 0), nrow = 2, dimnames = matrix_dimensions)

将其应用到我们的决策树中。我们将以其他方式应用与前面一样的步骤:

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'))

在这里插入图片描述
与最好的增强模型相比,这个版本的模型整体上犯了更多的错误:,相对于最好的增强模型的27%,这里为33%。而在这个模型中,只有65%的贷款违约者被预测为违约者。如果我们的代价估算是准确的,那么以增加错误肯定为代价,减少错误否定的这种折中是可以接受的。

欢迎关注微信公众号
在这里插入图片描述

发布了13 篇原创文章 · 获赞 16 · 访问量 1918

猜你喜欢

转载自blog.csdn.net/qq_44658157/article/details/103969071