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

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

一、回归树

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

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

44d1f6cf13545e624c868ef5b4c43c7e.png

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

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

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

7b2932ad5d9a244886f215c8b4350ad5.png

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

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

efdba44ad5562667255ceef91aed676e.png

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

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

二、分类树

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

1、熵的定义

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

cc3046ccee6f6370aed8fb12b90eff94.png

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

643f9a1003f820b2251bbcaca951f50a.png

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

5e26d4b566885a53f65e5584e4187e22.png

2、信息增益

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

298917639cd80cbad55246a99b6b96fd.png

其中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)的计算方法与信息熵的计算方法非常相识:

072e0972b35180afba6002574882093c.png

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

d545b8523e92bedcd5357da1e2187f32.png

信息增益率与信息增益的区别在于国有值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的相关函数:

# 创建分类树

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

9f64250f55c0c5e9bed24355472dcfb8.png

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

# 创建训练数据集和测试数据集
7695c6094b6d311253c8e12ebcbb2954.png

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

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

credit_new pred_1 CrossTable(credit_test$default, pred_1,prop.chisq = FALSE, prop.c = FALSE, prop.r = FALSE)
456cb219860ef937f292a47cc107d321.png

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

9f117f82de7a794784df11edbe9ecf59.png

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

error_cost error_costcredit_new1 pred_2 CrossTable(credit_test$default, pred_2,prop.chisq = FALSE, prop.c = FALSE, prop.r = FALSE)
74deb76b73f411fd7c96806dbe8db139.png

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

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

2f4f6958aab36d2b35199402360c136e.png

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值