决策树模型其实是在给定数据集的情况下,生成一个用于判断样本类别的树形逻辑图,不同的节点要依据不同的变量的取值来对样本的类别进行进一步的划分。总体来说,决策树的目的是将样本越分越纯,下面给出一个判断高富帅的决策树模型作为例子(例子来源为南瓜书作者谢老师)。
而当前决策树的主流应用场景是集成学习。
通过上述例子我们可以看出,决策树中判别节点中的待判别特征的选则对决策树的形状有直接影响(如果身高和颜值之间存在强烈的相关关系,也许我们只需要两层决策时判断高富帅)。总的来说,我们希望尽最大可能使样本每经过一个判别节点,其可能归属的类别数量变小,即节点的纯度(purity)越来越高。那么如何实现这种目的呢?我们可以借助信息增益来帮助我们设计合理的决策树模型。
了解信息增益之前我们需要先认识信息熵(information entropy),它是度量样本集合纯度的一种指标,我们不妨假定样本类别集合为 Y \mathcal{Y} Y, 样本集合 D D D 中第 k k k 类样本数量所占总样本数量的比例为 p k ( k = 1 , 2 , ⋯ , ∣ Y ∣ ) p_k (k = 1, 2,\cdots, |\mathcal{Y}|) pk(k=1,2,⋯,∣Y∣)。则数据集 D D D 的信息熵定义如下(其实信息熵的定义放在概率分布的语境下更合适,即某分布的信息熵):
H ( D ) = ∑ i = 1 ∣ Y ∣ p k log p k H(D) = \sum^{|\mathcal{Y}|}_{i=1}p_k\log p_k H(D)=i=1∑∣Y∣pklogpk
由信息熵的定义我们不难看出, H ( D ) H(D) H(D) 的值越小,说明数据集 D D D 中样本的纯度越高,容易证明当数据集中每个样本个数都相同时,该数据集的信息熵最大,此时该数据集纯度最低。根据前文提及的:我们希望决策树节点的纯度越来越高,那么换成信息熵语境,我们的目标就是使样本经过节点判断后,信息熵降低,这就是所谓的信息增益(挺好玩的,信息熵明明降低了,却叫做信息增益,其实这是因为信息熵越高,样本纯度越低,信息含量越少)。
那么如何计算样本经过判断节点后的信息增益呢?我们假定离散属性 a a a 有 V V V 个可能的取值 { a 1 , a 2 , ⋯ , a V } \{a^1, a^2, \cdots,a^V\} {a1,a2,⋯,aV},若使用该属性对样本进行分类,那么将会把被分类的样本分成 V V V 类,不同类的样本子集记作 D v , v = 1 , 2 , ⋯ , V D^v,v=1,2,\cdots,V Dv,v=1,2,⋯,V,我们可以分别计算分类前样本集合的信息熵 H ( D ) H(D) H(D) 与分类后各个类别的样本集合的信息熵的加权平均值(权重按不同类别样本个数来等比例分配),那么使用属性 a a a 对样本集合进行划分带来的信息增益为:
G a i n ( D , a ) = H ( D ) − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ H ( D v ) {\rm Gain}(D,a) = H(D)-\sum^V_{v=1}\frac{|D^v|}{|D|}H(D^v) Gain(D,a)=H(D)−v=1∑V∣D∣∣Dv∣H(Dv)
一般而言,信息增益越大,说明使用属性 a a a 来划分样本带来的“纯度提升”越大。所以,信息增益是一个选择合适属性划分样本的有效参考。ID3决策树算法就是以信息增益为准则来选择划分属性的。
信息增益在一般情况下确实有效。但是,它天生偏向选择可取值数目较多的属性来划分样本。选取一个极端的例子,如果将数据集内所有样本进行编号,并按编号进行分类,则每一个类别下都只有一个样本,自然会使节点获得极高的“纯度”。然而,项编号这种类别过多的属性并不是一个合理的决策树模型应该考虑的节点划分属性,因为这显然会导致模型对数据的过拟合(相当于让模型背住了答案),从而导致模型泛化能力不佳。
基于上述考虑,C4.5决策树优化算法不直接采用信息增益而是使用**增益率(gain ratio)**来选择当前节点的最优化分属性。 增益率的定义如下:
G a i n _ r a t i o ( D , a ) = G a i n ( D , a ) I V ( a ) , I V ( a ) = − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ log ∣ D v ∣ ∣ D ∣ {\rm Gain\_ratio}(D,a) = \frac{{\rm Gain}(D,a)}{{\rm IV}(a)},\quad {\rm IV}(a) = -\sum^V_{v=1}\frac{|D^v|}{|D|}\log\frac{|D^v|}{|D|} Gain_ratio(D,a)=IV(a)Gain(D,a),IV(a)=−v=1∑V∣D∣∣Dv∣log∣D∣∣Dv∣
其中 I V ( a ) {\rm IV}(a) IV(a) 称为属性 a a a 的固有值(intrinsic value),属性 a a a 的可能值越大,则 I V ( a ) {\rm IV}(a) IV(a) 越大。如果直接以信息增益率为准则选择节点划分类别,则会导致决策树模型倾向于可取值数量少的属性,因此C4.5算法并不直接以信息增益率为指导,而是先选出信息增益高平均水平的属性,再从这些属性值中选择信息增益率最高的作为当前节点的分类属性。
CART决策树算法使用基尼系数(Gini index) 来选择划分属性,使用与 (1) 式相同的符号的情况下,数据集 D D D 的基尼值定义如下:
G i n i ( D ) = ∑ k = 1 ∣ Y ∣ ∑ k ′ ≠ k p k p k ′ = 1 − ∑ k = 1 ∣ Y ∣ p k 2 \begin{aligned} {\rm Gini}(D) =& \sum^{|\mathcal{Y}|}_{k=1}\sum_{k'\neq k}p_k p_{k'}\\ =&1-\sum^{|\mathcal{Y}|}_{k=1}p_k^2 \end{aligned} Gini(D)==k=1∑∣Y∣k′=k∑pkpk′1−k=1∑∣Y∣pk2
通过 (4) 式不难看出,基尼值反映的是从数据集中随机抽取两个样本,这两个样本不相同的概率。因此,基尼值越低,两样本越可能相同,数据集纯度更高。同理参照式 (2) 可以写出在数据集 D D D 上,属性 a a a 的基尼指数:
G i n i _ i n d e x ( D , a ) = ∑ v = 1 V ∣ D v ∣ ∣ D ∣ G i n i ( D v ) {\rm Gini\_index}(D,a) = \sum^V_{v=1}\frac{|D^v|}{|D|}{\rm Gini}(D^v) Gini_index(D,a)=v=1∑V∣D∣∣Dv∣Gini(Dv)
在当前节点选择最优化分属性时,只需要选择划分后基尼指数最小的属性即可。
剪枝(pruning) 的目的是避免生成的决策树模型发生过拟合。目前主要有两种剪枝策略:
通常来讲,后剪枝往往比预剪枝保留更多的决策分支。一般来说后剪枝的欠拟合风险较低,泛化性能往往优于预剪枝。但是后剪枝需要在生成决策树后自底向上遍历判断节点,时间花销要比预剪枝大得多。
之前的决策树生成过程面对的都是样本的属性为离散型变量,每个属性的可能取值都是可数的,但是如果碰上身高、体重这种连续性的属性,就需要将该属性离散化之后再开始生成决策树。
当数据集内样本存在某些属性未知的情况是,生成决策树会面临两个问题:
对于问题 (1),我们需要推广信息增益的计算公式,先计算没有缺失值的样本构成的子集被该属性划分后带来的信息增益,在乘以该子集样本个数占总样本数量的比例即可得到推广后的信息增益;对于问题 (2),当某样本待划分的属性值缺失的情况下,将该样本分入所有可能的分支,并在不同分支依据确定划分的样本数量给与该样本等比例的权重,相当于依据已有属性确定的样本的分布给缺失属性的样本设置了认为的概率分布。
传统的决策树在样本特征空间形成的决策边界具有轴平行(axis-parallel)的特点,这是显然的,因为每一次划分样本,决策树都只考虑一个属性,因此传统决策树又叫做单变量决策树(univariate decision tree)。当样本特征空间的分布比较复杂时,传统决策树可能需要多次划分来拟合数据,这将导致决策树结构过于复杂,同时预测的时间开销也会变大。下面给出一个判断西瓜好坏的决策树的例子帮助理解。
西瓜数据集如下:
编号 | 密度 | 含糖率 | 好瓜 |
---|---|---|---|
1 | 0.697 | 0.460 | 是 |
2 | 0.774 | 0.376 | 是 |
3 | 0.634 | 0.264 | 是 |
4 | 0.608 | 0.318 | 是 |
5 | 0.556 | 0.215 | 是 |
6 | 0.403 | 0.237 | 是 |
7 | 0.481 | 0.149 | 是 |
8 | 0.437 | 0.211 | 是 |
9 | 0.666 | 0.091 | 否 |
10 | 0.243 | 0.267 | 否 |
11 | 0.245 | 0.057 | 否 |
12 | 0.343 | 0.099 | 否 |
13 | 0.639 | 0.161 | 否 |
14 | 0.657 | 0.198 | 否 |
15 | 0.360 | 0.370 | 否 |
16 | 0.593 | 0.042 | 否 |
17 | 0.719 | 0.103 | 否 |
在此数据集上生成的决策树如下:
该决策树在样本特征空间对应的决策边界如下:
如果将决策树的决策边界的约束放松,允许使用不与坐标轴平行的超平面构成决策边界,将会大大简化这种情况下决策树的结构。在几何上可以直观理解,与坐标轴不平行的决策边界意味着对应判别节点中参与决策的变量不止一个,事实上,参与判别的因该是不同属性值之间的线性组合。这就是所谓的多变量决策树(multivariate decision tree)。基于上述数据可以生成如下的多变量决策树:
其对应的在样本空间的决策边界如下:
**一点思考:**这样的话我们甚至可以在判别节点使用以多种属性为输入的非线性函数来引入更加灵活的决策边界,只是如何优化这样的决策树(比如说非线性映射如何选择)仍然需要考虑。