决策树原理及实现(一)--ID3算法及改进(C4.5)

决策树是机器学习中很经典也很直观的算法。本文介绍决策树的基本思路和原理。

引言

决策树(Decision Tree)是一种基本的分类与回归算法。决策树是一种树形结构,这在计算机中的数据结构中很常见,也很容易理解:我们选择一种属性对其进行划分,通过其属性的取值不同划分节点,直到最后属性完全相同或不能继续划分为止。

因此,其学习的关键在于如何选择最优划分属性。这也是我们接下来要重点介绍的。

然而,决策树也可以认为给定特征分类下条件概率分布的一种表示。该条件分布定义在特征空间的划分上:特征空间被划分成不相交的单元,每个单元定义一个类的概率分布就构成了条件概率分布。

相比朴素贝叶斯分类,决策树的优势在于构造过程不需要任何领域知识或参数设置,因此在实际应用中,对于探测式的知识发现,决策树更加适用。

决策树基本流程

可将决策树算法概括为:

  1. 特征选择
  2. 决策树生成
  3. 预(后)剪枝

其中特征选择是我们最为关注的。常见的特征选择算法有ID3、C4.5、CART算法,下面会依次介绍。

信息论基础

不加说明的,我们找来信息论中的熵来定义决策树的决策选择度量。

信息熵

熵度量了事物的不确定性,越不确定的事物,它的熵就越大。定义在当前样本集合 D D 中,取值为 i i 的样本所占的比例为 pi p i S S 为对应的分类类别,因此可得:

kpk=1 ∑ k p k = 1

定义 D D 的熵为:

Ent(D)=kpklogPk E n t ( D ) = − ∑ k p k l o g P k

可验证,当 Pk=0Pk=1 P k = 0 或 P k = 1 Ent(D) E n t ( D ) 最小,当 Pk=1S P k = 1 S 时值最大。

信息增益

以上是在样本集合 D D 上的熵,我们想要知道如何选择属性能使得划分结果熵越小(也就是纯度越高)。

因此我们对于样本的每一个属性 a a ,设此属性有 T T 种不同的取值,计算其信息增益(information gain):

Gain(D,a)=Ent(D)t=1T|Dt||D|Ent(Dt) G a i n ( D , a ) = E n t ( D ) − ∑ t = 1 T | D t | | D | E n t ( D t )

t=1T|Dt||D|Ent(Dt) ∑ t = 1 T | D t | | D | E n t ( D t ) 越小, Gain(D,a) G a i n ( D , a ) 越大,则纯度越大。

有了这个度量方式,我们就可以通过求每个属性的信息增益,选择最大的信息增益作为当前的节点,然后依次递归下去。

概率理解

事实上,我们每次选取的属性也是当前随机变量下的条件概率最大值。用概率的方式理解更直观。

设随机变量X的熵的表达式如下:

H(X)=i=1npilogpi H ( X ) = − ∑ i = 1 n p i l o g p i

其中 n n 代表 X X 的不同离散取值。

熟悉了一个变量X的熵,很容易推广到多个个变量的联合熵,这里给出两个变量X和Y的联合熵表达式:

H(X,Y)=i=1np(xi,yi)logp(xi,yi) H ( X , Y ) = − ∑ i = 1 n p ( x i , y i ) l o g p ( x i , y i )

因此,我们可以写出条件熵,它度量了我们在知道 Y Y 之后 X X 的不确定性:

H(X|Y)=i=1np(xi,yi)logp(xi|yi)=j=1np(yj)H(X|yj) H ( X | Y ) = − ∑ i = 1 n p ( x i , y i ) l o g p ( x i | y i ) = ∑ j = 1 n p ( y j ) H ( X | y j )

因此, I(D,Y)=H(X)H(X|Y) I ( D , Y ) = H ( X ) − H ( X | Y ) 可以定义为在知道 Y Y 之后 X X 的不确定减少程度,这正是我们所需要的。仔细观察,这个值与我们之前定义的信息增益是同一个东西,信息增益越大,说明不确定性减少得越多,也就更适合选择作为划分属性。

ID3算法

ID3是实现决策树最原始的算法,其思想在上文已经阐述,就是用信息增益大小来判断当前节点应该用什么特征来构建决策树,用计算出的信息增益最大的特征来建立决策树的当前节点。具体例子大家可以参考下面的参考资料。

缺点

虽然ID3算法通过信息熵给了我们分类的新思路,但依然有很多不足的地方。

  1. ID3没有考虑连续特征,比如长度,密度都是连续值,无法在ID3运用。这大大限制了ID3的用途。

  2. ID3采用信息增益大的特征优先建立决策树的节点。很快就被人发现,在相同条件下,取值比较多的特征比取值少的特征信息增益大。比如一个属性 a a 有2个值,各为1/2,另一个属性 b b 为3个值,各为1/3,我们分别计算其熵:

    Ent(Da)=(12lg12+12lg12)=lg2 E n t ( D a ) = − ( 1 2 l g 1 2 + 1 2 l g 1 2 ) = l g 2

    Ent(Da)=(13lg13+13lg13+13lg13)=lg3 E n t ( D a ) = − ( 1 3 l g 1 3 + 1 3 l g 1 3 + 1 3 l g 1 3 ) = l g 3

    其实他们都是完全不确定的变量,但是取3个值的比取2个值的信息增益大。如果校正这个问题呢?

  3. ID3算法对于缺失值的情况没有做考虑

  4. 没有考虑过拟合的问题

C4.5算法

基于以上的不足,ID3的算法设计者对其进行了改进,这就是C4.5算法。下面我们就分别来看对于每个不足的改进在什么地方。

  1. 不能处理连续特征。

    C4.5的思路是将连续的特征离散化。比如 m m 个样本的连续特征 A A m m 个,从小到大排列为 a1,a2,...,am a 1 , a 2 , . . . , a m ,则C4.5取相邻两样本值的平均数,一共取得 m1 m − 1 个划分点,其中第 i i 个划分点 Ti T i 表示为: Ti=ai+ai+12 T i = a i + a i + 1 2 。对于这 m1 m − 1 个点,分别计算以该点作为二元分类点时的信息增益。

    选择信息增益最大的点作为该连续特征的二元离散分类点。比如取到的增益最大的点为 at a t ,则小于 at a t 的值为类别1,大于 at a t 的值为类别2,这样我们就做到了连续特征的离散化。要注意的是,与离散属性不同的是,如果当前节点为连续属性,则该属性后面还可以参与子节点的产生选择过程。

  2. 信息增益作为标准容易偏向于取值较多的特征的问题。

    我们引入一个信息增益比的变量 IR(X,Y) I R ( X , Y ) ,它是信息增益和特征熵的比值。表达式如下:

    IR(X,A)=I(D,A)HA(D)=Gain(D,A)HA(D) I R ( X , A ) = I ( D , A ) H A ( D ) = G a i n ( D , A ) H A ( D )

    HA(D) H A ( D ) 为特征熵:

    HA(D)=i=1n|Di||D|log|Di||D| H A ( D ) = − ∑ i = 1 n | D i | | D | l o g | D i | | D |

    特征数越多的特征对应的特征熵越大,它作为分母,可以校正信息增益容易偏向于取值较多的特征的问题。

  3. 在样本某些特征缺失的情况下选择划分的属性

    对于某一个有缺失特征值的特征 A A ,C4.5的思路是将数据分成两部分,对每个样本设置一个权重(初始可以都为1),然后划分数据,一部分是有特征值 A A 的数据 D1 D 1 ,另一部分是没有特征 A A 的数据 D2 D 2 . 然后对于没有缺失特征 A A 的数据集 D1 D 1 计算加权重后的信息增益比,最后乘上一个系数,这个系数是无特征 A A 缺失的样本加权后所占加权总样本的比例。

  4. 选定了划分属性,对于在该属性上缺失特征的样本的处理

    可以将缺失特征的样本同时划分入所有的子节点,不过将该样本的权重按各个子节点样本的数量比例来分配。

    比如缺失特征A的样本 a a 之前权重为1,特征A有3个特征值 A1,A2,A3 A 1 , A 2 , A 3 。 3个特征值对应的无缺失A特征的样本个数为2,3,4.则 a a 同时划分入 A1A2A3 A 1 , A 2 , A 3 。对应权重调节为2/9,3/9, 4/9。

  5. 没有考虑过拟合的问题

    这留到CART算法中的剪枝问题一起解决。

不足

C4.5虽然改进或者改善了ID3算法的几个主要的问题,仍然有优化的空间。

  1. 由于决策树算法非常容易过拟合,因此对于生成的决策树必须要进行剪枝。剪枝的算法有非常多,C4.5的剪枝方法有优化的空间。思路主要是两种,一种是预剪枝,即在生成决策树的时候就决定是否剪枝。另一个是后剪枝,即先生成决策树,再通过交叉验证来剪枝。
  2. C4.5生成的是多叉树,即一个父节点可以有多个节点。很多时候,在计算机中二叉树模型会比多叉树运算效率高。如果采用二叉树,可以提高效率。
  3. C4.5只能用于分类,如果能将决策树用于回归的话可以扩大它的使用范围。
  4. C4.5由于使用了熵模型,里面有大量的耗时的对数运算,如果是连续值还有大量的排序运算。如果能够加以模型简化可以减少运算强度但又不牺牲太多准确性的话,那就更好了。

这些问题在CART树中得到了改进。我们下一篇再介绍。

参考资料

  1. 决策树从原理到算法实现
  2. 决策树算法原理

你可能感兴趣的:(MachineLearning)