统计学习方法 学习笔记(十):决策树
这一个学习笔记将要了解决策树,在研一上机器学习这门课的时候,老师在讲到这一节的时候,举了一个例子我现在还能记得:你们坐在这里上课,就像这个决策树一样,在你人生中的每一个重要结点,你都做出了选择,经过多次的选择,走到现在这个时候(坐在这里听课),人生就像一个决策树,对于决策树而言有多个叶子结点,也就像人生有多条路,前面的众多选择决定了自己的路。加油吧!在每一个结点上,请认真地做好每一个选择。
决策树模型呈树形结构,在分类问题中,表示基于特征对实例进行分类的过程。它可以认为是if-then规则的集合,也可以认为是定义在特征空间与类空间上的条件概率分布。其主要优点是模型具有可读性,分类速度快。学习时,利用训练数据,根据损失函数最小化的原则建立决策树模型。预测时,对新的数据,利用决策树模型进行分类。决策树学习通常包括3个步骤:特征选择、决策树的生成和决策树的修剪。先介绍决策树的基本概念,然后通过ID3和C4.5介绍特征的选择、决策树的生成以及决策树的修剪,最后介绍CART算法。
决策树模型:
决策树:分类决策树模型是一种描述对实例进行分类的树形结构。决策树由结点和有向边组成,结点有两种类型:内部结点和叶节点。内部结点表示一个特征或属性,叶节点表示一个类。
决策树与if-then规则:由决策树的根节点到叶节点的每一条路径构建一条规则;路径上内部结点的特征对应着规则的条件,而叶节点的类对应着规则的结论。
决策树与条件概率分布:决策树还表示给定特征条件下类的条件概率分布,这一条件概率分布定义在特征空间的一个划分(partition)上,将特征空间划分为互不相交的单元或区域,并在每个单元定义一个类的概率分布就构成了一个条件概率分布。
决策树学习:
决策树学习,假设给定训练数据集:
$$D = \{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\}$$
其中,$x_i = (x_i^{(1)},x_i^{(2)},...,x_i^{(n)})^T$为输入实例(特征向量),$n$为特征个数,$y_i \in \{1,2,...,K\}$为类标记,$i=1,2,...,N$,$N$为样本容量。学习的目标是根据给定的训练数据集构建一个决策树模型,使它能够对实例进行正确的分类。
决策树学习的损失函数通常是正则化的极大似然函数。当损失函数确定后,学习问题就变成为在损失函数意义下选择最优决策树的问题。因为从所有可能的决策树中选取最优决策树是NP完全问题。所以现实中决策树学习算法通常采用启发式方法,近似求解这一最优化问题。
决策树学习的算法通常是一个递归地选择最优特征,并根据该特征对训练数据进行分割,使得对各个子数据集有一个最好的分类的过程,这一过程对特征空间的划分,也对应着决策树的构建。
特征选择:
特征选择在于选取对训练数据具有分类能力的特征,这样可以提高决策树学习的效率。如果利用一个特征进行分类的结果与随机分类的结果没有很大差别,则称这个特征是没有分类能力的。经验上扔掉这样的特征对决策树学习的精度影响不大。通常特征选择的准则是信息增益或信息增益比。
信息增益:
为了便于说明,先给出熵与条件熵的定义:
熵,是表示随机变量不确定性的度量。设$X$是一个取有限个值的离散随机变量,其概率分布为:
$$P(X=x_i) = p_i, i=1,2,...,n$$
则随机变量$X$的熵定义为:
$$H(X) = - \sum_{i=1}^{n}p_ilogp_i$$
设有随机变量$(X,Y)$,其联合概率分布为
$$P(X=x_i,Y=y_j) = p_{ij}, i=1,2,...,n; j=1,2,...,m$$
条件熵$H(Y|X)$表示在已知随机变量$X$的条件下随机变量$Y$的不确定性。随机变量$X$给定的条件下随机变量$Y$的条件熵$H(Y|X)$,定义为$X$给定条件下$Y$的条件概率分布的熵对$X$的数学期望:
$$H(Y|X) = \sum_{i=1}^{n}p_iH(Y|X=x_i)$$
这里,$p_i = P(X=x_i), i=1,2,...,n.$
当熵和条件熵中的概率由数据估计(特别是极大似然估计)得到时,所对应的熵与条件熵分别称为经验熵和经验条件熵。此时,如果有0概率,令0log0=0.
信息增益表示得知特征$X$的信息而使得类$Y$的信息的不确定性减少的程度。
信息增益定义:
特征$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)。决策树学习中的信息增益等价于训练数据集中类与特征的互信息。对于数据集$D$而言,信息增益依赖于特征,不同的特征往往具有不同的信息增益。信息增益大的特征具有更强的分类能力。
根据信息增益准则的特征选择方法是:对训练数据集(或子集)$D$,计算其每个特征的信息增益,并比较它们的大小,选择信息增益最大的特征。
设训练数据集为$D$,$|D|$表示其样本容量,即样本个数。设有$K$个类$C_k, k=1,2,...,K, |C_k|$为属于类$C_k$的样本个数,$\sum_{k=1}^{K}|C_k| = |D|$。设特征$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_i$中属于类$C_k$的样本的集合为$D_{ik}$,即$D_{ik} = D_i \bigcap C_k$,$|D_{ik}|$为$D_{ik}$的样本个数。于是信息增益的算法如下:
信息增益的算法:
输入:训练数据集$D$和特征$A$;
输出:特征$A$对训练数据集$D$的信息增益$g(D,A)$。
(1)计算数据集$D$的经验熵$H(D)$
$$H(D) = - \sum_{k=1}^{K}\frac{|C_k|}{|D|}log_{2}\frac{|C_k|}{|D|}$$
(2)计算特征$A$对数据集$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|}$$
(3)计算信息增益
$$g(D,A) = H(D) - H(D|A)$$
信息增益比:
以信息增益作为划分训练数据集的特征,存在偏向于选择取值较多的特征的问题。使用信息增益比(information gain ratio)可以对这一问题进行校正。这是特征选择的另一准则。
信息增益比:特征$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$取值的个数。
决策树的生成:
首先介绍$ID3$的生成算法,然后再介绍C4.5中的生成算法(C4.5算法是十大算法之首)。这些都是决策树学习的经典算法。
ID3算法:
输入:训练数据集$D$,特征集$A$,阈值$\varepsilon $;
输出:决策树$T$。
(1)若$D$中所有实例属于同一类$C_k$,则$T$为单结点树,并将类$C_k$作为该结点的类标记,返回$T$。
(2)若$A=\emptyset $,则$T$为单结点树,并将$D$中实例数最大的类$C_k$作为该结点的类标记,返回$T$;
(3)否则,根据信息增益公式计算$A$中各特征对$D$的信息增益,选择信息增益最大的特征$A_g$;
(4)如果$A_g$的信息增益小于阈值$\varepsilon$,则置$T$为单结点树,并将$D$中实例数最大的类$C_k$作为该结点的类标记,返回$T$;
(5)否则,对$A_g$的每一个可能值$a_i$,依$A_g = a_i$将$D$分割为若干非空子集$D_i$,将$D_i$中实例数最大的类作为标记,构建子结点,由结点及其子结点构成树$T$,返回$T$;
(6)对第$i$个子结点,以$D_i$为训练集,以$A-{A_g}$为特征集,递归地调用步(1)~步(5),得到子树$T_i$,返回$T_i$。
C4.5算法对ID3算法进行了改进,C4.5在生成的过程中,用信息增益比来选择特征。
C4.5的生成算法:
输入:训练数据集$D$,特征集$A$,阈值$\varepsilon $;
输出:决策树$T$。
(1)若$D$中所有实例属于同一类$C_k$,则$T$为单结点树,并将类$C_k$作为该结点的类标记,返回$T$。
(2)若$A=\emptyset $,则$T$为单结点树,并将$D$中实例数最大的类$C_k$作为该结点的类标记,返回$T$;
(3)否则,根据信息增益比公式计算$A$中各特征对$D$的信息增益比,选择信息增益比最大的特征$A_g$;
(4)如果$A_g$的信息增益比小于阈值$\varepsilon$,则置$T$为单结点树,并将$D$中实例数最大的类$C_k$作为该结点的类标记,返回$T$;
(5)否则,对$A_g$的每一个可能值$a_i$,依$A_g = a_i$将$D$分割为若干非空子集$D_i$,将$D_i$中实例数最大的类作为标记,构建子结点,由结点及其子结点构成树$T$,返回$T$;
(6)对第$i$个子结点,以$D_i$为训练集,以$A-{A_g}$为特征集,递归地调用步(1)~步(5),得到子树$T_i$,返回$T_i$。
决策树的剪枝:
决策树生成算法递归地生产决策树会存在过拟合问题,如何解决呢?考虑决策树的复杂度,对已生成的决策树进行简化,这一过程称为剪枝(pruning),具体地,剪枝从已经生成的树上裁掉一些子树或叶节点,并将其根节点或父节点作为新的叶节点,从而简化分类树模型。
决策树的剪枝往往通过极小化决策树整体的损失函数或代价函数来实现。设树$T$的叶结点个数为$|T|$,$t$是树$T$的叶结点,该叶结点有$N_t$个样本点,其中$k$类的样本点有$N_{tk}$个,$k=1,2,...,K$,$H_t(T)$为叶结点$t$上的经验熵,$\alpha \geq 0$为参数,则决策树学习的损失函数可以定义为:
$$C_{\alpha}(T) = \sum_{t=1}^{|T|}N_{t}H_{t}(T) + \alpha|T|$$
其中经验熵为:
$$H_t(T) = - sum_{k}\frac{N_{tk}}{N_t}log\frac{N_{tk}}{N_t}$$
在损失函数中,右端的第一项记作:
$$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}$$
这时有:
$$C_{\alpha}(T) = C(T) + \alpha|T|$$
其中,$C(T)$表示模型对训练数据的预测误差,即模型与训练数据的拟合程度,$|T|$表示模型复杂度。
决策树生成只考虑了通过提高信息增益(或信息增益比)对训练数据进行更好的拟合。而决策树剪枝通过优化损失函数还考虑了减小模型复杂度。决策树生成学习局部的模型,而决策树剪枝学习整体的模型。损失函数的极小化等价于正则化的极大似然估计,所以,利用损失函数最小化原则进行剪枝就是用正则化的极大似然估计进行模型选择。
树的剪枝算法:
输入:生成算法产生的整个树$T$,参数$\alpha$;
输出:修剪后的子树$T_{\alpha}$。
(1)计算每个结点的经验熵
(2)递归地从树的叶结点向上回缩。
设叶结点回缩到其父结点之前与之后的整体树分别为$T_B$与$T_A$,其对应的损失函数值分别是$C_{\alpha}(T_B)$与$C_{\alpha}(T_A)$,如果
$$C_{\alpha}(T_A) \leq C_{\alpha}(T_B)$$
则进行剪枝,即将父结点变为新的叶结点。
(3)返回(2),直至不能继续为止,得到损失函数最小的子树$T_{\alpha}$。
CART算法:
分类与回归树(classification and regression tree, CART)模型,是应用广泛的决策树学习方法。CART同样由特征选择、树的生成以及剪枝组成,既可以用于分类也可以用于回归。以下将用于分类与回归的树统称为决策树。
CART是在给定输入随机变量$X$条件下输出随机变量$Y$的条件概率分布的学习方法。CART假设决策树是二叉树,内部结点特征的取值为“是”和“否”,左分支是取值为“是”的分支,右分支是取值为“否”的分支。这样的决策树等价于递归地二分每个特征,将输入空间即特征空间划分为有限个单元,并在这些单元上确定预测的概率分布,也就是在输入给定的条件下输出的条件概率分布。
CART算法由以下两步组成:
(1)决策树生成:基于训练数据集生成决策树,生成的决策树要尽量大;
(2)决策树剪枝:用验证数据集对已生成的树进行剪枝并选择最优子树,这时用损失函数最小作为剪枝的标准。
CART生成:
决策树的生成就是递归地构建二叉决策树的过程,对回归树用平方误差最小化准则,对分类树用基尼指数(Gini index)最小化准则,进行特征选择,生成二叉树。
最小二乘回归树生成算法:
输入:训练数据集D
输出:回归树$f(x)$
在训练数据集所在的输入空间中,递归地将每个区域划分为两个子区域并决定每个子区域上的输出值,构建二叉决策树。
(1)选择最优切分变量$j$与切分点$s$,求解
$$min_{j,s}[\min_{c_1}\sum_{x_i \in R_1(j,s)}(y_i - c_1)^2 + \min_{c_2}\sum_{x_i \in R_2(j,s)}(y_i - C_2)^2 ]$$
遍历变量$j$,对固定的切分变量$j$扫描切分点$s$,选择使上式达到最小值的对$(j,s)$。
(2)用选定的对$(j,s)$划分区域并决定相应的输出值:
$$R_1(j,s) = \{x|x^{(j)} \leq s\}, R_2(j,s)=\{x|x^{(j)} > s\}$$
$$\hat{c_m} = \frac{1}{N_{m}}\sum_{x_i \in R_m(j,s)}y_i, x\in R_m, m=1,2$$
(3)继续对两个子区域调用步骤(1),(2),直至满足停止条件。
(4)将输入空间划分为$M$个区域$R_1,R_2,...,R_M$,生成决策树:
$$f(x) = \sum_{m=1}^{M}\hat{c_m}I(x \in R_m)$$
分类树的生成:
分类树用基尼指数选择最优特征,同时决定该特征的最优二值切分点。
基尼指数定义:分类问题中,假设有$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}(\frac{C_k}{|D|})^2$$
这里,$C_k$是$D$中属于第$k$类的样本子集,$K$是类的个数。
如果样本集合$D$根据特征$A$是否取某一可能值$\alpha$被分割成$D_1$和$D_2$两部分,即
$$D_1 = \{(x,y) \in D|A(x) = a\}, 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$的不确定性。基尼指数值越大,样本集合的不确定性也就越大。
CART生成算法:
输入:训练数据集$D$,停止计算的条件
输出:CART决策树
根据训练数据集,从根结点开始,递归地对每个结点进行以下操作,构建二叉树:
(1)设结点的训练数据集为$D$,计算现有特征对该数据集的基尼指数。此时,对每一个特征$A$,对其可能的取值的每个值$a$,根据样本点对$A=a$的测试为“是”或“否”将D分割成$D_1$和$D_2$两部分,计算$A=a$时的基尼指数。
(2)在所有可能的特征$A$以及它们所有可能的切分点$a$中,选择基尼指数最小的特征以及其对应的切分点作为最优特征与最优切分点。依最优特征与最优切分点,从现结点生成两个子结点,将训练数据集依特征分配到两个子结点中去。
(3)对两个子结点递归地调用(1),(2),直至满足停止条件
(4)生成CART决策树。
算法停止的条件时结点中的样本个数小于预定阈值,或样本集的基尼指数小于预定阈值(样本基本属于同一类),或者没有更多特征。
CART剪枝:
从整体树$T_0$开始剪枝,对$T_0$的任意内部结点$t$,以$t$为单位结点树的损失函数是
$$C_{\alpha}(t) = C(t) + \alpha$$
以$t$为根结点的子树$T_t$的损失函数是
$$C_{\alpha}(T_t) = C(T_t) + \alpha|T_t|$$
当$\alpha=0$及$\alpha$充分小时,有不等式
$$C_{\alpha}(T_t) < C_{\alpha}(t)$$
当$\alpha$增大时,在某一$\alpha$有
$$C_{\alpha}(T_t) = C_{\alpha}(t)$$
当$\alpha$再增大时,$C_{\alpha}(T_t) > C_{\alpha}(t)$。只要$\alpha = \frac{C(t) - C(T_t)}{|T_t| - 1}$,$T_t$与$t$有相同的损失函数值,而$t$的结点少,因此$t$比$T_t$更可取,对$T_t$进行剪枝。
为此,对$T_0$中每一内部结点$t$,计算
$$g(t) = \frac{C(t) - C(T_t)}{|T_t| - 1}$$
它表示剪枝后整体损失函数减少的程度。在$T_0$中剪去$g(t)$最小的$T_t$,将得到的子树作为$T_1$,同时将最小的$g(t)$设为$\alpha_{1}$。$T_1$为区间$[\alpha_1,\alpha_2)$的最优子树。如此剪枝下去,直至得到根结点。在这一过程中,不断地增加$\alpha$的值,产生新的区间。
CART剪枝算法:
输入:CART算法生成的决策树$T_0$;
输出:最优决策树$T_{\alpha}$;
(1)设$k=0,T=T_0$;
(2)设$\alpha = + \infty$。
(3)自下而上地对各内部结点$t$计算$C(T_t)$,$|T_t|$以及
$$g(t) = \frac{C(t) - C(T_t)}{|T_t| - 1}$$
$$\alpha = \min(\alpha,g(t))$$
这里,$T_t$表示以$t$为根结点的子树,$C(T_t)$是对训练数据的预测误差,$|T_t$是$T_t$的叶结点个数。
(4)对$g(t) = \alpha$的内部结点$t$进行剪枝,并对叶结点$t$以多数表决法定其类,得到树$T$。
(5)设$k = k + 1,\alpha_k = \alpha, T_k = T$.
(6)如果$T_k$不是由根结点及两个叶结点构成的树,则回到步骤(3);否则令$T_k = T_n$。
(7)采用交叉验证法在子树序列$T_0,T_1,...,T_n$中选取最优子树$T_{\alpha}$。