AgarthaSF

统计学习方法笔记 (5) 决策树

​ 决策树(decision tree)是一种基本的分类与回归方法。决策树学习通常包括3个步骤:特征选择、决策出的生成和决策树的修剪。这些决策树学习的思想主要来源于由Quinlan在1986年提出的ID3算法和1993年提出的C4.5算法,以及由Breiman等人在1984年提出的CART算法。

特征选择

​ 在信息论与概率统计中,熵(entropy)表示随机变量不确定性的度量。设\(X\)是一个取有限个值的离散随机变量,其概率分布为

\[P \left( X = x_{i} \right) = p_{i}, \quad i =1, 2, \cdots, n \]

​ 则随机变量\(X\)的熵定义为

\[ H \left( X \right) = H \left( p \right) = - \sum_{i=1}^{n} p_{i} \log p_{i} \]

​ 其中,若\(p_{i}=0\),则定义\(0 \log 0 = 0\)

​ 设有随机变量\(\left( X , Y \right)\),其联合分布

\[P \left( X = x_{i}, Y = y_{j} \right) = p_{ij}, \quad i=1,2, \cdots, n; \quad j=1,2, \cdots, m \]

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

\[\begin{align*} \\ & H \left( Y | X \right) = \sum_{i=1}^{n} p_{i} H \left( Y | X = x_{i} \right) \end{align*} \]

​ 当熵和条件熵中的概率由数据估计(特别是极大似然估计)得到时,所对应的熵与条件熵分别成为经验熵(empirical entropy)与经验条件熵(empirical condition entropy)。其中,若\(p_{i}=0\),则定义\(0 \log 0 = 0\)

信息增益

​ 特征A对训练数据集D的信息增益g(D, A),定义为集合D的经验熵H(D)与特征A给定条件下D的经验条件熵H(D|A)值差,即

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

​ 决策树学习应用信息增益准则选择特征。给定训练数据集D和特征A,经验熵H(D)表示对数据集D进行分类的不确定性,而条件经验熵H(D|A)表示在特征A给定的条件下对数据集D进行分类的不确定性。信息增益表示由于特征A而使得对数据集D的分类的不确定性减少的程度。信息增益大的特征具有更强的分类能力。

信息增益算法:
输入:训练数据集\(D\)和特征\(A\)
输出:特征\(A\)对训练数据集\(D\)的信息增益$g \left( D, A \right) $

  1. 计算数据集\(D\)的经验熵\(H\left(D\right)\)

\[ \begin{align*} \\ & H \left( D \right) = -\sum_{k=1}^{K} \dfrac{\left|C_{k}\right|}{\left| D \right|}\log_{2}\dfrac{\left|C_{k}\right|}{\left| D \right|} \end{align*} \]

  1. 计算特征\(A\)对数据集\(D\)的经验条件熵\(H \left( D | A \right)\)

\[ \begin{eqnarray} \\ H( D | A ) &=& \sum_{i=1}^{n} \dfrac{| D_{i} }{| D |} H ( D_{i}) \\ ~&=& \sum_{i=1}^{n} \dfrac{\left| D_{i} \right|}{\left| D \right|} \sum_{k=1}^{K} \dfrac{\left| D_{ik} \right|}{\left| D_{i} \right|} \log_{2} \dfrac{\left| D_{ik} \right|}{\left| D_{i} \right|}\end{eqnarray} \]

  1. 计算信息增益

\[ \begin{align*} \\ & g \left( D, A \right) = H \left( D \right) - H \left( D | A \right) \end{align*} \]

信息增益比

​ 特征\(A\)对训练集\(D\)的信息增益比

\[\begin{align*} \\ & g_{R} \left( D, A \right) = \dfrac{g \left( D, A \right)}{H_{A} \left(D\right)}\end{align*} \]

​ 即,信息增益\(g\left( D, A \right)\)与训练数据集\(D\)关于特征\(A\)的经验熵\(H{A}\left(D\right)\)之比。
​ 其中,

\[\begin{align*} \\ & H_A \left( D \right) = -\sum_{i=1}^{n} \dfrac{\left|D_{i}\right|}{\left|D\right|}\log_{2}\dfrac{\left|D_{i}\right|}{\left|D\right|}\end{align*} \]

ID3、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}\)

\[ \begin{align*} \\ & A{g} = \arg \max_{A} g \left( D, A \right) \end{align*} \]

{g} = \arg \max_{A} g \left( D, A \right) \end{align*}

  1. 如果\(A_{g}\)的信息增益小于阈值\(\varepsilon\),则置\(T\)为单结点树,并将\(D\)中实例数量最大的类\(C_{k}\)作为该结点的类标记,返回\(T\);

  2. 否则,对\(A_{g}\)的每一个可能值\(a_{i}\),依\(A_{g}=a_{i}\)\(D\)分割为若干非空子集\(D_{i}\),将\(D_{i}\)中实例数对大的类作为标记,构建子结点,由结点及其子结点构成树\(T\),返回\(T\)

  3. 对第\(i\)个子结点,以\(D_{i}\)为训练集,以\(A-\left\{A_{g}\right\}\)为特征集,递归地调用步1.~步5.,得到子树\(T_{i}\),返回\(T_{i}\)

ID3算法只有树的生成,所以该算法生成的树容易产生过拟合

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}\)

\[ \begin{align*} \\ & A{g} = \arg \max_{A} g_{R} \left( D, A \right) \end{align*} \]

  1. 如果\(A{g}\)的信息增益比小于阈值\(\varepsilon\),则置\(T\)为单结点树,并将\(D\)中实例数量最大的类\(C{k}\)作为该结点的类标记,返回\(T\);

  2. 否则,对\(A{g}\)的每一个可能值\(a{i}\),依\(A{g}=a{i}\)\(D\)分割为若干非空子集\(D{i}\),将\(D{i}\)中实例数对大的类作为标记,构建子结点,由结点及其子结点构成树\(T\),返回\(T\)

  3. 对第\(i\)个子结点,以\(D{i}\)为训练集,以\(A-\left\{A{g}\right\}\)为特征集,递归地调用步1.~步5.,得到子树\(T{i}\),返回\(T{i}\)

剪枝

​ 决策树的剪枝通过极小化决策树整体的损失函数或代价函数来实现。
​ 设树\(T\)的叶结点个数为\(\left| T \right|\)\(t\)是树\(T\)的叶结点,该叶结点有\(N_{t}\)个样本点,其中\(k\)类的样本点有\(N_{tk}\)个,\(k=1,2,\cdots,K\)\(H_{t}\left(T\right)\)为叶结点\(t\)上的经验熵,
​ 则决策树的损失函数_

\[\begin{align*} \\ & C_{\alpha} \left( T \right) = \sum_{t=1}^{\left| T \right|} N_{t} H_{t} \left( T \right) + \alpha \left| T \right| \end{align*} \]

​ 其中,\(\alpha \geq 0\)为参数,经验熵

\[\begin{align*} \\ & H_{t} \left( T \right) = - \sum_{k} \dfrac{N_{tk}}{N_{t}} \log \dfrac{N_{tk}}{N_{t}} \end{align*} \]

​ 损失函数中,记

\[\begin{align*} \\ & C \left( T \right) = \sum_{t=1}^{\left| T \right|} N_{t} H_{t} \left( T \right) = - \sum_{t=1}^{\left| T \right|} \sum_{k=1}^{K} N_{tk} \log \dfrac{N_{tk}}{N_{t}} \end{align*} \]

​ 则

\[\begin{align*} \\ & C_{\alpha} \left( T \right) = C \left( T \right) + \alpha \left| T \right| \end{align*} \]

​ 其中,\(C \left( T \right)\)表示模型对训练数据的预测误差,即模型与训练数据的拟合程度,\(\left| T \right|\)表示模型复杂度,参数\(\alpha \geq 0\)控制两者之间的影响。

​ 树的剪枝算法:

输入:决策树\(T\),参数\(\alpha\)
输出:修剪后的子树\(T_{\alpha}\)

  1. 计算每个结点的经验熵

  2. 递归地从树的叶结点向上回缩
    设一组叶结点回缩到其父结点之前与之后的整体树分别为\(T_{B}\)\(T_{A}\),其对应的损失函数值分别是\(C_{\alpha} \left( T_{B} \right)\)\(C_{\alpha} \left( T_{A} \right)\),如果

\[ \begin{align*} \\ & C_{\alpha} \left( T_{A} \right) \leq C_{\alpha} \left( T_{B} \right) \end{align*} \]

则进行剪枝,即将父结点变为新的叶结点。

  1. 返回2.,直到不能继续为止,得到损失函数最小的子树\(T_{\alpha}\)

CART树

​ CART树的生成就是递归地构建二叉决策树的过程。

CART回归树

​ 假设\(X\)\(Y\)分别为输入和输出变量,并且\(Y\)是连续变量,给定训练数据集

\[\begin{align*} \\ & D = \left\{ \left(x_{1},y_{1}\right), \left(x_{2},y_{2}\right),\cdots,\left(x_{N},y_{N}\right) \right\} \end{align*} \]

​ 一棵回归树对应着输入空间的一个划分以及在划分的单元上的输出值。假设已将输入空间划分为M个单元R1, R2,...,RM,并在每个单元\(R_m\)上有一个固定的输出\(c_m\),于是回归树模型可表示为

\[\begin{align*} \\ & f \left( x \right) = \sum_{m=1}^{M} c_{m} I \left( x \in R_{m} \right) \end{align*} \]

​ 当输入空间的划分确定时,可以用平方误差来表示回归树对于训练数据的预测误差,用平方误差最小的准则求解每个单元上的最优输出值。易知,单元Rm上的cm的最优值\(\hat c_{m}\)是Rm上所有输入实例xi对应的输出yi的均值,即

\[\begin{align*} \\ & \hat c_{m} = ave \left( y_{i} | x_{i} \in R_{m} \right) \end{align*} \]

​ 这里采用启发式的方法,选择第\(j\)个变量\(x_{j}\)及其取值\(s\)作为切分变量和切分点,并定义两个区域

\[\begin{align*} \\ & R_{1} \left( j,s \right) = \left\{ x | x_{j} \leq s \right\}, \quad R_{2} \left( j,s \right) = \left\{ x | x_{j} > s \right\} \end{align*} \]

​ 然后寻找最优切分变量\(x_{j}\)及最优切分点\(s\),具体地,求解

\[\begin{align*} \\ & \min_{j,s} = \left[ \min_{c_{1}} \sum_{x_{i} \in R_{1} \left(j,s\right)} \left( y_{i} - c_{1} \right)^{2} + \min_{c_{2}} \sum_{x_{i} \in R_{2} \left(j,s\right)} \left( y_{i} - c_{2} \right)^{2}\right] \end{align*} \]

​ 对固定输入变量j可以找到最优切分点s.

\[ \hat c_{1} = ave \left( y_{i} | x_{i} \in R_{1}(j,s) \right) \ \ \ \ \ \ \ \ \ \ \hat c_{2} = ave \left( y_{i} | x_{i} \in R_{2}(j,s)\right) \]

​ 遍历所有输入变量,找到最优切分变量j,构成一个对\((j,s)\)。依次将输入空间划分为两个区域,接着对每个区域重复上述划分过程,直到满足停止条件为止。这样的回归树通常成为最小二乘回归树(least squares regression)。

CART分类树

​ 分类问题中,假设有\(K\)个类,样本点属于第\(k\)类的概率为\(p_{k}\),则概率分布的基尼指数定义为

\[\begin{align*} \\ & Gini \left( p \right) = \sum_{k=1}^{K} p_{k} \left( 1 - p_{k} \right) = 1 - \sum_{k=1}^{K} \end{align*} \]

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

\[\begin{align*} \\ & Gini \left( D \right) = 1 - \sum_{k=1}^{K} \left( \dfrac{\left| C_{k} \right|}{\left| D \right|} \right)^{2}\end{align*} \]

​ 其中,\(C_{k}\)\(D\)中属于第\(k\)类的样本自己,\(K\)是类别个数。

​ 如果样本集合\(D\)根据特征\(A\)是否取某一可能值\(a\)被分割成\(D_{1}\)\(D_{2}\)两个部分,即

\[\begin{align*} \\ & D_{1} = \left\{ \left(x,y\right) | A\left(x\right)=a \right\}, \quad D_{2} = D - D_{1} \end{align*} \]

​ 则在特征\(A\)的条件下,集合\(D\)的基尼指数

\[\begin{align*} \\ & Gini \left( D, A \right) = \dfrac{\left| D_{1} \right|}{\left| D \right|} Gini \left( D_{1} \right) + \dfrac{\left| D_{2} \right|}{\left| D \right|} Gini \left( D_{2} \right)\end{align*} \]

​ 基尼指数\(Gini \left( D \right)\)表示集合\(D\)的不确定性,基尼指数\(Gini \left( D,A \right)\)表示经\(A=a\)分割后集合\(D\)的不确定性。基尼指数值越大,样本集合的不确定性也越大。

CART生成算法:
输入:训练数据集\(D\),特征\(A\),阈值\(\varepsilon\)
输出:CART决策树\(T\)

  1. 设结点的训练数据集为\(D\),对每一个特征\(A\),对其可能取的每个值\(a\),根据样本点对\(A=a\)的测试为“是”或“否”将\(D\)分割成\(D_{1}\)\(D_{2}\)两部分,并计算\(Gini\left(D,A\right)\)
  2. 在所有可能的特征\(A\)以及其所有可能的切分点\(a\)中,选择基尼指数最小的特征及其对应的切分点作为最优特征与最优切分点。依此从现结点生成两个子结点,将训练数据集依特征分配到两个子结点中去。
  3. 对两个子结点递归地调用1.和2.,直至满足停止条件
  4. 生成CART决策树\(T\)

CART剪枝

对整体树\(T{0}\)任意内部结点\(t\),以\(t\)为单结点树的损失函数

\[\begin{align} \\ & C_{\alpha} \left( t \right) = C \left( t \right) + \alpha \end{align} \]

\(t\)为根结点的子树\(T{t}\)的损失函数

\[C{\alpha} \left( T{t} \right) = C \left( T{t} \right) + \alpha \left| T{t} \right| \]

\(\alpha = 0\)\(\alpha\)充分小时,有不等式

\[\begin{align} \\ & C{\alpha} \left( T{t} \right) < C{\alpha} \left( t \right) \end{align} \]

\(\alpha\)增大时,在某一\(\alpha\)

\[\\ \quad\quad C{\alpha} \left( T{t} \right) = C{\alpha} \left( t \right) \\ C \left( T{t} \right) + \alpha \left| T{t} \right| = C \left( t \right) + \alpha \\ \quad\quad \alpha = \dfrac{C\left( t \right) - C \left(T{t}\right)} { \left| T{t} \right| -1 } \]

\(T{t}\)\(t\)有相同的损失函数值,而\(t\)的结点少,因此对\(T_{t}\)进行剪枝。

\(g(t)\)最小的子树在当前为最优,但若\(\alpha\)继续增大,它就会造成损失函数的增大,故每次减去g(t)最小的子树,再令\(\alpha\)为次小的\(g(t)\)值。循环这个过程最终剪枝到只有根节点。

CART剪枝算法:
输入:CART决策树\(T{0}\)
输出:最优决策树\(T{\alpha}\)

  1. \(k=0, T=T_{0}\)

  2. \(\alpha=+\infty\)

  3. 自下而上地对各内部结点\(t\)计算$ C\left(T_{t}\right),\left| T_{t} \right|$,以及

    \[\begin{align*} \\ & g\left(t\right) = \dfrac{C\left( t \right) - C \left(T_{t}\right)} { \left| T_{t} \right| -1 } \\ & \alpha = \min \left( \alpha, g\left( t \right) \right) \end{align*} \]

    其中,\(T_{t}\)表示以\(t\)为根结点的子树,$ C\left(T_{t}\right)\(是对训练数据的预测误差,\)\left| T_{t} \right|\(是\)T_{t}$的叶结点个数。

  4. 自下而上地访问内部结点\(t\),如果有\(g\left(t\right)=\alpha\),则进行剪枝,并对叶结点\(t\)以多数表决法决定其类别,得到树\(T\)

  5. \(k=k+1, \alpha_{k}=\alpha, T_{k}=T\)

  6. 如果\(T\)不是由根结点单独构成的树,则回到步骤4.

  7. 采用交叉验证法在子树序列\(T_{0},T_{1},\cdots,T_{n}\)中选取最优子树\(T_{\alpha}\)

分类:

技术点:

相关文章:

  • 2021-06-01
  • 2021-08-28
  • 2021-11-18
  • 2021-09-10
  • 2021-05-31
  • 2021-06-21
  • 2021-06-23
猜你喜欢
  • 2021-08-29
  • 2021-11-05
  • 2021-10-08
  • 2022-01-17
  • 2021-12-21
  • 2021-09-13
  • 2022-02-09
相关资源
相似解决方案