本文是关于周志华老师编写的机器学习书籍『西瓜书』的第四章决策树的学习.
主要的内容有: 决策树的基本流程、信息熵、信息增益(ID3决策树)、信息增益率(C4.5决策树)和基尼指数(CART决策树)等.
决策树(decision tree)是基于树结构来进行决策的, 是符合人类习惯的一种决策机制.
其中, 叶结点对应的是决策结果, 其他结点对应的是一个属性决策『决定按照什么属性, 将结点中的样本集合划分为子结点』, 从根结点到每个叶子结点的路径对应了一个决策序列.
既然是一棵树, 那么自然就符合递归的定义, 那么什么时候停止决策呢? 有如下三种情况:
同一标记
, 无需划分.同一属性
, 不可划分; 其归属标记为该结点中包含样本数量最多的标记.空
, 不可划分; 其归属标记为父结点中包含样本数量最多的标记.其中第三种情况我的理解是:
在父结点的样本中, 不存在该属性标记, 所以结点划分的时候该结点的样本为空, 但是我们依旧需要考虑这种情况, 因为我们是针对训练集进行的训练, 但是模型在应用的新样本中, 有可能会遇到该情况, 所以也需要考虑在分支上.
那如何归类呢? 就是按照父结点中样本数量最多的标记来标记该结点!
我们的目的就是在生成树结点的过程中去做出正确
的决策划分, 通过训练集构建的决策树需要能够在进行分类决策的时候泛化能力更强.
什么决策才是正确的决策呢?
正确的划分是将决策树的分支结点所包含的样本尽可能属于同一标记. 即, 结点的纯度(purity)最高.
想要度量结点的纯度
, 我们一般使用信息熵(information entropy)这个指标.
首先, 假设当前的样本集合 D D D中包含 n n n类样本,其中,第 k k k类样本所占的比例为 p k , ( k = 1 , 2 , 3 , ⋅ ⋅ ⋅ , n ) p_k,(k=1, 2, 3, ···, n) pk,(k=1,2,3,⋅⋅⋅,n)则D的信息熵定义为:
E n t ( D ) = − ∑ k = 1 n p k log 2 p k Ent(D) = -\sum^n_{k=1} {p_k\log_2{p_k}} Ent(D)=−k=1∑npklog2pk
其数值则表示数据的混乱程度,信息熵值越大则数据越混乱
,则表示不确定性越大,所包含的信息量也就越大,也就越难决策。
这里需要注意信息熵是负数.
好嘞, 有了信息熵的基础, 那接下来我们就可以利用信息熵来构建决策树模型.
有了信息熵的定义, 我们就可以计算当前结点对于分类信息的信息熵, 然后按照哪个属性进行划分呢? 这时候就需要使用到信息增益(information gain)了.
按照如下思路进行考虑:
属性A
进行决策, 那么当前结点中属于属性A
的样本中按照 v v v个属性取值
计算得到的信息熵总和是多少呢?属性A
中每个属性取值
的样本个数不同, 那么对于信息熵总和的影响自然也就不同, 所以在计算的时候需要赋予一定的权重, 最简单的就是第v个属性取值占该属性样本的比重 ∣ D v ∣ ∣ D ∣ \frac{|D^v|}{|D|} ∣D∣∣Dv∣得到的信息增益计算公式:
G a i n ( D , a ) = E n t ( D ) − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ E n t ( D v ) Gain(D,a) = Ent(D) - \sum_{v=1}^V{\frac{|D^v|}{|D|}Ent(D^v)} Gain(D,a)=Ent(D)−v=1∑V∣D∣∣Dv∣Ent(Dv)
著名的ID3决策树就是使用信息增益来实现属性划分的.
但是我们容易发现, 若将『编号』这种属性进行计算的时候
G a i n ( D , 编 号 ) = E n t ( D ) − ∑ v = 1 V 1 V E n t ( 1 ) = E n t ( D ) − E n t ( 1 ) = E n t ( D ) \begin{aligned} Gain(D,编号) &= Ent(D) - \sum_{v=1}^V{\frac{1}{V}Ent(1)} \\ &= Ent(D) - Ent(1) \\ &= Ent(D) \end{aligned} Gain(D,编号)=Ent(D)−v=1∑VV1Ent(1)=Ent(D)−Ent(1)=Ent(D)
很明显这种取值不重复的属性的信息增益极大, 换句话说, 是『属性取值很多』的属性, 但这很明显不符合我们的预期, 因为我们都知道编号这种属性基本上是没有意义的.
由此, 我们引入了信息增益率(gain ratio)的概念.
那么我们理解一下是什么是信息增益率? 信息增益自然就是上面提到的部分, 那么『率』呢? 就需要相对于某个值了.
这里引入一个属性"固有值"(intrinsic value)的概念:
I V ( a ) = − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ log 2 ∣ D v ∣ ∣ D ∣ IV(a) = -\sum_{v=1}^V {\frac{|D^v|}{|D|}\log_2{\frac{|D^v|}{|D|}}} IV(a)=−v=1∑V∣D∣∣Dv∣log2∣D∣∣Dv∣
是不是跟信息增益很相似? 类比一下: 这就是衡量该属性取值的『混乱程度』, 数值越大越混乱, 自然就越不能要.
所以将信息增益率定义为:
G a i n r a t i o ( D , a ) = G a i n ( D , a ) I V ( a ) Gain_ratio(D, a) = \frac{Gain(D, a)}{IV(a)} Gainratio(D,a)=IV(a)Gain(D,a)
由于固有值在分母, 所以信息增益率整体会偏好选择属性数目较少的属性.
著名的C4.5决策树就是利用了信息增益率的方法来实现决策树的, 但不是直接选择增益率最大的属性, 而是使用启发式的方法: 先选择信息增益高于平均水平的属性, 再从中选择出增益率最高的.
最后要提的就是基尼指数(Gini index)了, 这是使用了一个与信息熵类似的概念——基尼值, 它们都是来衡量数据集的纯度
.
G i n i ( D ) = ∑ i = 1 n ∑ j ≠ i p i p j = 1 − ∑ i = 1 n p i 2 \begin{aligned} Gini(D) &= \sum^n_{i=1}\sum_{j\neq{i}}{p_ip_j} &= 1 - \sum^n_{i=1}{p_i^2} \end{aligned} Gini(D)=i=1∑nj=i∑pipj=1−i=1∑npi2
正如公式表示的, 基尼值反映了在样本中随机抽取两个样本, 其标记不一致的概率. 反过来就是用1
减去一致
的概率, 同样考虑样本个数权重的影响, 得到基尼指数计算公式:
G i n i i n d e x ( D , a ) = ∑ v = 1 V ∣ D v ∣ ∣ D ∣ G i n i ( D v ) Gini_index(D, a) = \sum^V_{v=1}{\frac{|D^v|}{|D|}Gini(D^v)} Giniindex(D,a)=v=1∑V∣D∣∣Dv∣Gini(Dv)
著名的CART决策树就是使用了基尼指数来划分属性的.
学习了决策树模型的三种建模方式, 起码知道了ID3有比较明显的缺陷, 所以一般可以使用C4.5或CART决策树.
决策树一般不会直接使用, 多使用在森林等集成算法中, 之后再进一步学习.
关于后续的剪枝处理也会抽空尽快学习.