第四章 决策树
4.1 基本流程
决策树是一类常见的机器学习方法,是基于树结构来进行决策的,通过对训练样本的分析来确定划分属性,来模拟人类决策过程。
一般的,一棵决策树包含一个根结点、若干个内部结点和若干个叶结点,叶结点对应于决策结果,其他每个结点则对应于一个属性测试,每个结点包含的样本集合根据属性测试的结果被划分到子结点中,根结点包含样本全集,从根结点到每个叶结点的路径对应了一个判定测试序列。决策树学习的目的是为了产生一棵泛化能力强的决策树,其基本流程遵循简单且直观的“分而治之”策略,如下所示:
4.2 划分选择
决策树学习的关键在于如何选择最优化分属性,随着划分过程不断进行,我们希望决策树的分支结点所包含的样本尽可能属于同一类别,也就是结点的“纯度”越来越高,下面介绍几种在选择最优划分属性时常用的指标。
(1)信息增益
在介绍信息增益之前,先来介绍一下信息熵。信息熵是度量样本集合纯度最常用的一种指标,假定当前样本集合 D D D中第 k k k类样本所占比例为 p k ( k = 1 , 2 , 3 , . . . , n ) p_k(k=1,2,3,...,n) pk(k=1,2,3,...,n),则 D D D的信息熵定义如下, E n t ( D ) Ent(D) Ent(D)的值越小,说明 D D D的纯度越高。
E n t ( D ) = − ∑ k = 1 n p k log 2 p k Ent(D) = - \sum\limits_{k = 1}^n {{p_k}{{\log }_2}{p_k}} Ent(D)=−k=1∑npklog2pk
下面介绍信息增益。假定离散属性 a a a有 V V V个可能的取值 a 1 , a 2 , . . . , a V {a^1,a^2,...,a^V} a1,a2,...,aV,若使用属性 a a a来对样本集 D D D进行划分,则会产生 V V V个分支结点,其中第 v v v个分支结点包含了 D D D中所有在属性 a a a上取值为 a v a^v av的样本,记为 D v D^v Dv,这样可以计算出 D v D^v Dv的信息熵。之后考虑到不同的分支结点所包含的样本数不同,为每一个结点赋予权重,即样本数越多的分支结点的影响越大,于是得到如下的信息增益。一般而言,信息增益越大,意味着使用属性 a a a来进行划分所获得的“纯度”提升越大,比如著名的 I D 3 ID3 ID3决策树学习算法。
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\limits_{v = 1}^V {\frac{{\left| {{D^v}} \right|}}{{\left| D \right|}}Ent({D^v})} Gain(D,a)=Ent(D)−v=1∑V∣D∣∣Dv∣Ent(Dv)
(2)增益率
实际上,信息增益准则对可取值数目较多的属性有所偏好,为减少这种偏好可能带来的不利影响,下面我们介绍增益率,定义如下:
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 2 ∣ D v ∣ ∣ D ∣ Gain\_ratio(D,a) = \frac{{Gain(D,a)}}{{IV(a)}},IV(a) = - \sum\limits_{v = 1}^V {\frac{{\left| {{D^v}} \right|}}{{\left| D \right|}}} {\log _2}\frac{{\left| {{D^v}} \right|}}{{\left| D \right|}} Gain_ratio(D,a)=IV(a)Gain(D,a),IV(a)=−v=1∑V∣D∣∣Dv∣log2∣D∣∣Dv∣
其中 I V ( a ) IV(a) IV(a)称为属性 a a a的固有值,属性 a a a的可能取值数目越多, I V ( a ) IV(a) IV(a)的值通常会越大。需要注意的是,增益率准则对可取值数目较少的属性有所偏好,比如著名的 C 4.5 C4.5 C4.5决策树算法,是使用了一个启发式方法来选择最优划分属性——先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的。
(3)基尼指数
首先介绍基尼值,数据集 D D D的纯度可以用基尼值 G i n i ( D ) Gini(D) Gini(D)来度量, G i n i ( D ) Gini(D) Gini(D)反映了从数据集 D D D中随机抽取两个样本,其类别标记不一致的概率,因此 G i n i ( D ) Gini(D) Gini(D)越小,数据集 D D D的纯度越高。属性 a a a的基尼指数定义如下,最后也是选择使得划分后基尼指数最小的属性作为最优划分属性,比如著名的 C A R T CART CART决策树。
G i n i ( D ) = ∑ k = 1 n ∑ k ′ ≠ k p k p k ′ = 1 − ∑ k = 1 n p k 2 , G i n i _ i n d e x ( D , a ) = ∑ v = 1 V ∣ D v ∣ ∣ D ∣ G i n i ( D v ) Gini(D) = \sum\limits_{k = 1}^n {\sum\limits_{k' \ne k} {{p_k}{p_{k'}}} } = 1 - \sum\limits_{k = 1}^n {p_k^2} ,Gini\_index(D,a) = \sum\limits_{v = 1}^V {\frac{{\left| {{D^v}} \right|}}{{\left| D \right|}}} Gini({D^v}) Gini(D)=k=1∑nk′=k∑pkpk′=1−k=1∑npk2,Gini_index(D,a)=v=1∑V∣D∣∣Dv∣Gini(Dv)
4.3 剪枝处理
剪枝是决策树学习算法对付“过拟合”的主要手段,在决策树学习中,为了尽可能正确分类训练样本,结点划分过程将不断重复,有时会造成决策树分支过多,以致于把训练集自身的一些特点当作所有数据都具有的一般性质而导致过拟合。因此,可以通过主动去掉一些分支来降低过拟合的风险,常见的基本策略有“预剪枝”和“后剪枝”。
(1)预剪枝
预剪枝是指在决策树生成过程中,对每个结点在划分前进行估计,若当前结点的划分不能带来决策树泛化性能提升,则停止划分并将当前结点标记为叶结点,也就是提前终止某些分支的生长。下面举一个西瓜数据集的例子,以下是数据集详情。
以下是构造的原始决策树。
下面我们根据属性“脐部”来进行划分,发现划分前的验证集精度为42.9%,划分后为71.4%,于是用“脐部”进行划分得以确定,同样的方式应用于下面的“色泽”和“根蒂”,如下所示:
(2)后剪枝
后剪枝是先从训练集生成一棵完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来决策树泛化性能提升,则将该子树替换为叶结点。
如上面那棵原始决策树所示,首先考察结点6,如果把该结点替换为叶结点,则验证集精度将从42.9%提升到57.1%,所以进行剪枝,其他结点亦如此,如下所示:
(3)预剪枝与后剪枝的优缺点
预剪枝是在构建决策树的过程中提前停止生长,即在某个结点上不再继续划分子结点,而是直接将该结点作为叶结点。预剪枝的优点是可以减少决策树的规模,节省计算资源和时间,避免过拟合问题。预剪枝的缺点是可能会过于简化决策树,导致欠拟合问题,即对训练集和测试集都不能很好地拟合,损失了一些有用的信息。预剪枝需要设定一些停止生长的条件,例如结点上的样本数、信息增益、基尼指数等。
后剪枝是在构建完整的决策树之后,从下往上对决策树进行简化,即将某些子树替换为叶结点或者直接删除。后剪枝的优点是可以保留决策树的完整性,避免欠拟合问题,同时也可以通过简化决策树来减少过拟合问题。后剪枝的缺点是需要额外的计算资源和时间来构建完整的决策树和进行剪枝操作,可能会影响效率。后剪枝需要设定一些评估标准来判断是否进行剪枝,例如验证集上的准确率、误差率等。
4.4 连续与缺失值
(1)连续值处理
由于连续属性的可取值数目不再有限,因此不能直接根据连续属性的可取值来对结点进行划分,这里可以使用连续属性离散化,最简单的是采用二分法,如下所示:
T a = { a i + a i + 1 2 , 1 ⩽ i ⩽ n − 1 } {T_a} = \{ \frac{{{a^i} + {a^{i + 1}}}}{2},1 \leqslant i \leqslant n - 1\} Ta={2ai+ai+1,1⩽i⩽n−1}
把这些中位点作为候选划分点,选取最优的划分点进行样本集合的划分,如果采用信息增益,则如下所示:
G a i n ( D , a ) = max t ∈ T a G a i n ( D , a , t ) = max t ∈ T a E n t ( D ) − ∑ λ ∈ { − , + } ∣ D t λ ∣ ∣ D ∣ E n t ( D t λ ) Gain(D,a) = \mathop {\max }\limits_{t \in {T_a}} Gain(D,a,t) = \mathop {\max }\limits_{t \in {T_a}} Ent(D) - \sum\limits_{\lambda \in \{ - , + \} } {\frac{{\left| {D_t^\lambda } \right|}}{{\left| D \right|}}Ent(D_t^\lambda )} Gain(D,a)=t∈TamaxGain(D,a,t)=t∈TamaxEnt(D)−λ∈{−,+}∑∣D∣ Dtλ Ent(Dtλ)
其他常用的连续属性离散化方法还有如下所示:
- 等宽法:将连续属性的取值范围平均分成n个等宽的区间,每个区间代表一个离散值。这种方法简单易行,但是可能会忽略数据的分布特征,导致区间内的数据差异较大,区间间的数据差异较小。
- 等频法:将连续属性的取值范围分成n个区间,使得每个区间内包含的数据记录数目相等或接近相等,每个区间代表一个离散值。这种方法可以保证数据的均匀性,但是可能会造成区间的划分不合理,导致一些异常值或边界值被分到同一个区间内。
- 基于聚类分析的方法:将连续属性按照聚类算法进行聚类,然后根据聚类的结果,将同一聚类的记录合并到同一区间内,每个区间代表一个离散值。这种方法可以根据数据的内在特征进行划分,但是需要事先确定聚类的个数,而且聚类算法本身也有一定的复杂度和不确定性。
(2)缺失值处理
现实任务中常会遇到不完整样本,即样本的某些属性值缺失,尤其是在属性数目较多的情况下,往往会有大量样本出现缺失值,所以对于这样情况下的决策树,有以下两个问题有待解决:
- 如何在属性值缺失的情况下进行划分属性选择
- 给定划分属性,若样本在该属性上的值缺失,如何对样本进行划分
下面介绍几种常见的解决方法:
- 忽略缺失值:这种方法是直接删除或忽略含有缺失值的样本,只使用完整的样本来构建和预测决策树。这种方法简单易行,但是可能会造成数据的丢失和偏差,降低决策树的性能和泛化能力。
- 利用缺失值:这种方法是直接计算不缺失的数据,在选择最优划分属性时,直接采用没有缺失属性样本进行选择,在后续进行子结点划分时,如果遇到某个样本在属性上的取值缺失,则同时将这个样本划入当前所有子结点,也就是让同一个样本以不同的概率划入到不同的子结点中去。
- 填补缺失值:这种方法是利用已知的数据来估计或推断缺失值,然后用估计或推断出来的值来替代原来的缺失值,使得样本变得完整。这种方法可以保留数据的完整性,但是需要选择合适的填补方法,否则可能会引入误差和噪声,影响决策树的准确性。常用的填补方法有均值、中位数、众数、最近邻、回归、插值等。
4.5 多变量决策树
若把每个属性视为坐标空间中的一个坐标轴,则 d d d个属性描述的样本就对应了 d d d维空间中的一个数据点,对样本分类则意味着在这个坐标空间中寻找不同类样本之间的分类边界,在这里的分类边界由若干个与坐标轴平行的分段组成,这样的决策树也称为“多变量决策树”,比如下面两个例子:
| |
4.6 相关论文
下面结合近几年的一些论文来具体介绍决策树的应用。
(1)NBDT: Neural-Backed Decision Trees
神经网络是一种强大的机器学习方法,但它们通常缺乏可解释性,难以在需要准确和合理的预测的领域应用,如金融和医疗。为了解决这个问题,本文提出了一种将决策树嵌入神经网络的方法,称为NBDT,它可以在不改变原网络结构、不降低准确度的前提下增加网络的可解释性。NBDT方法保留原神经网络的特征提取部分结构,只在最后的全连接层上进行决策树嵌入,从而将神经网络的输出转化为一系列可理解的决策规则。NBDT方法可以应用于任何预训练的神经网络,无需重新训练或微调,只需使用一个简单的算法生成决策树结构和阈值。NBDT方法在多个图像分类数据集上进行了实验,证明了它可以保持原网络的准确性,同时提供可视化和可解释的决策过程。本文为提高神经网络的可解释性提供了一种有效和通用的方法。
(2)Decision tree based malware detection using static and dynamic analysis
本篇论文提出了一种使用决策树对恶意软件进行检测的方法,结合静态和动态分析的特征,如APIs、Summary Information、DLLs和Registry Keys Changed,同时使用Cuckoo sandbox进行动态恶意软件分析,它是一种可定制的、提供高准确度的工具。在实验中使用了2300多个恶意软件样本和1500多个正常软件样本,并将决策树与其他机器学习方法进行比较,如支持向量机、朴素贝叶斯、随机森林等,发现决策树在准确度、召回率、精确度和F1分数等指标上都有优势。