一文详解,决策树从ID3算法到C4.5算法背后原理。码字不易,喜欢请点赞,谢谢!!!
一、前言
决策树算法作为数据挖掘十大经典算法之一,其实已经在日常编程中,被我们使用到了。比如,我们平时写代码的判断语句
i
f
−
e
l
s
e
if-else
if−else这个组合就是个决策树过程,但是你是否想过先用哪个
i
f
if
if条件判断会比较好呢?这个条件确定的过程就是决策树的关键思想了。
上世纪70年代,昆兰使用信息论中的熵来度量这个过程,昆兰将这个算法命名为ID3算法。
二、信息熵和信息增益
-
信息熵
信息熵是1948年,香农提出来的,用来解决信息的量化度量问题。
信息熵中熵度量了事物的不确定性,事物越不确定,其熵值越大。其表达式为:
H ( X ) = − ∑ i = 1 n p i l o g p i H(X)=-\sum_{i=1}^n{p_ilogp_i} H(X)=−∑i=1npilogpi
其中,n代表 X X X取到的不同的离散值, p i p_i pi为 X X X取 i i i的概率, l o g log log为底为2的对数。
eg1:X取值为0或1,概率均为 1 / 2 1/2 1/2,则其信息熵为:
H ( X ) = − 1 / 2 l o g 1 / 2 − 1 / 2 l o g 1 / 2 = l o g 2 H(X)=-{1/2log1/2} - {1/2log1/2}=log2 H(X)=−1/2log1/2−1/2log1/2=log2
eg2:X取值为0或1或2,概率均为 1 / 3 1/3 1/3,则其信息熵为:
H ( X ) = − 1 / 3 l o g 1 / 3 − 1 / 3 l o g 1 / 3 − 1 / 3 l o g 1 / 3 = l o g 3 H(X)=-{1/3log1/3} - {1/3log1/3}- {1/3log1/3}=log3 H(X)=−1/3log1/3−1/3log1/3−1/3log1/3=log3
通过这两个例子可以看出来,事物越不确定,其信息熵越大。 -
联合熵
上面是一个变量 X X X的熵,很容易扩展多联合熵,其表达式为:
H ( X , Y ) = − ∑ i = 1 n p ( x i , y i ) l o g p ( x i , y i ) H(X,Y)=-\sum_{i=1}^n{p(x_i,y_i)logp(x_i,y_i)} H(X,Y)=−∑i=1np(xi,yi)logp(xi,yi) -
条件熵
在得到联合熵之后,可以通过公式推导得到条件熵,条件熵类似于条件概率, H ( X / Y ) H(X/Y) H(X/Y)衡量在已知Y的情况下X的不确定性。
通常直接使用公式 H ( X / Y ) = ∑ i = 1 n p ( y i ) H ( X / y i ) H(X/Y)=\sum_{i=1}^np(y_i)H(X/y_i) H(X/Y)=∑i=1np(yi)H(X/yi)来计算条件熵。 -
信息增益
信息增益(Information Gain),就是ID3算法的精髓,根据H(X)表示X的信息熵(即衡量X的不确定性),H(X/Y)表示在已知Y的情况下X的信息熵,那公式: H ( X ) − H ( X / Y ) H(X)-H(X/Y) H(X)−H(X/Y)表示的就是在已知Y的情况下,X的不确定性减小的程度,即信息增益,记为 I ( Y ) I(Y) I(Y)。ID3算法就是选择信息增益最大的特征来作为分类节点。
三、ID3算法思路
- 决策树ID3算法停止条件
- 设置一个阈值,当最大信息增益小于这个阈值时,停止树分裂;
- 所有记录属于同一类别
- ID3步骤
- 如果节点满足分裂停止条件,将其设置为叶子节点
- 选择信息增益最大的特征进行分裂
- 重复前面两步,直到完成决策树构造
四、ID3算法实例
这里提供一个网上的数据集,是不同天气是否打球的例子,其中特征是outlook、temperature、humidity、windy;分类标签是play。
一共14个样本,其中9个yes,5个no,在标签play的信息熵为:
H ( p l a y ) = − 9 14 l o g 9 14 − 5 14 l o g 5 14 ≈ 0.94 H(play)=-\frac{9}{14}log\frac{9}{14}-\frac{5}{14}log\frac{5}{14}\approx 0.94 H(play)=−149log149−145log145≈0.94
然后计算outlook, temperature, humidity, windy每个特征下的信息熵,下面展示了已知outlook下的信息熵的计算:
H
(
p
l
a
y
/
s
u
n
n
y
)
=
−
2
5
l
o
g
2
5
−
3
5
l
o
g
3
5
≈
0.97
H(play/sunny)=-\frac{2}{5}log\frac{2}{5}-\frac{3}{5}log\frac{3}{5}\approx 0.97
H(play/sunny)=−52log52−53log53≈0.97
H ( p l a y / o v e r c a s t ) = − 4 4 l o g 4 4 − 0 l o g 0 = 0 H(play/overcast)=-\frac{4}{4}log\frac{4}{4}- 0log0=0 H(play/overcast)=−44log44−0log0=0
H ( p l a y / r a i n y ) = − 2 5 l o g 2 5 − 3 5 l o g 3 5 ≈ 0.97 H(play/rainy)=-\frac{2}{5}log\frac{2}{5}-\frac{3}{5}log\frac{3}{5}\approx 0.97 H(play/rainy)=−52log52−53log53≈0.97
所以有:
H ( p l a y / o u t l o o k ) = p ( s u n n y ) ∗ H ( p l a y / s u n n y ) + p ( o v e r c a s t ) ∗ H ( p l a y / o v e r c a s t ) + p ( r a i n y ) ∗ H ( p l a y / r a i n y ) = 5 14 ∗ 0.97 + 4 14 ∗ 0 + 5 14 ∗ 0.97 ≈ 0.69 H(play/outlook) = p(sunny)*H(play/sunny)+ p(overcast)*H(play/overcast)+ p(rainy)*H(play/rainy)=\frac{5}{14}*0.97+\frac{4}{14}*0+\frac{5}{14}*0.97\approx 0.69 H(play/outlook)=p(sunny)∗H(play/sunny)+p(overcast)∗H(play/overcast)+p(rainy)∗H(play/rainy)=145∗0.97+144∗0+145∗0.97≈0.69
因此特征outlook的信息增益为:
I ( o u t l o o k ) = H ( p l a y ) − H ( p l a y / o u t l o o k ) = 0.94 − 0.69 = 0.25 I(outlook)=H(play)-H(play/outlook)=0.94-0.69=0.25 I(outlook)=H(play)−H(play/outlook)=0.94−0.69=0.25
同理可以求得其他特征的信息增益,然后选择最大的信息增益作为分类的节点。一次分裂完成后,样本被分裂到三个节点:
然后对每个部分执行上面操作,知道完成最后的决策树,如下图:
五、ID3算法不足
ID3算法虽然提出了解决问题的新思路,但是有很多值得改进的地方,不足点主要有:
- ID3没有考虑连续特征
- ID3采用信息增益大的特征优先建立决策树的节点。很快就被人发现,在相同条件下,取值比较多的特征比取值少的特征信息增益大。比如一个变量有2个值,各为1/2,另一个变量为3个值,各为1/3,其实他们都是完全不确定的变量,但是取3个值的比取2个值的信息增益大。如果校正这个问题呢?
- ID3算法对于缺失值的情况没有做考虑
- 没有考虑过拟合的问题
为了解决ID3算法的这些不足,作者昆兰对其进行了改进,提出了C4.5算法。
六、C4.5算法
C4.5算法的思路跟ID3基本上一样,只是针对于ID3算法的不足进行了改进。
-
连续值处理
ID3算法只能处理离散数据,而不能处理连续值。在C4.5里面,如果m个样本的特征A是连续型特征,将其值从小到大排列 a 1 , a 2 , . . . , a m a_1,a_2,...,a_m a1,a2,...,am,然后取相邻样本的平均数,得到m-1个划分点,其中第 i i i个划分点 T i = a i + a i + 1 2 T_i=\frac{a_i+a_{i+1}}{2} Ti=2ai+ai+1。对于这m-1个划分点,分别计算其作为二元分类时候的信息增益,然后选择信息增益最大的划分点作为该连续特征的二元离散分类点。比如取到的增益最大的点为 a t a_t at,则小于 a t a_t at的值为类别1,大于 a t a_t at的值为类别2,这样我们就做到了连续特征的离散化。要注意的是,与离散属性不同的是,如果当前节点为连续属性,则该属性后面还可以参与子节点的产生选择过程。 -
信息增益偏向多取值特征问题
C4.5针对这个问题,选择了使用信息增益率(Information Gain Ratio)来选择特征,表达式如下:
I R ( X , Y ) = I ( X , Y ) H Y ( X ) IR(X,Y)=\frac{I(X,Y)}{H_Y(X)} IR(X,Y)=HY(X)I(X,Y)
其中X为标签,Y为特征, I ( X , Y ) I(X,Y) I(X,Y)表示特征Y的信息增益, H Y ( X ) H_Y(X) HY(X)表示特征熵,其表达式为:
H Y ( X ) = − ∑ i = 1 n ∣ X i ∣ ∣ X ∣ l o g ∣ X i ∣ ∣ X ∣ H_Y(X)=-\sum_{i=1}^{n}\frac{|X_i|}{|X|}log\frac{|X_i|}{|X|} HY(X)=−∑i=1n∣X∣∣Xi∣log∣X∣∣Xi∣
其中 ∣ X i ∣ |X_i| ∣Xi∣为特征Y在第 i i i类中的样本个数, ∣ X ∣ |X| ∣X∣为样本总个数。
则上面案例中,outlook特征的特征熵为:
H o u t l o o k ( p l a y ) = − 5 14 l o g 5 14 − 4 14 l o g 4 14 − 5 14 l o g 5 14 H_{outlook}(play)=-\frac{5}{14}log\frac{5}{14}-\frac{4}{14}log\frac{4}{14}-\frac{5}{14}log\frac{5}{14} Houtlook(play)=−145log145−144log144−145log145
其信息增益率为:
I R ( o u t l o o k ) = I ( o u t l o o k ) H o u t l o o k ( p l a y ) IR(outlook)=\frac{I(outlook)}{H_{outlook}(play)} IR(outlook)=Houtlook(play)I(outlook) -
缺失值处理
这部分主要包含两种情况:
- 样本某些特征缺失的情况下,选择划分属性
这种情况下,对于某个具有缺失值的特征A,C4.5的方法是将数据分成两部分,一部分是有特征A的数据 D 1 D_1 D1,一部分是没有特征A的数据 D 2 D_2 D2。然后计算有特征A的数据 D 1 D_1 D1部分的信息增益率,最后将这个结果乘以一个系数,系数为有特征A的样本所占总样本的比例。 - 选定了划分属性,对该属性上的缺失值的处理
对于这个情况,将缺失特征的样本划分为一类,其余样本正常划分。
- 过拟合问题
通过上面的方法产生的决策树,可能会对训数据分类效果很好,但是对预测数据却不好,即决策树出现过拟合(Overfitting)问题,训练误差(Training Error)小,泛化误差(Generalization Error 或者 Test Error)大。下图给出训练误差、测试误差随决策树节点数的变化情况:
可以观察到,当节点数较小时,训练误差与测试误差均较大,即发生了欠拟合(Underfitting)。当节点数较大时,训练误差较小,测试误差却很大,即发生了过拟合。只有当节点数适中是,训练误差居中,测试误差较小;对训练数据有较好的拟合,同时对未知数据有很好的分类准确率。
过拟合产生的原因是决策树模型过于复杂,可能原因如下:
- 训练数据集中有噪音样本点,对训练数据拟合的同时也对噪音进行拟合,从而影响了分类的效果;
- 决策树的叶子节点中缺乏有分类价值的样本记录,也就是说此叶子节点应被剪掉;
对于这个问题,C4.5采用的是正则化系数进行剪枝来解决。通过极小化决策树的整体损失函数(Loss Function)或代价函数(Cost Function),决策树
T
T
T的损失函数为:
L
α
(
T
)
=
C
(
T
)
+
α
∣
T
∣
L_\alpha (T)=C(T)+\alpha|T|
Lα(T)=C(T)+α∣T∣
式中,
C
(
T
)
C(T)
C(T)表示决策树的训练误差,
α
\alpha
α为调节参数(正则化系数),
∣
T
∣
|T|
∣T∣为模型的复杂度(叶子节点数)。当模型越复杂时,训练的误差就越小。上述定义的损失正好做了两者之间的权衡。如果剪枝后损失函数减少了,即说明这是有效剪枝。
具体的决策树正则化剪枝,之后将分类和回归树(CART)时候再详细介绍。
七、C4.5算法不足
C4.5虽然改进或者改善了ID3算法的几个主要的问题,仍然有优化的空间。
- 由于决策树算法非常容易过拟合,因此对于生成的决策树必须要进行剪枝。剪枝的算法有非常多,C4.5的剪枝方法有优化的空间。思路主要是两种,一种是预剪枝,即在生成决策树的时候就决定是否剪枝。另一个是后剪枝,即先生成决策树,再通过交叉验证来剪枝。
- C4.5生成的是多叉树,即一个父节点可以有多个节点。很多时候,在计算机中二叉树模型会比多叉树运算效率高。如果采用二叉树,可以提高效率。
- C4.5只能用于分类,如果能将决策树用于回归的话可以扩大它的使用范围。
- C4.5由于使用了熵模型,里面有大量的耗时的对数运算,如果是连续值还有大量的排序运算。如果能够加以模型简化可以减少运算强度但又不牺牲太多准确性的话,那就更好了。
这4个问题在CART树里面部分加以了改进。所以目前如果不考虑集成学习话,在普通的决策树算法里,CART算法算是比较优的算法了。scikit-learn的决策树使用的也是CART算法。之后我会学习和分享CART树的原理。
参考文献:
李航,《统计学习方法》
https://www.cnblogs.com/pinard/p/6050306.html
https://zhuanlan.zhihu.com/p/26551798
https://www.cnblogs.com/en-heng/p/5013995.html
https://blog.csdn.net/u012897374/article/details/74505024