统计学习五:2.决策树的学习
全文引用自《统计学习方法》(李航)
决策树的学习过程包含了特征选择、决策树的生成和决策树的剪枝三个步骤,其中特征选择主要作用是对决策树每一个内部节点的分类特征进行选择;决策树的生成主要利用每个节点选择的特征对节点内的数据集进行划分,直至到达叶节点,生成一棵树;决策树的剪枝通过修剪决策树中分类过于细化的类型,降低决策树的复杂度,提高决策树的泛化能力,防止过拟合。
1. 特征选择
1.1 特征选择问题
特征选择的主要目标是选择对训练数据集具有最大的分类能力的特征,这样可以提高决策树学习的效率,降低决策树的复杂度。如果通过一个特征对于数据集进行分类的能力与随机分类的效果没有很大区别,那么这个特征的存在与否对决策树学习的精度影响并不大,是可以被舍弃的特征。在实际的应用中,特征的选择准则通常采用信息增益或信息增益比。
1.2 信息增益
首先给出熵和条件熵的定义。
在信息论与概率统计中,熵(entropy)是表示随机变量的不确定性的度量。
设X是一个取有限个值的离散随机变量,其概率分布为:
则随机变量的熵定义为:
其中,若\(p_i=0\),则\(0\log 0 = 0\)。通常,熵的定义公式中,对数以2或e为底,此时熵的单位称为比特(bit)或纳特(nat)。由上述定义可知,熵的大小只依赖于X的分布,即其概率大小,而与X本身的值无关,所以也可以将X的熵表示为:
而熵越大,则表明随机变量的不确定性越大.由定义可知:
当随机变量的取值只有0和1两个变量时,即X的分布为
,则其熵为:
此时,熵\(H(p)\)随概率p的变化曲线如下图:

设(X,Y)是随机变量,其联合概率密度为:
条件熵\(H(Y|X)\)表示在已知随机变量X的情况下,随机变量Y的不确定性。随机变量X给定条件下随机变量Y的条件熵\(H(Y|X)\)定义为X给定条件下Y 的条件概率分布的熵对X的数学期望:
若熵和条件熵中的概率由数据估计(如极大似然估计)得到时,称为经验熵和经验条件熵。
信息增益(information gain) 表示在得知特征X的信息时,类Y的信息的不确定性减少的程度。
特征A对训练集D的信息增益\(g(D,A)\),定义为集合D的经验熵\(H(D)\)与特征A给定条件下D的经验条件熵\(H(D|A)\)之差,即:
一般称熵\(H(Y)\)和条件熵\(H(Y|X)\)之差为互信息。而决策树学习中采用的信息增益就等价于训练数据集中类和特征的互信息。信息增益代表了特征A对数据集D分类的不确定性的减少程度,因此,对于数据集D而言,信息增益依赖于特征,不同的特征具有不同的信息增益,而信息增益越大的特征,就表示具有更强的分类能力。
根据信息增益准则选择特征的方法就是:对训练数据集或其子集D,计算每个特征的信息增益,并比较他们的大小,选择信息增益最大的特征作为分类特征。
信息增益的算法如下:
- 设训练数据集为D,\(|D|\)表示其样本容量,即样本个数;
设共有K个类\(C_k,k=1,2,\cdots,K,|C_k|\)表示属于类\(C_k\)的样本个数,可知\(\sum_{k=1}^K|C_k|=|D|\);
设特征A有n个不同的取值\(\{a_1,a_2,\cdots,a_n\}\),根据特征A的取值,将D划分为n个子集\(D_1,D_2,\cdots,D_n,|D_i|\)为\(D_i\)的样本个数,可知\(\sum_{i=1}^n|D_i|=|D|\);
设子集\(D_i\)中属于类\(C_k\)的样本集合为\(D_{ik}\),即\(D_{ik} = D_i\bigcap C_k,|D_{ik}|\)为\(D_{ik}\)的样本个数。 - 输入:训练数据集D和特征A
- 输出:特征A对训练数据集D的信息增益\(g(D,A)\)
- 计算数据集D的经验熵:
- 计算特征A对数据集D的经验条件熵:
- 计算信息增益:
1.3 信息增益比
信息增益的大小是相对于训练集而言,并没有绝对意义,而是会随着训练集的改变而改变。在分类问题中,信息增益会随着训练集的经验熵的增大而增大。因此利用给定的数据集进行计算时,信息增益并不能准确反映出特征对数据集真正的影响。而使用信息增益比(information gain ratio) 可以对这一问题进行校正,这便是特征选择的另一类标准。
信息增益比\(g_{_R}(D,A)\)指特征A对训练集D的信息增益\(g(D,A)\)与训练集D的经验熵\(H(D)\)之比:
2. 决策树的生成
本节介绍决策树学习的经典算法,包括ID3算法和C4.5算法。
2.1 ID3算法
ID3算法主要选择信息增益作为每个决策树每个节点的分类特征,通过递归方式构建决策树。该算法首先计算其上数据集所有可能的特征的信息增益,并选择信息增益最大的特征为分类特征,根据此特征的不同的特征值划分子集,构建子树,并对子树递归调用以上方法,直到所有特征的信息增益都很小或没有特征可以选择为止,最终得到决策树。ID3算法实际上相当于用极大似然估计进行概率模型的选择。
算法的具体过程如下:
- 输入:训练数据集D,特征集A,阈值ε;
- 输出:决策树T
- 若D中所有实例属于类\(C_k\),则T为单节点树,并将类\(C_k\)作为该节点的类标记,返回T;
- 若\(A=\emptyset\),则T为单节点树,并将D中实例数最大的类\(C_k\)作为该节点的类标记,返回T;
- 否则,计算A中各个特征对D的信息增益,选择信息增益最大的特征\(A_g\);
- 若\(A_g\)的信息增益小于阈值ε,则T为单节点树,并将D中实例数最大的类\(C_k\)作为该节点的类标记,返回T;
- 否则,对\(A_g\)的每一个可能的取值\(a_i\),依\(A_g=a_i\)将D分割为若干非空子集\(D_i\),将\(D_i\)中实例最大的类作为类标记,构建子节点,由此节点及其子节点构成树T,返回T;
- 对第i个子节点,以\(D_i\)为训练集,以\(A-\{A_g\}\)为特征集,递归调用1-5步,得到子树\(T_i\),返回\(T_i\)。
ID3算法主要作用是生成决策树,并不包含树的剪枝操作,因此生成的树容易产生过拟合。
2.2 C4.5的生成算法
C4.5算法与ID3算法基本类似,前者主要对后者做了一定程度的改机,即选择信息增益比作为特征的选择准则。
算法的过程如下:
- 输入:训练数据集D,特征集A,阈值ε;
- 输出:决策树T
- 若D中所有实例属于类\(C_k\),则T为单节点树,并将类\(C_k\)作为该节点的类标记,返回T;
- 若\(A=\emptyset\),则T为单节点树,并将D中实例数最大的类\(C_k\)作为该节点的类标记,返回T;
- 否则,计算A中各个特征对D的信息增益比,选择信息增益比最大的特征\(A_g\);
- 若\(A_g\)的信息增益小于阈值ε,则T为单节点树,并将D中实例数最大的类\(C_k\)作为该节点的类标记,返回T;
- 否则,对\(A_g\)的每一个可能的取值\(a_i\),依\(A_g=a_i\)将D分割为若干非空子集\(D_i\),将\(D_i\)中实例最大的类作为类标记,构建子节点,由此节点及其子节点构成树T,返回T;
- 对第i个子节点,以\(D_i\)为训练集,以\(A-\{A_g\}\)为特征集,递归调用1-5步,得到子树\(T_i\),返回\(T_i\)。
3.决策树的剪枝
决策树的生成算法所生成的决策树通常对训练数据有很好的分类准确性,但泛化能力较弱,即对未知数据的分类效果不一定准确,容易产生过拟合现象。过拟合产生的原因主要是由于在学习过程中,过多的考虑对训练数据分类准确性的追求,而最终生成了复杂度较高的决策树。而解决方案就是对已生成的决策树进行简化,降低决策树的复杂度。
将已生成的决策树进行简化的过程称为剪枝(pruning),具体过程就是,从已生成的决策树上裁剪掉一些子树或叶节点,并将其根节点或父节点作为新的叶子,从而简化决策树。
决策树的剪枝往往通过极小化决策树的损失函数或代价函数来实现。设树T的叶节点个数为\(|T|\),t是树T的叶节点,该叶节点上的样本个数为\(N_t\),其中k类的样本点有\(N_{tk}\)个,\(k=1,2,\cdots,K,H_i(T)\)为叶节点t上的经验熵,\(\alpha \ge 0\)为参数,则决策树的损失函数定义为:
其中,经验熵为:
在损失函数中,将右端第一项记为:
可得:
在上式中,\(C(T)\)表示模型对训练数据的预测误差,即模型与训练数据的拟合程度,|T|表示模型的复杂度,参数\(\alpha \ge 0\)控制两者之间的影响。剪枝操作就是当\(\alpha\)确定时,选择损失函数最小的模型,即损失函数最小的子树。当\(\alpha\)确定时,子树越大,与训练数据的拟合越好,但模型的复杂度就会越高;子树越小,模型的复杂度就会越低,但与训练数据的拟合就会变差。损失函数代表了对两者的平衡。
可以看出,决策树的生成只考虑通过信息增益(信息增益比)来对训练数据进行拟合,决策树的剪枝通过优化损失函数来降低决策树的复杂度,避免过拟合。决策树生成过程学习局部的模型,决策树剪枝过程学习全局的模型。实际上,利用损失函数最小原则进行剪枝就是用正则化的极大似然估计进行模型的选择。
剪枝算法的具体过程为:
- 输入:生成算法产生的整棵树T,参数\(\alpha\);
- 输出:修剪后的子树\(T_{\alpha}\)
- 计算每个节点的经验熵
- 递归地从树的叶节点向上回缩,设一组叶节点回缩到其父节点之前与之后的树分别为\(T_B,T_A\),则其对应的损失函数分别为\(C_{\alpha}(T_B),C_{\alpha}(T_A)\),若\(C_{\alpha}(T_A)\le C_{\alpha}(T_B)\),则进行剪枝,将父节点变为新的叶节点;
- 返回2,知道不能继续为止,得到损失函数最小的子树\(T_{\alpha}\)。
决策树剪枝的计算过程,只需要考虑两棵子树的损失函数的差,可以在局部进行计算,因此可以采用动态规划的方式实现剪枝算法。
通过决策树学习的上述三个过程,我们就能够得到一个可用于分类的决策树,并对新的实例进行有效的分类。

浙公网安备 33010602011771号