一般的,决策树由一个根节点、若干个内部节点、若干个叶节点构成,这些节点由边组成(《统计学习方法》中注明是有向边,箭头从上至下)。
包含样本全集,决策树划分的开始。
内部节点对应于一个属性测试(或一个特征),每个节点包含的样本集合根据属性测试的结果被划分至叶节点中。
叶节点对应于决策结果或代表一个类。
决策树从根节点开始,对实例的某一个特征进行测试,根据测试结果,将实例分配至其子节点中,每一个子节点对应着该特征的一个取值,如此递归地对实例进行测试并分配,直至到达叶节点,最后将实例分配至叶节点的类中。
假定数据集D,属性集A。决策树算法的基本原理:
(1)生成节点node;
(2)遍历数据集D中的样本,如果样本全属于同一类别C,则将节点node标记为C类叶节点,决策树构建完毕;
(3)如果属性集A为空,或者D中样本在A上取值相同,则将节点node标记为叶节点,其类别标记为D中样本数最多的类,决策树构建完毕;
(4)如果(2)(3)都不满足,则在A中寻找划分数据集D的最优特征 a ∗ a_* a∗:对于 a ∗ a_* a∗中的每一个值 a ∗ v a_*^{v} a∗v,为node生成一个分支,令 D v D_v Dv表示D中在 a ∗ a_* a∗上取值为 a ∗ v a_*^{v} a∗v的样本子集;
①如果D_v为空,则将分支节点标记为叶节点,其类别标记为D中样本最多的类;
②否则,以样本集 D v D_v Dv、属性 A − a ∗ A -{a_*} A−a∗为分支节点,重复(2)(3)(4)决策树构建完毕。
决策树算法的关键是如何选择最优的划分属性。一般而言,随着划分过程不断进行,希望决策树的分支结构所包含的样本尽可能属于同一类别,即节点的“纯度”越高越好。
“信息熵”是度量样本集合纯度最常用的一种指标。
假定当前样本集合D中第k类样本所占比例为pk,则样本集合D的信息熵定义为:
Ent ( D ) = − ∑ k = 1 ∣ Y ∣ p k log 2 p k \operatorname{Ent}(D)=-\sum_{k=1}^{| \mathcal{Y |}} p_{k} \log _{2} p_{k} Ent(D)=−k=1∑∣Y∣pklog2pk
假设样本集为D,对于某个离散属性a,有V个可能的取值。若使用a来对样本集D进行划分,则会产生V个分支节点,其中第v个分支节点包含了D中所有在属性a上取值为av的样本,记为Dv,可以计算Dv的信息熵,由于不同的分支节点所包含的样本数不同,给分支节点赋予权重|Dv|/|D|,即样本数越多的分支节点的影响越大,于是可以计算出用属性a对样本集D进行划分所获得的“信息增益”。
Gain ( D , a ) = Ent ( D ) − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ Ent ( D v ) \operatorname{Gain}(D, a)=\operatorname{Ent}(D)-\sum_{v=1}^{V} \frac{\left|D^{v}\right|}{|D|} \operatorname{Ent}\left(D^{v}\right) Gain(D,a)=Ent(D)−v=1∑V∣D∣∣Dv∣Ent(Dv)
一般而言,信息增益越大,意味着使用属性a来进行划分所获得数据“纯度提升”越大。著名的ID3以信息增益为准则来划分属性(选择信息增益最大的属性为最优划分属性)。
如果每个分支节点仅包含一个样本,那么这些分支节点的纯度已经达到最大,但是这样的决策树显然不具有泛化能力,无法对新样本进行预测。实际上,信息增益准则对可取值数目较多的属性有所偏好(极端来说,离散属性a对于每个样本都有一个不同的值),为减少这种偏好带来的不利影响,使用“信息增益率”来选择最优划分属性。著名的C4.5使用该准则。
信息增益率定义为:
Gain ratio ( D , a ) = Gain ( D , a ) IV ( a ) \text { Gain ratio }(D, a)=\frac{\operatorname{Gain}(D, a)}{\operatorname{IV}(a)} Gain ratio (D,a)=IV(a)Gain(D,a)
其中, I V ( a ) = − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ log 2 ∣ D v ∣ ∣ D ∣ \mathrm{IV}(a)=-\sum_{v=1}^{V} \frac{\left|D^{v}\right|}{|D|} \log _{2} \frac{\left|D^{v}\right|}{|D|} IV(a)=−v=1∑V∣D∣∣Dv∣log2∣D∣∣Dv∣
IV值表示某个属性可能取值数目的偏好。
信息增益率,即信息增益消除某个属性的可能取值数目的影响。
需注意的是,信息增益率对可取值数目较少的属性有所偏好(可取值数据越少,IV值越小,则信息增益率越大),则C4.5不是直接选择增益率最大的候选划分属性,而是先从候选划分属性中找出信息增益高于平均水平的属性(信息增益高于平均水平,则这些属性划分的分支节点纯度较高),再从中选择信息增益率最高的属性(此时选择信息增益率最高,既保证了分支节点纯度最高,又可以减少对可取值数目较多偏好的影响)。
基尼系数反应了从数据集D中随机抽取两个样本,其类别标记不一致的概率,基尼系数越小,类别标记不一致的概率越低,数据集D的纯度越高。
基尼系数定义如下:
Gini ( D ) = ∑ k = 1 ∣ Y ∣ ∑ k ′ ≠ k p k p k ′ = 1 − ∑ k = 1 ∣ Y ∣ p k 2 \begin{aligned} \operatorname{Gini}(D) &=\sum_{k=1}^{|\mathcal{Y}|} \sum_{k^{\prime} \neq k} p_{k} p_{k^{\prime}} \\ &=1-\sum_{k=1}^{|\mathcal{Y}|} p_{k}^{2} \end{aligned} Gini(D)=k=1∑∣Y∣k′=k∑pkpk′=1−k=1∑∣Y∣pk2
CART采用基尼指数最小的属性作为最优划分属性。
对于属性a,基尼指数定义如下:
Gini index ( D , a ) = ∑ v = 1 V ∣ D v ∣ ∣ D ∣ Gini ( D v ) \text { Gini index }(D, a)=\sum_{v=1}^{V} \frac{\left|D^{v}\right|}{|D|} \operatorname{Gini}\left(D^{v}\right) Gini index (D,a)=v=1∑V∣D∣∣Dv∣Gini(Dv)
通过基尼指数的定义,基尼指数在基尼系数的基础上,也考虑了属性可能取值数目的偏好问题。
剪枝是对付“过拟合”的主要手段,主动去掉一些分支,来降低过拟合风险。
剪枝的过程,是基于验证集进行的。
预剪枝是指在决策树生成过程中,对每个节点在划分前先进行估计(估计划分前后的泛化性能),若当前节点的划分不能带来决策树的泛化性能提升,则停止划分并将当前节点标记为叶节点。
优点:
弊端:
后剪枝是指先训练完一棵完整的决策树,再进行从下而上的剪枝,对所有非叶节点进行逐一考察,其通常比预剪枝保留了更多的分支。
优点:
缺点:
优于连续属性的可取数值不再有限,不能直接根据连续属性的可取值来对节点进行划分。此时,需进行连续属性离散化处理。采用二分法进行处理。 在属性数目较多的情况下,往往会存在大量的缺失值。如果简单的放弃不完整样本,仅使用无缺失值的样本来进行学习,显然是对数据信息极大的浪费,因此有必要考虑利用有缺失属性值的训练样本。 截至目前,我们讨论的都是单变量决策树,即所有非叶节点,其属性值只有一个。如果所有非叶节点不再针对某一个特征,而是特征的线性组合(换言之,每个非叶节点是一个线性分类器),这就是多变量决策树。 有一些决策树算法支持“增量学习”,在接收到新样本后可对它已学到的模型进行调整,而不用完全重新学习。主要机制为通过调整分支路径上的划分属性次序来对树进行部分重构,代表性算法有ID4、ITI、ID5R等。
给定数据集D和连续属性a,将属性a的值(可能取值有n个)从小到大排序,可考察包含n-1个元素的候选划分点集合:
T a = { a t + a i + 1 2 ∣ 1 ⩽ i ⩽ n − 1 } T_{a}=\left\{\frac{a^{t}+a^{i+1}}{2} | 1 \leqslant i \leqslant n-1\right\} Ta={2at+ai+1∣1⩽i⩽n−1}
因此可以将信息增益稍加改造:
Gain ( D , a ) = max t ∈ T a Gain ( D , a , t ) = max t ∈ T a Ent ( D ) − ∑ λ ∈ { − , + } ∣ D t λ ∣ ∣ D ∣ Ent ( D t λ ) \begin{aligned} \operatorname{Gain}(D, a) &=\max _{t \in T_{a}} \operatorname{Gain}(D, a, t) \\ &=\max _{t \in T_{a}} \operatorname{Ent}(D)-\sum_{\lambda \in\{-,+\}} \frac{\left|D_{t}^{\lambda}\right|}{|D|} \operatorname{Ent}\left(D_{t}^{\lambda}\right) \end{aligned} Gain(D,a)=t∈TamaxGain(D,a,t)=t∈TamaxEnt(D)−λ∈{−,+}∑∣D∣∣∣Dtλ∣∣Ent(Dtλ)
为了防止中位点( a i + a i + 1 2 \frac{a^{i}+a^{i+1}}{2} 2ai+ai+1)不存在于训练集中,可将划分点设为该属性在训练集中出现的不大于中位点的最大值。
注意:与离散属性不同的是,若当前节点划分属性为连续属性,该属性还可作为其后代节点的划分属性。如当前节点以属性a中的a缺失值处理
以C4.5为例,简单阐述缺失值处理:
若数据集D中含有属性a、属性b、属性c、属性d、属性e、属性f等,其中属性a、属性b、属性c有缺失值,
1)计算属性d、属性e、属性f的信息增益;
2)属性a有缺失值,先基于属性a的非缺失值样本计算信息增益;
3)再乘以“属性a未缺失样本/总样本”的比例,得到属性a的信息增益;
4)重复1)和2)操作,计算属性b和属性c的信息增益;
5)选择最大的信息增益所属属性作为左右划分属性。若属性d、属性e、属性f中存在最大的信息增益,则与前述“信息增益”做法一致;若属性a、属性b、属性c中存在最大的信息增益(不妨假设属性a具有最大的信息增益),则将属性a缺失值的样本全部划入所有子节点,但缺失值样本的权重调整为“该子节点的样本数/总样本数”。
6)上述过程递归进行,以此生成决策树。多变量决策树
如果每个属性视为坐标空间的一个坐标轴,则d个属性描述的样本就对应了d维空间中的一个数据点,对样本分类则意味着在这个坐标空间中寻找不同类别样本的分类边界。决策树所形成的分类边界是轴平行的,即它的分类边界由若干个与坐标轴平行的分段组成。
针对分类边界比较简单,即分类边界的每一段划分都只对应了某个属性,则为上述阐述的“单变量决策树”;如果分类边界比较复杂时,必须要用多段划分才能获得较好的近似,此时为“多变量决策树”。
多变量决策树算法主要有OC1等。决策树算法的“增量学习”
增量学习可有效地降低每次接受到新样本后的训练时间开销,但多步增量学习后的模型会与基于全部数据训练而得的模型有较大差别。