本篇内容为西瓜书第 4 章决策树 4.1
,4.2
,4.3
的内容:
- 4.1 基本流程
- 4.2 划分选择
- 4.3 剪枝处理
如移动端无法正常显示文中的公式,右上角跳至网页即可正常阅读。
决策树 (decision tree) 是一种基本的分类与回归方法。在分类问题中,表示基于特征对实例进行分类的过程。决策树学习通常包括 3 个步骤:特征选择、决策树的生成和决策树的修剪。这些决策树的思想主要来源于由 Quinlan 在1968 年提出的 ID3
算法和 1993 年提出的 C4.5
算法,以及由 Breiman 等人在 1984 年提出的 CART
算法。
决策树是一种树型结构,其中每个内部结点表示在一个属性
上的测试,每个分支代表一个测试输出,每个叶结点代表一种类别
。如下图所示,就是判断一颗瓜是否为好瓜的一颗决策树。
决策树学习采用的是自顶向下的递归方法,其基本思想是以信息熵为度量构造一棵熵值下降最快的树,到叶子结点处的熵值为零,此时每个叶结点中的实例都属于同一类。
这具体是说什么意思呢?我们来看下面的内容。
基本流程
一般的,一棵决策树包含一个根节点,若干个内部结点和若干个叶结点;叶结点对应于决策结果,其他每个结点则对应于一个属性测试;每个结点包含的样本集合根据属性测试的结果被划分到子结点中;根结点包含样本全集。从根结点到每个叶结点的路径对应了一个判定测试序列。
决策树学习的目的是为了产生一棵泛化能力强,即处理未见示例能力强的决策树,其基本流程遵循简单且直观的“分而治之”策略,如下图所示:
可以认为,所谓的决策树就是信息熵不断下降的一个过程。比如若叶子结点是完全确定的一个类别,它的信息熵为 0。这里说的熵减少是指叶子结点信息熵的平均值(按样本个数加权取平均值)一定低于父结点的熵。
在信息论与概率统计中,熵 (entropy) 是表示随机变量不确定性的度量。设 $X$ 是一个取有限个值的离散随机变量,其概率分布为
$$ P(X=x_i)=p_i,\quad i=1,2,···,n $$
则随机变量 $X$ 的熵定义为
$$ H(X)=-\sum_{i=1}^{n}p_ilogp_i $$
由定义可知,熵只依赖于 $X$ 的分布,而与 $X$ 的取值无关,所以也可将 $X$ 的熵记作 $H(p)$,即
$$ H(p)=-\sum_{i=1}^{n}p_ilogp_i $$
当随机变量只取两个值,例如 1,0 时,即 $X$ 的分布为
$$ P(X=1)=p,\quad P(X=0)=1-p,\quad 0\leq p\leq 1 $$
熵为
$$ H(p)=-plog_2p-(1-p)log_2(1-p) $$
下面我们画图来说明。将上述公式通过下列代码绘图:
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> eps = 0.00001
>>> p = np.linspace(eps, 1-eps, 100)
>>> H = -p * np.log(p) - (1-p) * np.log(1-p)
>>> plt.plot(p, H)
[<matplotlib.lines.Line2D object at 0x113dc89e8>]
>>> plt.show()
得到熵 $H(p)$ 随概率 $p$ 变化的曲线如下图所示:
当 $p=0$ 或 $p=1$ 时 $H(p)=0$,随机变量完全没有不确定性。当 $p=0.5$ 时,熵取值最大,随机变量不确定性最大。
划分选择
决策树学习的生成算法
建立决策树的关键,即在当前状态下选择哪个属性作为分类依据。根据不同的目标函数,建立决策树主要有以下三种算法:
- ID3:信息增益
- C4.5:信息增益率
- CART:基尼指数
下面给出信息增益、信息增益率、基尼系数的定义(来自李航的《统计学习方法》),最后用一个例子来说明。
在给出定义前,先对一些符号进行说明:
- $D$:训练数据集
- $|D|$:样本容量,即样本个数
- $C_k$:设有 $K$ 个类 $C_k$,$k=1,2,···,K$
- $|C_k|$:属于类 $C_k$ 的样本个数,即 $\sum_{k=1}^{K}|C_k|=|D|$
- $A$:设特征 $A$ 有 $n$ 个不同的取值 ${a_1,a_2,···,a_n}$,根据特征 $A$ 的取值将 $D$ 划分为 $n$ 个子集 $D_1,D_2,···,D_n$
- $|D_i|$:$D_i$ 的样本个数,即 $\sum_{i=1}^{n}|D_i|=|D|$
- $D_{ik}$:记子集 $D_i$ 中属于类 $C_k$ 的样本的集合为 $D_{ik}$,即 $D_{ik}=D_i \cap C_k$
- $|D_{ik}|$:$D_{ik}$ 的样本个数
- $H(D)$:经验熵
$$ H(D)=-\sum_{k=1}^{K}\frac{|C_k|}{D}log_2\frac{|C_k|}{D} $$
- $H(D | A)$:经验条件熵
$$ 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|} $$
当熵和条件熵中的概率由数据估计(特别是极大似然估计)得到时,所对应的熵与条件熵分别称为经验熵和条件经验熵。
特征选择的准则
特征选择是决定用哪个特征来划分特征空间,即如何选择最优划分属性。要生成一棵树,就要知道从当前结点上,如何划分形成下面的结点,可以说,这是做决策树的意义、目的和难点。通常特征选择的准则就是上面提到的信息增益或信息增益比,还有基尼指数。
定义 5.2(信息增益)
特征 $A$ 对训练数据集 $D$ 的信息增益 $g(D, A)$,定义为集合 $D$ 的经验熵 $H(D)$ 与特征 $A$ 给定条件下 $D$ 的经验条件熵 $H(D|A)$ 之差,即
$$ g(D|A)=H(D)-H(D|A) $$
一般地,熵 $H(Y)$ 与条件熵 $H(Y|X)$ 之差称为互信息 (mutual information)。决策树学习中的信息增益等价于训练数据集中类与特征的互信息。
定义 5.3(信息增益比)
特征 $A$ 对训练数据集 $D$ 的信息增益比 $g_R(D, A)$ 定义为其信息增益 $g(D, A)$ 与训练数据集 $D$ 关于特征 $A$ 的值的熵 $H_A(D)$ 之比,即
$$ g_R(D, A)=\frac{g(D|A)}{H_A(D)} $$
其中,$H_A(D)=-\sum_{i=1}^{n}\frac{|D_i|}{|D|}log_2\frac{|D_i|}{|D|}$,$n$ 是特征 $A$ 取值的个数。
定义 5.4(基尼系数)
分类问题中,假定有 $K$ 个类,样本点属于第 $k$ 类的概率为 $p_k$,则概率分布的基尼指数定义为
$$ Gini(p)=\sum_{k=1}^{K}p_k(1-p_k)=1-\sum_{k=1}^{K}p_k^2 $$
对于给定的样本集合 $D$,其基尼指数为
$$ Gini(D)=1-\sum_{k=1}^{K} \left(\frac{|C_k|}{|D|} \right)^2 $$
这里,$C_k$ 是 $D$ 中属于第 $k$ 类的样本子集,$K$ 是类的个数。
如果样本集合 $D$ 根据特征 $A$ 是否取某一可能值 $a$ 被分割成 $D_1$ 和 $D_2$ 两部分,即
$$ D_1= \{ (x,y)\in D|A(x)=a \},\quad D_2=D-D_1 $$
则在特征 $A$ 的条件下,集合 $D$ 的基尼指数定义为
$$ Gini(D,A)=\frac{|D_1|}{|D|}Gini(D_1)+\frac{|D_2|}{|D|}Gini(D_2) $$
基尼指数 $Gini(D)$ 表示集合 $D$ 的不确定性,基尼指数 $Gini(D,A)$ 表示经 $A=a$ 分割后集合 $D$ 的不确定性。
直观来说,$Gini(D)$ 反映了从数据集 $D$ 中随机抽取两个样本,其类别标记不一致的概率。因此,$Gini(D)$ 越小,则数据集 $D$ 的纯度越高。
下面选取了一个例子(来自李航的《统计学习方法》)来说明上述公式的运用,以及生成决策树的计算过程。
以信息增益为准则来选择划分属性为例,简单的解释如下:
在本例中,共有 15 个样本,有“年龄”“有工作”“有自己的房子”“信贷情况”共 4 个特征,这里为了叙述方便,分别记做 $A_1,A_2,A_3,A_4$。最后一列类别表示是否同意贷款,有“是”“否”两个值,记做 $Y$。
- 计算$H(Y)$,即经验熵 $H(D)$
- 计算 $A_1$ 给定的条件下随机变量 $Y$ 的条件熵 $H(Y|A_1)$,即经验条件熵 $H(D|A_1)$
为了计算 $H(D|A_1)$,又特征“年龄”有 3 个可能值:青年、中年、老年,用不严格的记号来说明下列过程:
$A_1=青年(5)$:$\frac{5}{15}*H(D|A_1=青年)$
$A_1=中年(5)$:$\frac{5}{15}*H(D|A_1=中年)$
$A_1=老年(5)$:$\frac{5}{15}*H(D|A_1=老年)$
$H(D|A_1)=H(D|A_1=青年)+H(D|A_1=中年)+H(D|A_1=老年)$
- 计算特征 $A_1$ 对数据集 $D$ 的信息增益
$g(D,A_1)=H(D)-H(D|A_1)$
同理,分别可得到 $g(D,A_2),g(D,A_3),g(D,A_4)$。最后比较各特征的信息增益值,选择其值最大的那个特征作为最优特征。
根据信息增益准则的特征选择方法是:对训练数据集(或子集)$D$,计算其每个特征的信息增益,并比较它们的大小,选择信息增益最大的特征。
以上过程即解释了信息增益的算法:
总的来说,对于分类问题而言,若根据信息增益比和基尼指数来选择特征,也是类似的想法。对于回归问题,则可以用计算均方误差来进行阈值划分。
通过上述例子,我们对如何用算法生成决策树有了一个大致的了解,下面我们给出三种主要的算法步骤。
ID3 算法:
C4.5 的生成算法:
CART 生成算法:
剪枝处理
剪枝 (pruning) 是决策树学习算法对付“过拟合”的主要手段。其基本策略有预剪枝和后剪枝。这里主要介绍的是后剪枝。决策树的剪枝往往通过极小化决策树整体的损失函数或代价函数来实现。如下图所示:
上述的三种决策树的剪枝过程算法相同,区别仅是对于当前树的评价标准不同。
剪枝总体思路
由完全树 $T_0$ 开始,剪枝部分结点得到 $T_1$,再次剪枝部分结点得到 $T_2$···直到仅剩树根的树 $T_k$,在验证数据集上对这 $k$ 个树分别评价,选择损失函数最小的树 $T_\alpha$。
剪枝算法
对于给定的决策树 $T_0$:
$\quad$计算所有内部结点的剪枝系数;
$\quad$查找最小剪枝系数的结点,剪枝得决策树 $T_k$;
$\quad$重复以上步骤,直到决策树 $T_k$ 只有 1 个结点;
$\quad$得到决策树序列 $T_0,T_1,T_2,···,T_k$;
$\quad$使用验证样本集选择最优子树。
使用验证集做最优子树的标准,可以使用评价函数:
$$ C(T)=\sum_{t}^{|T|} N_t·H_t(T) $$
剪枝系数的确定
这里的剪枝系数指的是决策树学习的损失函数中的参数 $\alpha$。剪枝,就是当 $\alpha$ 确定时,选择损失函数最小的模型,即损失函数最小的子树。
下面我们来给出决策树学习的损失函数。根据评价函数(由于该评价函数越小越好,所以可以称之为“损失函数”):
$$ C(T)=\sum_{t}^{|T|} N_t·H_t(T) $$
其中,树 $T$ 的叶结点个数为 $|T|$。$t$ 是树 $T$ 的叶结点,该叶结点有 $N_t$ 个样本点,其中 $k$ 类的样本点有 $N_{tk}$ 个,$k=1,2,···,K$。$H_t(T)$ 为叶结点 $t$ 上的经验熵
$$ H_t(T)=\sum_{k}\frac{N_{tk}}{N_t}log{\frac{N_{tk}}{N_t}} $$
$\alpha \ge0$ 为参数,叶结点越多,决策树越复杂,损失越大。则决策树学习的损失函数可以定义为
$$ C_\alpha(T)=C(T)+\alpha|T| $$
用 $C(T)$ 表示模型对训练数据的预测误差,即模型与训练数据的拟合程度,$|T|$表示模型复杂度,参数 $\alpha$ 控制两者之间的影响。其中
$$ C(T)=\sum_{t=1}^{|T|}N_tH_t(T)=-\sum_{t=1}^{|T|}\sum_{k=1}^{K}N_{tk}log\frac{N_{tk}}{N_t} $$
当 $\alpha$ 值确定时,子树越大,往往与训练数据的拟合越好,但是模型的复杂度就越高;相反,子树越小,模型的复杂度就越低,但是往往与训练数据的拟合不好。损失函数正好表示了对两者的平衡。
下面我们来描述计算 $\alpha$ 过程。在这个过程中,计算子树的损失函数。对固定的 $\alpha$,一定存在使损失函数 $C_\alpha(T)$ 最小的子树,将其表示为 $T_\alpha$,$T_\alpha$ 在损失函数 $C_\alpha(T)$ 最小的意义下是最优的,且这样的最优子树是唯一的。
当 $\alpha$ 大的时候,最优子树 $C_\alpha(T)$ 偏小;当 $\alpha$ 小的时候,最优子树 $C_\alpha(T)$ 偏大。极端情况,当 $\alpha=0$ 时,未剪枝的决策树损失最小。当 $\alpha=+\infty$ 时,单根结点的决策树损失最小。
具体地,从整体树 $T_0$ 开始剪枝,假定当前对以 $t$ 为根的子树剪枝。剪枝后,只保留 $t$ 本身而删掉所有的叶子考察以 $t$ 为根的子树。则以 $t$ 为单结点树,即剪枝后的损失函数是:
$$ C_\alpha(t)=C(t)+\alpha $$
以 $t$ 为根结点的子树 $T_t$ ,即剪枝前的损失函数是:
$$ C_\alpha(T_t)=C(T_t)+\alpha|T_t| $$
令二者相等,求得:
$$ \alpha=\frac{C(t)-C(T_t)}{|T_t|-1} $$
此时,$T_t$ 与 $t$ 有相同的损失函数值,而 $t$ 的结点少,因此 $t$ 比$T_t$ 更可取,对 $T_t$ 进行剪枝。其中,$\alpha$ 称为结点 $t$ 的剪枝系数。
不足之处,欢迎指正。
$$$$
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。