决策树学习的目标是根据给定的训练数据集合构建一个决策树模型,使它能够对实例进行正确的分类。决策树学习的本质是从训练数据中归纳出一组分类规则。
决策树学习算法流程:
决策树可以被认为是if-else规则的集合,也可以认为是定义在特征空间与类空间上的条件概率分布。
决策树表示给定特征条件下类的条件概率分布,这一条件概率分布定义在特征空间的一个划分上,将特征空间划分为互不相交的单元区域,并在每个单元定义一个类的概率分布就构成了一个条件概率分布。决策树的一条路径对应于划分的一个单元。决策树所表示的条件概率分布由各个单元给定条件下类的条件概率分布组成。假设 X X X为所表示特征的随机变量, Y Y Y为表示类的随机变量,那么这个条件概率分布可以表示为 P ( Y ∣ X ) P(Y|X) P(Y∣X), X X X的取值范围为给定划分下单元的集合, Y Y Y取值于类的集合。
决策树主要分为三种:ID3,C4.5和CART,它们分别对应的特征选择准则是信息增益(ID3),信息增益比(C4.5)或基尼指数(CART),即又它们决定当前选择哪个特征进行数据划分,使得样本在当下能够被最大程度的划分。下面将分别详细的介绍三种算法的原理和构建过程。
决策树很可能会产生过拟合,防止过拟合的方法有预剪枝和后剪枝。后剪枝是对已经生成的树自下而上进行剪枝,去掉过于细分的叶节点。预剪枝是在树的构建过程中就进行考虑,设定一个阈值,如果当前划分使损失函数的降低值小于该阈值,则停止划分,从而使它具有更好的泛化能力。如果特征数量很多,也可以在决策树学习开始的时候进行特征选择,只留下对训练数据有足够分类能力的特征。决策树的生成只考虑局部最优对应于模型的局部选择,相对地,剪枝对应于模型的全局选择,考虑全局最优。
ID3算法的核心思想应用信息增益准则作为标准,介绍信息增益之前首先介绍一下信息熵和条件熵:
在信息论与概率统计中,熵是表示随机变量不确定性的度量:
X X X是一个取值为有限个的离散随机变量,
H ( X ) = − ∑ i = 1 n p ( x i ) l o g p ( x i ) H(X) = - \sum^{n}_{i=1} p(x_i)logp(x_i) H(X)=−i=1∑np(xi)logp(xi)
H(X)就被称作随机变量x的熵,它表示随机变量不确定的度量,是对所有可能发生的时间产生的信息量的期望。熵取值越大,随机变量不确定性越大。熵取值越小,数据越纯。当随机变量为均匀分布时,熵最大。当概率取值为1时,熵的值为零。
信息增益在统计学中称为互信息,互信息是条件概率与后验概率的比值,化简之后就可以得到信息增益。所以说互信息其实就是信息增益。计算方法【互信息=熵-条件熵】。
条件熵 H ( Y ∣ X ) H(Y|X) H(Y∣X)表示在已知随机变量 X X X的条件下随机变量 Y Y Y的不确定性,定义为给定 X X X条件下 Y Y Y的条件概率分布的熵对 X X X的数学期望:
H ( Y ∣ X ) = ∑ x p ( x ) H ( Y ∣ X = x ) = − ∑ x p ( x ) ∑ y p ( y ∣ x ) l o g p ( y ∣ x ) H(Y|X)=\sum_xp(x)H(Y|X=x)\\ =-\sum_xp(x)\sum_yp(y|x)logp(y|x) H(Y∣X)=x∑p(x)H(Y∣X=x)=−x∑p(x)y∑p(y∣x)logp(y∣x)
接下来以特征值都为离散值的情况下,熵与条件熵都是怎么计算得到的:对于样本集合 D D D,类别数为K,数据集 D D D的经验熵为:
H ( D ) = − ∑ k = 1 K ∣ C k ∣ ∣ D ∣ l o g 2 ∣ C k ∣ ∣ D ∣ H(D)=-\sum^{K}_{k=1}\frac{|C_k|}{|D|}log_2\frac{|C_k|}{|D|} H(D)=−k=1∑K∣D∣∣Ck∣log2∣D∣∣Ck∣
其中 ∣ D ∣ |D| ∣D∣为样本容量。 ∣ C k ∣ |C_k| ∣Ck∣是样本集中属于第k类的样本子集。
特征A对于数据集 D D D的经验条件熵 H ( D ∣ A ) H(D|A) H(D∣A)为
H ( D ∣ A ) = ∑ i = 1 n ∣ D i ∣ ∣ D ∣ H ( D i ) = ∑ i = 1 n ∣ D i ∣ ∣ D ∣ ( − ∑ k = 1 k ∣ D i k ∣ ∣ D i ∣ l o g 2 ∣ D i k ∣ ∣ D i ∣ ) H(D|A)=\sum_{i=1}^{n} \frac{|D_i|}{|D|}H(D_i) = \sum_{i=1}^{n} \frac{|D_i|}{|D|}(-\sum_{k=1}^{k} \frac{|D_{ik}|}{|D_i|} log_2\frac{|D_{ik}|}{|D_i|}) H(D∣A)=i=1∑n∣D∣∣Di∣H(Di)=i=1∑n∣D∣∣Di∣(−k=1∑k∣Di∣∣Dik∣log2∣Di∣∣Dik∣)
其中 D i D_i Di表示 D D D中特征 A A A取第i个值的样本子集, D i k D_{ik} Dik表示 D i D_i Di中属于第 k k k类的样本子集。
而信息增益 g ( D , A ) g(D,A) g(D,A)就是熵与条件熵之差:
g ( D , A ) = H ( D ) − H ( D ∣ A ) g(D,A)=H(D)-H(D|A) g(D,A)=H(D)−H(D∣A)
信息增益的含义:
信息增益表示已知特征 X X X的信息而使得类 Y Y Y的信息不确定减少的程度。经验熵 H ( D ) H(D) H(D)表示对数据集D进行划分的不确定性,而经验条件熵 H ( D ∣ A ) H(D|A) H(D∣A)表示在给定特征A的条件下对数据集 D D D进行分类后的不确定性。所以它们的差,即信息增益就表示使用特征A对数据集D进行分类的不确定性减少的程度。信息增益越大的特征代表其具有更强的分类能力,所以我们就要选择能够使数据的不确定程度减少最多的特征,也就是信息增益最大的特征。
从根节点开始,计算所有可能特征的信息增益,选择信息增益最大的特征作为划分该节点的特征,根据该特征的不同区间建立子节点;在对子节点递归地调用以上方法,直到达到停止条件得到一个决策树。ID3相当于用极大似然法进行概率模型的选择。
C4.5算法与ID3算法相似,其对ID3算法进行了改进。
以信息增益作为划分准则存在的问题?
信息增益偏向于选择取值较多的特征进行划分。比如学号这个特征,每个学生都有一个不同的学号,如果根据学号对样本进行分类,则每个学生都属于不同的类别,这样是没有意义的。
而C4.5在生成过程中,用信息增益比来选择特征,可以校正这个问题。特征A对训练数据集D的信息增益比定义为其信息增益 g ( D , A ) g(D,A) g(D,A)与训练数据集 D D D关于特征 A A A的取值熵之比,即:
g R ( D , A ) = g ( D , A ) H A D g_R(D,A)=\frac{g(D,A)}{H_A{D}} gR(D,A)=HADg(D,A)
其中:
H A ( D ) = − ∑ i = 1 n ∣ D i ∣ ∣ D ∣ l o g 2 ∣ D i ∣ ∣ D ∣ H_A(D)=-\sum_{i=1}^{n}\frac{|D_i|}{|D|} log_2 \frac{|D_i|}{|D|} HA(D)=−i=1∑n∣D∣∣Di∣log2∣D∣∣Di∣
其中,n是特征A取值的个数,(当特征A的取值越多时,特征A的熵越大)。
特点:
ID3和C4.5虽然在对训练样本集的学习中可以尽可能多的挖掘信息,但其生成的决策树分支较大,规模较大。为了简化决策树的规模,提高生成决策树的效率,就出现了根据基尼指数来选择的CART;
CART为分类和回归数,既可以用于分类也可以用于回归。对回归树用平方误差最小准则,对分类树用基尼指数最小化准则。在这里我将主要介绍分类树。对于给定的样本集合 D D D,其基尼指数为:
G i n i ( D ) = 1 − ∑ k = 1 K ( ∣ C k ∣ ∣ D ∣ ) 2 Gini(D)=1-\sum_{k=1}^{K}(\frac{|C_k|}{|D|})^2 Gini(D)=1−k=1∑K(∣D∣∣Ck∣)2
Gini(D)表示集合 D D D中随即变量的不确定性程度,其中 C k C_k Ck是 D D D中属于第 k k k类的样本子集,K是类的个数。简单的说就是从数据集中随机选取两个样本,其类别标签不一致的概率。基尼指数越小表示数据的纯度越高,反之其值越大,样本集合的不确定性也就越大,与熵类似。当 C k C_k Ck等于 D D D时,Gini指数等于0。
需要说明的是CART是个二叉树,与ID3,C4.5不同。在每一次迭代中选择基尼指数最小的特征及其可能的二元划分,选择最优特征与最优切分点进行分类,每一步将数据按照特征A的取值切成两份,分别进入左右子树(其中n=2):
G i n i ( D ∣ A ) = ∑ i = 1 n D i D G i n i ( D i ) Gini(D|A)=\sum_{i=1}^{n} \frac{D_i}{D}Gini(D_i) Gini(D∣A)=i=1∑nDDiGini(Di)
把连续属性转换为离散属性再进行处理。虽然本质上属性的取值是连续的,但对于有限的采样数据它是离散的,如果有N条样本,那么我们有N-1种离散化的方法:<=vj的分到左子树,>vj的分到右子树。计算这N-1种情况下最大的信息增益率(连续属性与离散属性不同的是该属性还可以作为其后代结点的划分属性)。
另外,对于连续属性先进行排序(升序),只有在决策属性(即分类发生了变化)发生改变的地方才需要切开,这可以显著减少运算量。
决策树很容易出现过拟合现象。原因在于学习时完全考虑的是如何提高对训练数据的正确分类,从而构建出过于复杂的决策树。在决策树理论中,有这样一句话,“用较少的东西,照样可以做很好的事情。越是小的决策树,越优于大的决策树”。过拟合的决策树的错误率比一个经过简化的决策树的错误率要高。解决这个问题的方法称为剪枝,即对已生成的树进行简化。具体地,就是从已生成的树熵裁剪掉一些子树或叶节点,并将其根节点或父节点作为新的叶节点。
后剪枝一般比预剪枝保留了更多的分支,一般的情况下,后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树。但是后剪枝是在生成决策树之后自底向上的对树中所有的非叶结点进行逐一考察,因此其训练开销比预剪枝要大的多。
而预剪枝属于贪心的思想,有些分支的当前划分虽不能提升泛化性能,甚至可能导致泛化性能暂时下降,但是在其基础上进行的后续划分却有可能导致性能显著提高,给预剪枝带来了欠拟合的风险。
Reduced-Error Pruning(REP,错误率降低剪枝)
该剪枝方法考虑将树上的每个节点作为修剪的候选对象,决定是否修剪这个结点有如下步骤组成:
1:删除以此结点为根的子树;
2:使其成为叶子结点;
3:赋予该结点关联的训练数据的最常见分类;
4:当修剪后的树对于验证集合的性能不会比原来的树差时,才真正删除该结点;
因为训练集合的过拟合,使得验证集合数据能够对其进行修正,反复进行上面的操作,从底向上的处理结点,删除那些能够最大限度的提高验证集合的精度的结点,直到进一步修剪有害为止(有害是指修剪会减低验证集合的精度)。
REP是最简单的后剪枝方法之一,不过在数据量比较少的情况下,REP方法趋于过拟合而较少使用。这是因为训练数据集合中的特性在剪枝过程中被忽略,所以在验证数据集合比训练数据集合小的多时,要注意这个问题。尽管REP有这个缺点,不过REP仍然作为一种基准来评价其它剪枝算法的性能。它对于两阶段决策树学习方法的优点和缺点提供了一个很好的学习思路。由于验证集合没有参与决策树的创建,所以用REP剪枝后的决策树对于测试样例的偏差要好很多,能够解决一定程度的过拟合问题。
Pessimistic Error Pruning(PEP,悲观剪枝)
不需要使用测试数据,完全使用训练数据来生成决策树和剪枝,对于数据量比较少的情况比较有利。
具有 T T T个节点的树的误差率衡量为:
E ( T ) = ∑ t ∈ T e ( t ) + 1 / 2 N ( t ) E(T)=\sum_{t \in T} \frac{e(t)+1/2}{N(t)} E(T)=∑t∈TN(t)e(t)+1/2
其中 N ( t ) N(t) N(t)表示叶节点T中的样本总数; e ( t ) e(t) e(t)表示节点T中误判的样本个数;
去掉节点K之后 T ′ T^{'} T′个节点的树的误差衡量为(刺衡量方法侧重对每个节点的衡量)。
设 n ( t ) = e ( t ) + 1 / 2 N ( t ) n(t)=\frac{e(t)+1/2}{N(t)} n(t)=N(t)e(t)+1/2
可以证明:
E ( T ′ ) − E ( T ) = n ( t K ′ ) − n ( t K ) = e ( t K ′ ) − e ( t k ) N ( t ) E(T^{'})-E(T)=n(t^{'}_K)-n(t_K)=\frac{e(t_K^{'})-e(t_k)}{N(t)} E(T′)−E(T)=n(tK′)−n(tK)=N(t)e(tK′)−e(tk)(带着某个点的该支的误判个数-去掉某个点之后该支的误判个数再除以该支的总个数)
剪枝的条件是:
S E ( n ( t K ′ ) ) = n ( t K ′ ) ∗ ( N ( t ) − n ( t K ′ ) ) N ( t ) ≤ E ( T ′ ) − E ( T ) = e ( t K ′ ) − e ( t k ) N ( t ) SE(n(t_{K^{'}}))=\sqrt{\frac{n(t_{K^{'}})*(N(t)-n(t_{K^{'}}))}{N(t)}} \leq E(T^{'})-E(T)=\frac{e(t_K^{'})-e(t_k)}{N(t)} SE(n(tK′))=N(t)n(tK′)∗(N(t)−n(tK′))≤E(T′)−E(T)=N(t)e(tK′)−e(tk)
自顶向下逐层遍历, i f S E ( n ( t K ′ ) ) ≤ e ( t K ′ ) − e ( t k ) N ( t ) if SE(n(t_{K^{'}})) \leq \frac{e(t_K^{'})-e(t_k)}{N(t)} ifSE(n(tK′))≤N(t)e(tK′)−e(tk)则删除该节点所在分支;
先计算规则在它应用的训练样例上的精度,然后假定此估计精度为二项式分布,并计算它的标准差。对于给定的置信区间,采用下界估计作为规则性能的度量。这样做的结果,是对于大的数据集合,该剪枝策略能够非常接近观察精度,随着数据集合的减小,离观察精度越来越远。该剪枝方法尽管不是统计有效的,但是在实践中有效。
PEP为了提高对测试集合的预测可靠性,PEP对误差估计增加了连续性校正(Continuity Correction)PEP算法是唯一使用Top-Down剪枝策略,这种策略会导致与先剪枝出现同样的问题,将该结点的某子节点不需要被剪枝时被剪掉;另外PEP方法会有剪枝失败的情况出现。
虽然PEP方法存在一些局限性,但是在实际应用中表现出了较高的精度。再者其剪枝策略比其它方法相比效率更高,速度更快。因为在剪枝过程中,树中的每颗子树最多需要访问一次,在最坏的情况下,它的计算时间复杂度也只和非剪枝树的非叶子节点数目成线性关系。
Cost-Complexity Pruning(CCP、代价复杂度)
一颗树的好坏用如下式子衡量:
R α ( T ) = R ( T ) + α C ( T ) R_\alpha (T) = R(T)+\alpha C(T) Rα(T)=R(T)+αC(T)
其中 R ( T ) R(T) R(T)代表该树误差的衡量, C ( T ) C(T) C(T)表示对树的大小的衡量(可以用树的终端节点个数表示)。
怎么使用这个准则剪枝呢?
剪枝过程特别重要,所以在最优决策树生成过程中占有重要地位。 有研究表明,剪枝过程的重要性要比树生成过程更为重要,对于不同的划分标准生成的最大树(Maximum Tree),在剪枝之后都能够保留最重要的属性划分,差别不大。反而是剪枝方法对于最优树的生成更为关键,在数据带有噪声时通过剪枝甚至可以将决策树的泛化性能提升25%.
对于某些采样数据,可能会缺少属性值。在这种情况下,处理缺少属性值的通常做法是赋予该属性的常见值,或者属性均值。
另外一种比较好的方法是为该属性的每个可能值赋予一个概率,即将该属性以概率形式赋值。例如给定Boolean属性B,已知采样数据有12个B=0和88个B=1实例,那么在赋值过程中,B属性的缺失值被赋为B(0)=0.12、B(1)=0.88;所以属性B的缺失值以12%概率被分到False的分支,以88%概率被分到True的分支。这种处理的目的是计算信息增益,使得这种属性值缺失的样本也能处理。
参考资料:分类算法-决策树