【机器学习】树模型

机器学习之树模型

大纲

  • 决策树和回归树模型:ID3, C4.5,CART
  • AdaBoost框架
  • 提升树:梯度提升树

决策树

决策树模型可以看做是if-else指令集合,通过对特征空间的划分来完成分类或者回归任务。以下图中的分类任务为例,假设数据集包含了:

  • 三个类别:黄色、蓝色、绿色
  • 两个维度的特征空间:\(x_1, x_2\)

根据if-else规则很容易将特征空间划分为三个区域:\(R_1, R_2, R_3\),对应的决策树如右图所示。也可以先对\(x_1\)进行划分,但是可以证明,先对\(x_1\)进行划分得到的决策树会比示例中的更加复杂,将会产生4个叶子节点,特征空间也会被划分的更加零碎。

特征的划分

从上一部分的示例中可以看出,在决策树的构建中,选取特征维度的何种序列进行划分,都能实现最终的任务。但是如果顺序选取的不合理,得到的决策树的复杂程度会有很大的差异。

一个好的划分维度应该是能够将数据分的足够开,这包含了两个方面:类内差距足够小、类间差距足够大。从示例中可以看出,如果先用\(x_2\)进行划分,绿色类完全被分开,如果先用\(x_1\)进行划分则达不到这种效果。

类内差距小与类内的混乱程度是一致的。衡量混乱程度的指标有很多,比如信息熵、基尼系数、均方误差、方差等。前两个指标通常用在分类任务中,ID3和C4.5采用了信息熵;后两个指标在本质上是一样的,通常用在回归任务中,CART树在分类时采用了基尼系数,在回归任务中采用了均方误差。各类指标的表达式如下:

  • 信息熵

    \[H(X) = -\sum_{i=1}^N p(x_i)\log p(x_i) \]

  • 基尼系数

    \[Gini(X) = \sum_{i=1}^N p(x_i)(1 - p(x_i)) \]

  • 均方误差

    \[MSE(X) = \sum_{i=1}^N \left(x_i - \bar{X}\right)^2 \]

  • 方差

    \[Var(X) = \frac{1}{N}\sum_{i=1}^N \left(x_i - \bar{X}\right)^2 \]

在选取划分特征中,是通过比较划分前后数据的混乱程度实现。假设对于分类任务:

  • 数据集:\(D\),共包含\(K\)个类别:\(C_1, C_2, ..., C_K\)
  • 离散特征\(A\)\(D\)划分\(n\)个部分:\(D_1, D_2, ..., D_n\),划分后的\(D_i\)中包含各个类别的集合为:\(C_{i1}, C_{i2}, ..., C_{iK}\)

划分前后的信息熵分别记为:\(H(D), H(D|A)\)

\[H(D) = -\sum_{k=1}^K \frac{|C_k|}{|D|}\log\frac{|C_k|}{|D|}\\ H(D|A) = -\sum_{i=1}^n \frac{|D_i|}{|D|} \sum_{k=1}^{K}\frac{|C_{ik}|}{|D_i|}\log\frac{|C_{ik}|}{|D_i|} \]

计算信息增益

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

因此最优的划分特征为

\[A^\star = \arg\max_{g\in Dom(A)} g(D, A) \]

其中Dom(A)表示特征域

对于回归任务:

  • 数据集:\((X,y)\in R^{n+1}\)

  • 连续特征\(j\)从切分点\(s\)\(D\)划分为两个部分:\(R_1(j, s) = \{x|x^{(j)}< s\}, R_2(j,s) = \{x|x^{(j)}\geq s\}\)

选取切分特征时,遍历维度\(j\),扫描切分点\(s\)求解下式:

\[\min _{j, s}\left[\min _{c_{1}} \sum_{x_{i} \in R_{1}(j, s)}\left(y_{i}-c_{1}\right)^{2}+\min _{c_{2}} \sum_{x_{i} \in R_{2}(j, s)}\left(y_{i}-c_{2}\right)^{2}\right] \]

决策树的构建

ID3

回归树

AdaBoost框架

理论基础

AdaBoost的基本思想是通过融合一些弱分类器来提升模型性能。PAC理论证明了一个问题是强可学习的充分必要条件是弱可学习,因此通过结合一些弱学习器来实现强可学习的想法自然而然的诞生。AdaBoost可以认为是不同的学习器侧重学习不同特征,下一个学习器着重学习之前的学习器没有学到的部分,从而实现从数据中抽象出更多的特征。

基本构成

AdaBoost框架一般包含如下的部分:

  • 基学习器:\(h(x;\theta)\),基学习器一般是弱学习器,弱学习器可易理解为学习效果稍微好于随机猜测

  • 融合策略:\(H(x) = \sum_\limits{i=1}^m \alpha_ih(x;\theta_i)\)

  • 损失函数(二分类问题):\(\mathcal{L}_{exp}(y, f(x) = \exp(-yf(x))\)

学习策略

AdaBoost的学习过程包括三个部分:

  • 基学习器计算
  • 基学习器权重计算
  • 数据分布更新

AdaBoost的学习采用了前向算法,即假设前\(i-1\)个部分已经学习完成,然后求解第\(i\)个学习器及其权重。对于第\(i\)个学习器:

\[\begin{align} \mathcal{L}(y, H_{i}(x)) &= \sum_{j=1}^N\exp\{-y_j (H_{i-1}(x_j) + \alpha h(x_j)\}\\ &= \sum_{j=1}^N \exp\{-y_j (H_{i-1}(x_j)\}\exp\{-y_j \alpha h(x_j)\}\\ &\overset{\Delta}{=} \sum_{j=1}^N \bar{w}_{i, j} \exp\{-y_j\alpha h(x_j)\}\\ &= \sum_{j=1}^N \bar{w}_{i, j} (1 -y_j\alpha h(x_j) + \frac{1}{2}(y_j\alpha h(x_j))^2)\\ &=\sum_{j=1}^N \bar{w}_{i, j} (1+\frac{1}{2}\alpha^2 -y_j\alpha h(x_j))\\ &=\sum_{j=1}^N \bar{w}_{i, j} (1+\frac{1}{2}\alpha^2 -\alpha(1 - 2\mathbb{I}(y_j \neq h(x_j))\\ &= \sum_{j=1}^N \bar{w}_{i, j} (1+\frac{1}{2}\alpha^2 -\alpha + 2\alpha \mathbb{I}(y_j \neq h(x_j))\\ \end{align} \]

最优学习器\(h_i(x)\)为:

\[h_i(x) = \arg \min \sum_{j=1}^N \bar{w}_{i, j}\mathbb{I}(y_j \neq h(x_j)) \]

从该公式可以看出,对于被\(H_{i-1}(x)\)分错的样本,\(h_i(x)\)会着重学习

\[\begin{aligned} \mathcal{L}(y, H_i(x)) &= \sum_{j=1}^{N} \bar{w}_{i, j} \exp \left[-y_{j} \alpha h_i\left(x_{j}\right)\right] \\ &=\sum_{y_{j}=h_{i}\left(x_{j}\right)} \bar{w}_{i,j} \mathrm{e}^{-\alpha}+\sum_{y_{j} \neq h_{i}\left(x_{j}\right)} \bar{w}_{i,j} \mathrm{e}^{\alpha} \\ &=\left(\mathrm{e}^{\alpha}-\mathrm{e}^{-\alpha}\right) \sum_{j=1}^{N} \bar{w}_{i,j} \mathbb{I}\left(y_{j} \neq h_i\left(x_{j}\right)\right)+\mathrm{e}^{-\alpha} \sum_{j=1}^{N} \bar{w}_{i,j} \end{aligned} \]

学习器\(h_i(x)\)的权重\(\alpha_i\)为:

\[\alpha_i = \frac{1}{2}\log\frac{1-e_{i}}{e_i} \]

其中\(e_i\)为分类器\(h_i(x)\)的错误率

\[\begin{aligned} e_{i} &=\frac{\sum_\limits{j=1}^{N} \bar{w}_{i,j} \mathbb{I}\left(y_{j} \neq h_i\left(x_{j}\right)\right)}{\sum_\limits{j=1}^{N} \bar{w}_{i,j}} \\ &=\sum_{j=1}^{N} w_{i,j} \mathbb{I}\left(y_{j} \neq h_i\left(x_{j}\right)\right) \end{aligned} \]

\(\alpha_i\)可以看出,高错误率的子学习器占据的权重较小

数据分布更新:

\[\begin{align} \bar{w}_{i,j} &= \exp\{-y_jH_{i-1}(x_j)\}\\ H_i(x) &= H_{i-1}(x) + \alpha_i h_i(x)\\ \bar{w}_{i+1, j} &= \exp\{-y_j(H_{i-1}(x_j)+\alpha_i h(x_j))\}\\ &= \bar{w}_{i,j}\exp\{-y_j\alpha_i h(x_j)\} \end{align} \]

提升树

提升树主要是用来解决回归任务。将回归树\(T(x) = \sum_\limits{i=1}^{M}\hat{c}_i \mathbb{I}(x\in R_i)\)作为基学习器,对于前向分步:

\[\begin{aligned} &H_{0}(x)=0\\ &\begin{aligned} H_{m}(x) &=H_{m-1}(x)+T\left(x ; \Theta_{m}\right), \quad m=1,2, \cdots, M \\ H_{M}(x) &=\sum_{m=1}^{M} T\left(x ; \Theta_{m}\right) \end{aligned} \end{aligned} \]

在第m步时:

\[\begin{align} \hat{\Theta}_{m}&=\arg \min _{\Theta_{m}} \sum_{i=1}^{N} L\left(y_{i}, H_{m-1}\left(x_{i}\right)+T\left(x_{i} ; \Theta_{m}\right)\right)\\ &=\sum_{i=1}^N\left[y_i-H_{m-1}(x_i)-T\left(x_i ; \Theta_{m}\right)\right]^{2}\\ &=\sum_{i=1}^N\left[r_i-T\left(x_i ; \Theta_{m}\right)\right]^{2} \end{align} \]

即在m步时拟合当前的残差即可

在前向算法中,如果采用了平方损失或者指数损失是非常容易实现的,如果采用其他的损失函数将不容易计算。为此采用了类似于梯度下降的思想提出了梯度提升树(GDBT),将采用平方损失的提升树中的残差表达式换为梯度值即可:

\[r_{m i}=-\left[\frac{\partial L\left(y_{i}, h\left(x_{i}\right)\right)}{\partial h\left(x_{i}\right)}\right]_{h(x)=H_{m-1}(x)} \]

posted @ 2020-07-14 22:18  十三w~w  阅读(252)  评论(0编辑  收藏  举报