李航-统计学习方法-笔记-5:决策树

基本模型

简介:决策树可以认为是if-then规则的集合,也可以认为是定义在特征空间与类空间上的条件概率分布。其主要优点是模型具有可读性,分类速度快。

决策树学习通常包括3个步骤:特征选择,决策树生成,剪枝。

决策树的内部结点表示一个特征或属性,叶结点表示一个类。

If-then:决策树路径或其对应的if-then规则集合具有一个重要的性质,互斥并且完备,也就是说,每一个实例都被一条路径或一条规则所覆盖,而且只被一条路径或者一条规则覆盖。

概率分布:决策树将特征空间划分为互不相交的单元,并在每个单元定义一个类的概率分布。决策树的一条路径对应于划分中的一个单元,决策树所表示的条件概率分布由各个单元给定条件下类的条件概率分布组成,即\(P(Y | X)\),叶结点(单元)上的条件概率往往偏向某一类。

决策树的学习:决策树学习本质上是从训练数据集中归纳出一组分类规则,找到一棵“与训练数据矛盾较小,同时具有很好的泛化能力”的树。

另一个角度看,决策树学习是“由训练集估计的条件概率模型”,基于特征空间划分的类的条件概率模型有多个。我们选择的条件概率模型应该不仅对训练数据有很好的拟合,而且对未知数据有很好的预测。

启发式方法:从所有可能的决策树中选取最优决策树是NP完全问题,所以现实中通常采用启发式方法,近似求解这一最优化问题。这样得到的决策树是次优的(sub-optimal)。

通常的做法是递归地选择最优特征,并根据该特征对训练数据进行分割,使得对各个子数据集有一个最好的分类的过程。

剪枝:以上方法生成的树可能对训练集有很好的分类能力,但对未知的数据却未必,可能发生过拟合。我们需要对已生成的树自下而上进行剪纸,将树变得更简单,从而使它具有更好的泛化能力。具体地,就是去掉过于细分的叶结点,使其回退到父结点,甚至更高的结点,将父结点或更高的结点改为新的叶结点。

特征选择

特征选择:特征选择在于选取对训练数据具有分类能力的特征。

如果利用一个特征进行分类的结果与随机分类的结果没有很大区别,则称这个特征是没有分类能力的。经验上扔掉这样的特征对决策树学习的影响不大。

通常,特征选择的准则是信息增益或信息增益比。

熵(entropy):熵度量的是随机变量的不确定性。熵越大,不确定性越大。

\[H(x) = - \sum_{i=1}^{n} P_i \log P_i \]

\(p_i=0\)时,\(0 \log0 = 0\)

通常对数以2或e为底,则熵的单位为比特(bit)或纳特(nat)。
熵只依赖于\(X\)的分布,而与\(X\)的取值无关,所以\(H(x)\)也记作\(H(p)\)

\[0 \leqslant H(p) \leqslant \log n \]

\(p=0\)\(p=1\)时,\(H(p)=0\),随机变量完全没有不确定性。
\(p=0.5\)时,\(H(p)=1\),熵最大,不确定性最大。

条件熵:条件熵\(H(Y|X)\)表示在已知随机变量\(X\)的条件下随机变量\(Y\)的不确定性。

\[H(Y | X) = \sum_{i=1}^{n} p_i H(Y | X = x_i) \]

当概率由数据估计(特别是极大似然估计)时,所对应的熵与条件熵分别称为经验熵与经验条件熵。

信息增益:信息增益表示得知特征\(X\)的信息而使类\(Y\)的信息的不确定性减少的程度。信息增益大的特征分类能力强。

\[g(D, A) = H(D) - H(D | A) \]

\[H(D) = - \sum_{k=1}^{K} \frac{|C_k|}{|D|} \log_2 {\frac{|C_k|}{|D|}} \]

\[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|}} \]

其中,\(|C_k|\)为类\(C_k\)的样本个数,\(|D|\)表示样本容量。

特征\(A\)\(n\)个不同的取值\(\{a_1, a_2, ..., a_n\}\),根据取值将\(D\)划分为\(n\)个子集\(D_1, D_2, ..., D_n\)\(|D_i|\)\(D_i\)的样本个数。\(D_{ik} = D_i \cap C_k\)

信息增益比:以信息增益划分,存在“偏向于选择取值较多的特征”的问题,用信息增益比可以校正这一问题。

\[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|} \]

\(H_A(D)\)为训练集D关于特征A的值的熵,\(n\)是特征\(A\)的取值个数。

ID3和C4.5

决策树生成的经典算法有ID3和C4.5。

ID3:ID3的核心是在各个结点上应用“信息增益”准则选择特征。

从根结点出发,选择信息增益最大的特征作为结点特征,由该特征的不同取值建立子结点,对子结点递归调用以上方法。直到所有特征的信息增益均很小(设一个阈值\(\varepsilon\))或没有特征可选为止。

C4.5:对ID3算法进行了改进,生成过程中用信息增益比来选择特征。

决策树的剪枝

剪枝:学习时过多地考虑如何提高对训练数据的正确分类,从而构建出过于复杂的决策树(过拟合)。解决办法是考虑决策树的复杂度,对已生成的树进行简化,这一过程称为剪枝(pruning)。

具体地,从树上裁掉一些子树或叶结点,并将其根结点或父结点作为新的叶结点,从而简化分类树模型。

决策树的剪枝往往通过极小化决策树整体的损失函数来实现。

决策树的损失函数:设树\(T\)的叶结点个数为\(|T|\)\(t\)是树\(T\)的叶结点,该叶结点有\(N_t\)个样本点,其中\(k\)类的样本点有\(N_{tk}\)个,\(H_t(T)\)为叶结点上的经验熵,则损失函数为:

\[C_\alpha(T) = C(T) + \alpha|T| \]

\[\begin{split}C(T) = \sum_{t=1}^{|T|} N_t H_t(T) &= \sum_{t=1}^{|T|} N_t [- \sum_{k=1}^{K} \frac{N_{tk}}{N_t} \log \frac{N_{tk}}{N_t}] \\ &= - \sum_{t=1}^{|T|} \sum_{k=1}^{K} N_{tk} \log \frac{N_{tk}}{N_t}\end{split} \]

其中\(C(T)\)表示模型对训练数据的训练误差。\(|T|\)表示模型复杂度,参数$\alpha \geqslant 0 $ 控制两者之间的影响。较大的\(\alpha\)促使选择较简单的模型,较小的\(\alpha\)促使选择复杂的模型。

剪枝,就是当\(\alpha\)确定时,选择损失函数最小的模型。

“决策树生成”只考虑了通过提高信息增益(或信息增益比)对训练数据进行更好的拟合。而“决策树剪枝”通过优化损失函数,还考虑了减小模型复杂度。“决策树生成”学习局部的模型,而“决策树剪枝”学习整体的模型。

具体做法
(1)计算每个结点的经验熵。
(2)递归地从树的叶结点向上回缩,设一组叶结点回缩到其父结点之前与之后的整体树为\(T_B\)\(T_A\),如果

\[C_\alpha(T_A) \leqslant C_\alpha(T_B) \tag{5.15} \]

则剪枝,将父结点变成新的叶结点。
(3)返回(2),直至不能继续,得到损失函数最小的子树\(T_\alpha\)

\((5.15)\)只考虑两个树的损失函数的差,其计算可以在局部进行,所以剪枝算法可由一种动态规划算法实现。

CART算法

CART:cart(classification and regression tree),分类与回归树,是应用广泛的决策树学习方法,既可用于分类,也可用于回归。

CART假设决策树是二叉树,内部结点特征的取值为“是”和“否”,左分支是取值为“是”的分支,右分支是取值为“否”的分支。这样的决策树等价于递归地二分每个特征,将输入空间即特征空间划分为有限个单元,并在这些单元上确定预测的概率分布。CART算法分为两步:

(1)决策树生成:基于训练数据集生成决策树,生成的决策树要尽量大。
(2)决策树剪枝:用验证数据集对已生成的树进行剪枝并选择最优子树,这时用损失函数最小作为剪枝的标准。

决策树的生成:递归地构建二叉决策树的过程。对回归树用平方误差最小化准则,对分类树用基尼指数最小化准则,进行特征选择,生成二叉树。

回归树的生成:假设已将输入空间划分为\(M\)个单元\(R_1, R_2, ..., R_M\),并且在每个单元\(R_m\)有一个固定的输出值\(c_m\),于是回归树模型可表示为:

\[f(x) = \sum_{m=1}^{M} c_m I(x \in R_m) \]

可以用平方误差\(\sum_{x_i \in R_m} (y_i - f(x_i))^2\)来表示训练误差,用最小化平方误差来求解。而单元\(R_m\)上的\(c_m\)的最优值\(\hat{c}_m\)\(R_m\)上所有输入实例\(x_i\)对应的输出\(y_i\)的均值,即:

\[\hat{c}_m = ave(y_i \ | \ x_i \in R_m) \]

这里采用启发式的方法对输入空间进行划分,选择\(j\)个变量\(x^{(j)}\)和它的取值\(s\),作为切分变量和切分点,并定义两个区域

\[R_1(j, s) = \{x \ | \ x^{(j)} \leqslant s\}, \ R_2(j, s) = \{x \ | \ x^{(j)} > s\} \]

然后寻找最优切分变量\(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] \]

\[\hat{c}_1 = ave( y_i \ | \ x_i \in R_1(j, s)), \ \hat{c}_2 = ave( y_i \ | \ x_i \in R_2(j, s)) \]

对固定输入变量\(j\)可以找到最优切分点\(s\),遍历所有输入变量,找到最优的切分变量\(j\),构成一个对\((j, s)\)。依次将输入空间划分为两个区域。

对每个区域重复上述划分过程,直到满足停止条件位置,这样的回归树通常称为最小二乘回归树。

分类树的生成:分类问题中,假设有\(K\)个类,样本点属于\(k\)类的概率为\(p_k\),则概率分布的基尼指数定义为:

\[Gini(p) = \sum_{k=1}^{K}p_k (1 - p_k) = 1 - \sum_{k=1}^{K} {p_k}^2 \]

对于二分类:

\[Gini(p) = 2p(1-p) \]

对于给定样本集合\(D\),其基尼指数为

\[Gini(D) = 1 - \sum_{k=1}^{K} (\frac{|C_k|}{|D|})^2 \]

如果样本集合\(D\)根据特征\(A\)是否取某一可能值\(a\)被分割成\(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值越大,样本集合的不确定性也越大(与熵类似),因此每次选择Gini小的特征来划分。

算法停止条件:结点中的样本个数小于预定阈值,或,样本集的基尼指数小于预定阈值(样本基本属于同一类),或没有更多特征。

上图显示了二分类问题中,Gini,半熵和分类误差率的关系,可以看到Gini和半熵很接近,都可近似表示分类误差率。

CART剪枝

简述
(1)首先从生成算法产生的决策树\(T_0\)底端开始不断剪枝,直到\(T_0\)的根结点,形成一个子树序列\(\{T_0, T_1, ..., T_n\}\)
(2)通过交叉验证法在独立的验证数据集上对子树序列进行测试,从中选择最优子树。

损失函数
剪枝过程中,计算子树的损失函数:\(C_\alpha(T) = C(T) + \alpha|T|\)
其中,\(T\)为任意子树,\(C(T)\)为训练数据的预测误差(如基尼指数)。
\(|T|\)为子树的叶结点个数,$\alpha \geqslant 0 $为参数,权衡训练数据的拟合程度与模型的复杂程度。

具体做法
(1)对固定的\(\alpha\),一定存在使损失函数\(C_\alpha(T)\)最小的子树,将其表示为\(T_\alpha\)

\(\alpha\)大时,最优子树\(T_\alpha\)偏小;\(\alpha\)小时,最优子树\(T_\alpha\)偏大。

\(\alpha = 0\)时,整体树是最优的,\(\alpha \to \infty\)时,根结点组成的单结点是最优的。

Breiman等人证明:可以用递归的方法对树进行剪枝。将\(\alpha\)从小增大,\(0 = \alpha_0 < \alpha_1 < ... < \alpha_n < + \infty\),产生一系列的区间\([\alpha_i, \alpha_{i+1}), i = 0, 1, ..., n\);剪枝得到的子树序列对应着区间\(\alpha \in [\alpha_i, \alpha_{i+1})\)的最优子树序列\(\{T_0, T_1, ..., T_n\}\)

具体地,从整体树\(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 < \frac{C(t) - C(T_t)}{|T_t| - 1}\)):

\[C_\alpha(T_t) < C_\alpha(t) \tag{5.29} \]

\(\alpha\)增大,\(\alpha = \frac{C(t) - C(T_t)}{|T_t| - 1}\)时有:

\[C_\alpha(T_t) = C_\alpha(t) \]

此时,\(T_t\)\(t\)有相同的损失函数值,而\(t\)的结点少,因此\(t\)\(T_t\)更可取,对\(T_t\)进行剪枝。

\(\alpha\)再增大时(\(\alpha > \frac{C(t) - C(T_t)}{|T_t| - 1}\)),不等式(5.29)反向。

为此,对\(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\)的值,产生新的区间。

(2)利用独立的验证数据集,测试子树序列\(T_0, T_1, ..., T_n\)中各棵子树的平方误差或基尼指数。平方误差或基尼指数最小的决策树被认为是最优的决策树。子树序列\(T_1, T_2, ..., T_n\)都对应于一个参数\(\alpha_1, \alpha_2, ..., \alpha_n\)。所以,当最优子树\(T_k\)确定时,对应的\(\alpha_k\)也确定了,即得到最优决策树\(T_\alpha\)

posted @ 2019-06-05 15:33  PilgrimHui  阅读(2211)  评论(0编辑  收藏  举报