决策树算法,从名字中也可以理解到该算法是以树形结构建立模型的,该算法主要根据分层和分割的方式将预测变量空间划分为一系列简单区域。对某个给定的待预测的观测值,用它所属区域中训练的平均值或众数进行预测。决策树可以分为回归树和分类树,前者用于预测数值,后者用于预测类别。

一、回归树

我们若需要预测数值时,就需要使用到回归树。而创建回归树的步骤也就分为两大部分:
1、将预测变量空间分割成i个不重叠的区域R_1,R_2....R_i。
2、对落入区域R_i的每个观测值作同样的预测,预测值等于R_i上训练集的响应值的简单算术平均。

看上去比较难理解,但是其实是很简单的道理。比如第一步,假设某数据集中有三个数值型变量,现在按照某种方法(后面会介绍)将前两变量划分区域,第三个变量为需要预测的变量:

然后就是第二步,根据预测样本两个变量的取值划分到相应的区域中,然后该样本第三变量的预测值就为区域中的已知样本第三变量的简单算术平均。

现在需要解决的问题是:如何合理地划分区域,构建不重叠的区域R_1,R_2....R_i

理论上区域可以按照任意规则划分,但是出于模型简化和增强可解释性的考虑,我们将划分区域的目标设定为找到是模型目标变量的残差平方和RSS最小的矩形区域R_1,R_2...R_i,RSS定义为:

其中Y_Ri为第i个区域中训练集预测变量的平均值。但是我们想将划分区域的所有可能计算得到RSS之后比较,是不可能的,尤其当变量个数很多的时候。因此只能采用一种自上而下的贪婪算法:递归二叉分裂

执行递归二分裂算法时,需先选择预测变量X_a和分割点s,将变量空间分为两个区域
R1(a,s)={x|x_a<s} 和 R2(a,s)={x|x_a>=s},使RSS尽可能少。更进一步,就是我们要找到a和s,使得下面的式子取得最小值:

其中Y_R1是R1(a,s)中训练集的平均值,Y_R2是R2(a,s)中训练集的平均值。我们对每个区域的分割都采用相同的方法,使之每次分割的区域RSS都能达到最小。当然对于区域的分列我们也要给定一个条件,不然会无限地分裂下去,比如说当分裂区间包含的观测值个数不大于10时,分裂停止。

按照上面的分裂方式,虽然在训练集中取得良好的预测,却很有可能造成数据的过拟合。产生这种情况的原因在于树可能过于复杂,换言之就是划分的区域太多。针对这一问题,我们可以设定仅当分裂会使RSS的减少量超过预先设定的阈值才进行分裂。而另外一种更为常用的方法是通过剪枝得到子树,剪枝方法分为预剪枝和后剪枝两大类,后面介绍完决策树之后会说一下这个剪枝的方法。

二、分类树

分类数与回归树本质区别在于预测变量为定性变量,之前的回归树是返回终端树(所落区域)平均值,而分类树则是返回出现次数最多的类,这有点像K近邻的思想,因此在解释分类树结果的时候,我们不仅对预测的类别感兴趣,同时也会关注区域内各个类所占的比例。分类树在分裂的过程中同样也是采用递归二分裂,但是RSS无法作为分裂的标准,而我们采用信息熵来帮助分类树的构建,不同类型的算法会采用不同熵标准。比如常见的ID3算法会采用信息增益划分数据集,而C4.5算法采用信息增益率来寻找最优划分,下面就介绍一下C4.5算法的原理,首先先来认识一些概念及其计算方式:

1、熵的定义

在分类树算法中,熵可以用于度量样本中类别的纯度,如果一组数据中只包含一个单一的类,那么可以该类是纯的,并且熵值越小,说明样本的纯度越大,熵E的计算方法为:

其中S表示样本集合,c表示种类数,P表示落入类i中的比例,比如我们知道一班学生中有70%为男生,30%为女生,则该班在性别上的信息熵就为:

其实当类别数为2时,信息熵就是我们熟悉的二次函数图形,且当两类别的比例皆为50%时,信息熵有最大值1,也就是样本的凌乱程度最大,无法起到区分类别的作用。如图:

2、信息增益

在决策树算法中,信息增益就是决策树在选择属性进行划分前后信息熵值的差值。而我们定义信息增益的计算公式如下:

其中IG(S|T)表示样本集S按照属性T进行划分而得到的信息增益值,E(S)表示样本S的信息熵,i表示属性T的类别,S_i表示样本属性T中i类所占的数量,E(S_i)表示属性T为i类的样本信息熵。

当信息增益的值越大时,就说明该属性用于类别区分比不使用该属性进行区分,在信息量的程度上前者是大于后者的,也就是说能有更多的信息支持分类,更容易区分样本。利用信息增益来进行决策树的构建,是ID3算法的思想,但是用信息增益去构建决策树,是有一定的缺陷的,信息增益的值对于那些类别数目多的属性有所偏好,也就是采用信息增益时,在分类树的构建中属性取值多的属性会占有优势,从而影响整个分类树的效果。因此我们C4.5 算法采用信息增益率作为分类树构建的指标

3、信息增益率

信息增益率的计算分成两个部分,第一部分就是信息增益,另外的部分是属性T的固有值。属性T固有值IV(T)的计算方法与信息熵的计算方法非常相识:

那我们定义数据集S中属性T的信息增益率GR(S,T)如下:

信息增益率与信息增益的区别在于国有值IV(T),固有值的作用是当属性T的取值多的时候,IV(T)的纯度就会越低,从而IV(T)的值也会越大(可以结合信息熵的理论理解),从而GR(S,T)的值就会变小,这样就相当于给予了一个惩罚机制,当属性的取值越多时,得到的信息增益率就会越小。不过信息增益率在限制了对取值多属性的偏向的同时,也会产生对取值少属性的偏向,这就有点像我们概率论中假设检验的第一类和第二类错误之间的关系。

但是我们的C4.5算法也有应对这个问题的措施,C4.5并不是直接选择信息增益率最大的属性作为划分的属性,在这之前会先通过一遍筛选,先将信息增益低于平均水平的属性剔除,再从剩余的属性选择信息增益率最大的属性作为分类树的节点属性。

由于数据集中可能会有连续型的属性,因此我们还需要将连续属性作离散化处理。核心的思想是将连续属性W中的N个取值按照升序排列,之后通过二分法将属性W的N个值分成两个部分(以相邻的两个值的中间值为划分阈值,分成两部分,且一个有N-1种划分方法)。计算每种划分方法的信息增益,选取信息增益最大的划分方案。

三、剪枝

由于决策树的构建依赖与训练样本集,对于训练集决策树有可能出现过拟合的现象,这样的决策树往往庞大又复杂,分类错误率高,因此需要将复杂的决策树进行简化,简化的过程就称为剪枝。

剪枝方法分为预剪枝和后剪枝两大类。预剪枝是在构建决策树的过程中,提前终止决策树的生长,从而避免过多的节点产生。预剪枝方法虽然简单但实用性不强,因为很难精确的判断何时终止树的生长。后剪枝是在决策树构建完成之后,对那些置信度不达标的节点子树用叶子结点代替,预测结果就以叶子节点中的属性平均值(回归树)或者出现频率最高的类(分类树)。常用的后剪枝方法有代价复杂度剪枝法 和悲观剪枝法。

四、R语言决策树算法的实现

下面是R语言实现决策树的方法之一,上面介绍了关于分类树C4.5算法,该算法是按照各属性的信息增益率进行树的构建,而在R语言中有该算法的改进版C5.0的实现方法,C5.0实质也是利用了信息增益率,并且C5.0可以实现自动剪枝,引进了自适应增强算法,即可以从训练数据集中进行多次迭代产生多个分类树模型,然后通过投票的方法选取最优的分类树模型。要实现C5.0的分类树算法,需要使用拓展包C50的相关函数:

# 创建分类树
model = C5.0(train,class,trials = 1,cost = NULL)
# 参数解释
train :训练数据集,数据框形式
class :包含训练数据集每行预测变量的一个因子向量
trial:为一个可选数值,用于控制自助循环的次数
costs:为一个可选矩阵,用于给出与各种类型错误相应的成本值
# C5.0函数返回的模型对象,可配合predict函数对测试数据集进行预测。
# 进行预测
pred = predict(model,test,type = "class")
# model:由C5.0函数训练得到的模型
# test:测试数据集,包含与训练数据集一致的变量属性,也是数据框形式
# type:取值为"class"或者"prob",分别代表预测返回的值类型(预测的种类/预测各类的概率)

下面我们可以从使用C5.0函数创建一个信贷审核模型,通过输入客户的信息,判断出客户是否可以通过信贷审批。我们使用的数据集结构如下:

数据集中的default就是描述客户是否通过审核的关键变量,其余的变量是辅助评价客户的变量,比如amount(银行账户的存款)、credit_history(信用记录)、housing(住房情况)等等。我们的任务时将整个数据集分为训练数据集和测试数据集,通过创建分类树模型,对测试数据中的客户进行预测分类,并与实际的分类对比,评价模型的准确率。

# 创建训练数据集和测试数据集
set.seed(12345)
credit_rand <- data[order(runif(1000)), ]
credit_train <- credit_rand[1:900, ]
credit_test  <- credit_rand[901:1000, ]
library(C50)
credit_model <- C5.0(credit_train[-17], credit_train$default)
# 模型概述
summary(credit_model)
# 预测
credit_pred <- predict(credit_model, credit_test)
# 结果对比
library(gmodels)
CrossTable(credit_test$default, credit_pred,prop.chisq = FALSE, prop.c = FALSE, prop.r = FALSE)

从结果看,有27个客户是预测错误的,其中11名客户本来是不通过的,预测为正确了,16名客户本来是通过的却预测不通过,折合正确率是73%。从模型的结果看,正确率还有上升调整的空间,且错误预测的11名客户对于银行开展的业务是个致命的错误,因此有必要对模型进行修正,提供其性能。

提升模型的方法可以通过增加模型生成时加入boosting算法,该算法能识别出多次对模型重新构建后,模型的准确性达到了不变的水平时就会输出最终模型。可以通过设置trails参数,指定模型重构的次数:

credit_new <- C5.0(credit_train[-17], credit_train$default,trials = 15)
pred_1 <- predict(credit_new, credit_test)
CrossTable(credit_test$default, pred_1,prop.chisq = FALSE, prop.c = FALSE, prop.r = FALSE)

准确率提升到了78%,而致命错误的预测数量从11降低到了7,但是如果我们想减少这类错误的产生,我们可以使用代价矩阵,比如:

该矩阵代表了预测结果的代价,正确预测的代价为0,如果实际是YES预测为NO的,则代价为1,反之为4,而矩阵的代价值是主观决定,我们可以将代价矩阵加入到C5.0模型的构建:

error_cost <- matrix(c(0, 1, 4, 0), nrow = 2)
error_cost
credit_new1 <- C5.0(credit_train[-17], credit_train$default,trials = 15,costs = error_cost)
pred_2 <- predict(credit_new1, credit_test)
CrossTable(credit_test$default, pred_2,prop.chisq = FALSE, prop.c = FALSE, prop.r = FALSE)

我们可以看到正确率上升到了79%,且致命错误预测数量降到了2,说明我们的调整对模型是有效的。

虽然本次学习的决策树算法算是比较基础的,但是我觉得还是收获了不少,希望之后能够对算法有更深入的探究,之后有空会对随机森林、神经网络、GBDT、支持向量机更加高级的算法进行学习,不过在这之前还得一步步来(`・ω・´)。

c5.0决策树算法_决策树算法相关推荐

  1. python构建决策引擎_决策引擎与机器学习模型的集成 | 信数这么干(一)

    这是"信数这么干"之决策引擎系列专题的第1篇(该专题总计11篇,由技术篇和应用篇两大部分构成).信数这么干--决策引擎系列专题提纲 ✦ 决策引擎技术篇 -决策引擎与机器学习模型的集 ...

  2. python决策树算法_决策树算法及python实现

    决策树算法是机器学习中的经典算法 1.决策树(decision tree) 决策树是一种树形结构,其中每个内部节点表示一个属性上的测试,每个分支代表一个测试输出,每个叶节点代表一种类别. 假设小明去看 ...

  3. python 画出决策边界_决策边界可视化,让你的分类合理有序

    作者--Navoneel Chakrabarty 在数据科学领域,分类问题是一个非常普遍和重要的问题.例如:糖尿病视网膜病变.情绪分析.数字识别.癌症类型预测(恶性或良性)等.这些问题往往通过机器学习 ...

  4. r语言c5.0决策树算法参数,决策树算法CART、C5.0的R语言实现——(三)

    当前浏览器不支持播放音乐或语音,请在微信或其他浏览器中播放 说实话,前面的决策树理论介绍的我自己都累,尤其是第一节各种公式的编辑:当然了,我深知数学理论对一切结论的支撑重要性,数学是这个世界上最美的语 ...

  5. r语言 C4.5 剪枝是用什么算法_决策树算法

    决策树算法,从名字中也可以理解到该算法是以树形结构建立模型的,该算法主要根据分层和分割的方式将预测变量空间划分为一系列简单区域.对某个给定的待预测的观测值,用它所属区域中训练的平均值或众数进行预测.决 ...

  6. c5.0 java_机器学习-AdaBoosting及其Java实现

    Adaboost with trees is the best off-the-shelf classifier in the world.   -Breiman 1996 决策树算法起源于1984年 ...

  7. 决策树之ID3、C4.5、C5.0等五大算法及python实现

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- C5.0决策树之ID3.C4.5.C5.0算法 ...

  8. ID3 C4.5 C5.0

    ID3算法是决策树的一个经典的构造算法,在一段时期内曾是同类研究工作的比较对象,但通过近些年国内外学者的研究,ID3算法也暴露出一些问题,具体如下:    (1)信息增益的计算依赖于特征数目较多的特征 ...

  9. id3算法c语言实现,从ID3到C5.0的故事:算法详解及实践应用

    原标题:从ID3到C5.0的故事:算法详解及实践应用 在前面,我们分别概述性地介绍了决策树的基本知识: 1.算法概述 ID3(Iterative Dichotomiser3)算法可以说决策树算法中最著 ...

最新文章

  1. MySql分表、分库、分片和分区的区别
  2. OpenGL着色器将纹理应用于全屏四边形
  3. JSP 基础之 JSTL c:forEach用法
  4. QUIC/HTTP3 协议简析
  5. MySQL社区介绍_mysql社区服务器
  6. perl大骆驼和小骆驼_骆驼路线的主/从故障转移
  7. JsonCpp的使用
  8. java 并发 异步_Java并发 CompletableFuture异步编程的实现
  9. 电子政务系统的计算机语言,电子政务管理系统.doc
  10. IBM服务器引导盘serverguide 下载
  11. imazing是什么?iPhone苹果第三方iOS设备管理软件
  12. iOS从零开始学习socket编程——HTTP1.0客户端
  13. 从HDMI到MHL,手机走进高清时代
  14. VsCode+PHP开发 推荐插件
  15. [Reproduced]Jerry Stackhouse Calls LeBron James
  16. vscode配置内存,解决窗口出现故障
  17. 网络爬虫 | selenium 爬取动态加载信息
  18. 测试工程师各类工具介绍
  19. UVA 几道dp题总结
  20. 1312昆虫繁殖(数据排序)

热门文章

  1. 如何禁用计算机开放的端口,关闭端口命令,教您如何关闭电脑80端口
  2. c语言strcpy()用法
  3. 充电led灯便携灯_升级版20V便携手提LED灯锂电充电式LED户外灯
  4. 基因组共线性工具MCScanX使用说明
  5. 笨叔叔Ubuntu虚拟机镜像切换搜狗拼音输入法
  6. 【渝粤题库】陕西师范大学151111 成本会计作业 (高起专)
  7. aspose.words更新目录
  8. openCV4.0 C++ 快速入门30讲学习笔记(自用 代码+注释)详细版
  9. 使用selenium爬取淘宝店铺信息
  10. js-函数的认识及应用