决策树学习(上)——深度原理剖析及源码实现

引言

本文给大家分享的主题是决策树(Decision Tree)的原理剖析并附上代码实现供大家参考。由于基于决策树的算法较多,因此文章分为上下篇。上篇主要剖析决策树原理、需要掌握的信息论知识以及Java源码实现等内容。下篇内容包括基于决策树的ID3、CART以及C4.5等著名算法的深入比较、理解以及完整代码实现。

决策树是数据挖掘以及机器学习领域一个基础的算法。在此基础上产生诸多著名算法如ID3,CART以及C4.5等。其中C4.5更是被评为数据挖掘领域的十大经典算法。

原理剖析

示例

顾名思义,决策树是一颗关于决策的树。举个简单的例子稍作解释,当我们打算去某家餐厅吃饭的时候会有诸多因素影响我们的决定,例如“当前餐厅的顾客多不多?”、“去餐厅的交通路况如何?”、“餐厅类型,中式、法式还是意式?”等等。在这一系列的一步步的思考之后我们会做出最终的决策:去或者不去该餐厅吃饭。当然也可以在考虑某一个或者部分因素之后做出决策,例如对于某些单身汪“是否有异性相约”是一个无比重要的决策因素,那么对于这些人只考虑一个因素便可以做出最终决策。

我们一起再来看一个例子,银行在放贷款的时候经常会对借贷人进行综合考量,最终做出决策是否借贷款给这个人。当然在考核的过程中若有一项重要指标不符合要求,那么也会立即否决而不考虑其他因素。有如下记录(实际中往往比这些数据复杂得多):

上表中的数据记录了银行以往的借贷历史中用户的情况和最后的偿还情况。我们可以得出拥有房产的人一般是能偿还债务的,而没有房产的人则需要再考虑其他因素等结论。因此根据这些数据我们可以构造如下决策树
这里写图片描述
如果此时有一个客户前来贷款,该客户没有房产,单身且年收入只有50K。那么根据上面的决策树,银行可以预测他无法偿还债务(图中蓝色虚线),从而否决对其贷款。此外从上面的决策树,还可以知道是否拥有房产可以在一定程度上决定用户是否可以偿还债务,对借贷业务具有指导意义。

从上面的示例及解释中我们可以总结出如下结论:决策树是一种树形结构,其中每个内部节点表示一个属性上的测试,每个分支代表一个测试输出,每个叶节点代表一种类别。

构造决策树

经过上面的叙述,相信大家已经明白什么是决策树以及决策树的用途,这就解决了我们面对一个新事物时的三要素What,Why and How中的What和Why。那么如何构造一颗决策树呢(How)?这是我们的核心问题。在继续叙述之前,我们需要掌握一些信息论的基础知识。

信息论基础知识

1、熵(entropy)
在信息论里熵叫作信息量,即熵是对不确定性的度量。从控制论的角度来看,应叫不确定性。信息论的创始人香农在其著作《通信的数学理论》中提出了建立在概率统计模型上的信息度量。他把信息定义为“用来消除不确定性的东西”。在信息世界,熵越高,则能传输越多的信息,熵越低,则意味着传输的信息越少(什么鬼,大家可以忽略上述解释,咬文嚼字什么的最烦了)。还是举例说明,假设Kathy在买衣服的时候有颜色,尺寸,款式以及设计年份四种要求,而North只有颜色和尺寸的要求,那么在购买衣服这个层面上Kathy由于选择更多因而不确定性因素更大,最终Kathy所获取的信息更多,也就是熵更大。所以信息量=熵=不确定性,通俗易懂。在叙述决策树时我们用熵表示不纯度(Impurity)

根据上面的叙述,可以给出如下熵的数学表达式(定义0*log(0)=0):
这里写图片描述
当然,这个表达式也可以用来量化不纯度。依旧举例解释一下,以前面的去餐厅吃饭为例说明。假设现在有两个独立的决策条件:1.餐厅中顾客数(Patrons),没有、有一些、满员;2.餐厅类型,法式、意式、泰式以及快餐厅。我们现在拥有12名顾客(正负样本各一半)的决策数据,如下图所示(绿色代表正样本,红色代表负样本):
这里写图片描述
对于这两种决策条件,在决策之前数据集的熵Entropy=H(N)=-(0.5*log(0.5) + 0.5*log(0.5) )=1。我们说此时的熵值最大,也就是说不纯度最小。若数据集中只有一类数据则不纯度最小,即数据是“纯的”。例如在第一种决策中,当餐厅中没有顾客(None)的时候,最终的决策是都不去该餐厅(有可能是该餐厅食物太难吃)。此时熵Entropy=H(N)=-(0*log(0) + 1*log(1))=0。我们说此时数据集不纯度最低,即数据是纯的。

此外,学术界也用基尼系数(Gini):
Gini系数
以及误差不纯度
误差不纯度
来度量不纯度。以上三种方式中通常情况下选用熵作为度量不纯度的指标。

2、信息增益(Information Gain)
数据集的一个属性的信息增益就是由于使用这个属性分割样例而导致的期望熵降低。也就是训练集D分割之前的信息熵减去依据某个属性A分割成若干个子集后的信息熵。其数学表达式为:
这里写图片描述
举例说明。在上述决策是否去餐厅吃饭的示例中,原数据集的熵为Entropy=H(6/12, 6/12)=1,在两种不同条件下的信息增益分别为:
Gain(Patrons)=1-[2/12H(0,1) + 4/12H(1,0) + 6/12H(2/6, 4/6)]=0.0541
Gani(Type)=1-[2/12H(1/2, 1/2) + 2/12H(1/2, 1/2) + 4/12H(2/4, 2/4) + 4/12H(2/4, 2/4)]=0

因此选用餐厅中顾客数为决策条件能获得的信息增益更大。信息增益越大意味着能将数据集划分得越简洁。通俗地解释,信息增益越大,在同一条件下子集的熵越小,亦即子集越“纯”。这也就是ID3算法的原理。

3、信息增益率(Information Gain Ratio)

历史的进程往往伴随着新的事物推翻旧的事物。ID3于1975年发明,而在1993年被更好的C4.5算法取代。

首先给出信息增益率的数学表达式:
这里写图片描述
其中SplitInformation的数学表达式如下所示,其意义为根据属性A划分的各子集所需要的信息量——。(有些晦涩,稍后举例说明)
这里写图片描述

之所以信息增益率作为划分数据的一种方式出现是由于信息增益 具有倾向于选择划分值多的属性的缺陷。举一个极端例子说明,在上述餐厅示例中,若以餐厅类别为决策条件,并且有12个类别,假设最终每个类别中均只有一个潜在客户的决策。那么此时每个子集中的熵都为0,信息增益增益最大,这样训练出来的决策树往往会导致过拟合

我们以上述餐厅示例中的第一种情况为例,计算信息增益率。前面我们已经计算过Gain(Patrons)=0.0541,下面计算
SplitInformation(S,Patrons)=-(2/12*log(2/12) + 4/12*log(4/12) + 6/12*log(6/12))=0.7887,
GainRatio(S,Patrons)=Gain(Patrons)/SplitInformation(S,Patrons)=0.0686。

更进一步,信息增益率是如何避免信息增益 中由于优先选择值多的属性而导致过拟合现象的出现?上面我们讨论过以餐厅类型为条件并假设有12种不同餐厅,每类餐厅最后仅有一人做出决策的情况。这种情况下信息增益最大。我们在以顾客数目类型为条件进行决策时,假设仅有两种顾客数目(而不是上述三种类型)—

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值