机器学习之树模型
大纲
- 决策树和回归树模型:ID3, C4.5,CART
- AdaBoost框架
- 提升树:梯度提升树
决策树
决策树模型可以看做是if-else指令集合,通过对特征空间的划分来完成分类或者回归任务。以下图中的分类任务为例,假设数据集包含了:
- 三个类别:黄色、蓝色、绿色
- 两个维度的特征空间:(x_1, x_2)
根据if-else规则很容易将特征空间划分为三个区域:(R_1, R_2, R_3),对应的决策树如右图所示。也可以先对(x_1)进行划分,但是可以证明,先对(x_1)进行划分得到的决策树会比示例中的更加复杂,将会产生4个叶子节点,特征空间也会被划分的更加零碎。
![](https://img2020.cnblogs.com/blog/1164654/202007/1164654-20200714221642498-343425339.jpg)
特征的划分
从上一部分的示例中可以看出,在决策树的构建中,选取特征维度的何种序列进行划分,都能实现最终的任务。但是如果顺序选取的不合理,得到的决策树的复杂程度会有很大的差异。
一个好的划分维度应该是能够将数据分的足够开,这包含了两个方面:类内差距足够小、类间差距足够大。从示例中可以看出,如果先用(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 - ar{X}
ight)^2
]
-
方差
[Var(X) = frac{1}{N}sum_{i=1}^N left(x_i - ar{X}
ight)^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|}logfrac{|C_k|}{|D|}\
H(D|A) = -sum_{i=1}^n frac{|D_i|}{|D|} sum_{k=1}^{K}frac{|C_{ik}|}{|D_i|}logfrac{|C_{ik}|}{|D_i|}
]
计算信息增益
[g(D, A) = H(D)-H(D|A)
]
因此最优的划分特征为
[A^star = argmax_{gin Dom(A)} g(D, A)
]
其中Dom(A)表示特征域
对于回归任务:
选取切分特征时,遍历维度(j),扫描切分点(s)求解下式:
[min _{j, s}left[min _{c_{1}} sum_{x_{i} in R_{1}(j, s)}left(y_{i}-c_{1}
ight)^{2}+min _{c_{2}} sum_{x_{i} in R_{2}(j, s)}left(y_{i}-c_{2}
ight)^{2}
ight]
]
决策树的构建
ID3
![](https://img2020.cnblogs.com/blog/1164654/202007/1164654-20200714221700481-1959087746.jpg)
![](https://img2020.cnblogs.com/blog/1164654/202007/1164654-20200714221709046-1287707020.jpg)
回归树
![](https://img2020.cnblogs.com/blog/1164654/202007/1164654-20200714221717542-486516938.jpg)
AdaBoost框架
理论基础
AdaBoost的基本思想是通过融合一些弱分类器来提升模型性能。PAC理论证明了一个问题是强可学习的充分必要条件是弱可学习,因此通过结合一些弱学习器来实现强可学习的想法自然而然的诞生。AdaBoost可以认为是不同的学习器侧重学习不同特征,下一个学习器着重学习之前的学习器没有学到的部分,从而实现从数据中抽象出更多的特征。
![](https://img2020.cnblogs.com/blog/1164654/202007/1164654-20200714221726272-119653866.jpg)
基本构成
AdaBoost框架一般包含如下的部分:
-
基学习器:(h(x; heta)),基学习器一般是弱学习器,弱学习器可易理解为学习效果稍微好于随机猜测
-
融合策略:(H(x) = sum_limits{i=1}^m alpha_ih(x; heta_i))
-
损失函数(二分类问题):(mathcal{L}_{exp}(y, f(x) = exp(-yf(x)))
学习策略
AdaBoost的学习过程包括三个部分:
AdaBoost的学习采用了前向算法,即假设前(i-1)个部分已经学习完成,然后求解第(i)个学习器及其权重。对于第(i)个学习器:
[egin{align}
mathcal{L}(y, H_{i}(x)) &= sum_{j=1}^Nexp{-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 ar{w}_{i, j} exp{-y_jalpha h(x_j)}\
&= sum_{j=1}^N ar{w}_{i, j} (1 -y_jalpha h(x_j) + frac{1}{2}(y_jalpha h(x_j))^2)\
&=sum_{j=1}^N ar{w}_{i, j} (1+frac{1}{2}alpha^2 -y_jalpha h(x_j))\
&=sum_{j=1}^N ar{w}_{i, j} (1+frac{1}{2}alpha^2 -alpha(1 - 2mathbb{I}(y_j
eq h(x_j))\
&= sum_{j=1}^N ar{w}_{i, j} (1+frac{1}{2}alpha^2 -alpha + 2alpha mathbb{I}(y_j
eq h(x_j))\
end{align}
]
最优学习器(h_i(x))为:
[h_i(x) = arg min sum_{j=1}^N ar{w}_{i, j}mathbb{I}(y_j
eq h(x_j))
]
从该公式可以看出,对于被(H_{i-1}(x))分错的样本,(h_i(x))会着重学习
[egin{aligned}
mathcal{L}(y, H_i(x)) &= sum_{j=1}^{N} ar{w}_{i, j} exp left[-y_{j} alpha h_ileft(x_{j}
ight)
ight] \
&=sum_{y_{j}=h_{i}left(x_{j}
ight)} ar{w}_{i,j} mathrm{e}^{-alpha}+sum_{y_{j}
eq h_{i}left(x_{j}
ight)} ar{w}_{i,j} mathrm{e}^{alpha} \
&=left(mathrm{e}^{alpha}-mathrm{e}^{-alpha}
ight) sum_{j=1}^{N} ar{w}_{i,j} mathbb{I}left(y_{j}
eq h_ileft(x_{j}
ight)
ight)+mathrm{e}^{-alpha} sum_{j=1}^{N} ar{w}_{i,j}
end{aligned}
]
学习器(h_i(x))的权重(alpha_i)为:
[alpha_i = frac{1}{2}logfrac{1-e_{i}}{e_i}
]
其中(e_i)为分类器(h_i(x))的错误率
[egin{aligned}
e_{i} &=frac{sum_limits{j=1}^{N} ar{w}_{i,j} mathbb{I}left(y_{j}
eq h_ileft(x_{j}
ight)
ight)}{sum_limits{j=1}^{N} ar{w}_{i,j}} \
&=sum_{j=1}^{N} w_{i,j} mathbb{I}left(y_{j}
eq h_ileft(x_{j}
ight)
ight)
end{aligned}
]
从(alpha_i)可以看出,高错误率的子学习器占据的权重较小
数据分布更新:
[egin{align}
ar{w}_{i,j} &= exp{-y_jH_{i-1}(x_j)}\
H_i(x) &= H_{i-1}(x) + alpha_i h_i(x)\
ar{w}_{i+1, j} &= exp{-y_j(H_{i-1}(x_j)+alpha_i h(x_j))}\
&= ar{w}_{i,j}exp{-y_jalpha_i h(x_j)}
end{align}
]
提升树
提升树主要是用来解决回归任务。将回归树(T(x) = sum_limits{i=1}^{M}hat{c}_i mathbb{I}(xin R_i))作为基学习器,对于前向分步:
[egin{aligned}
&H_{0}(x)=0\
&egin{aligned}
H_{m}(x) &=H_{m-1}(x)+Tleft(x ; Theta_{m}
ight), quad m=1,2, cdots, M \
H_{M}(x) &=sum_{m=1}^{M} Tleft(x ; Theta_{m}
ight)
end{aligned}
end{aligned}
]
在第m步时:
[egin{align}
hat{Theta}_{m}&=arg min _{Theta_{m}} sum_{i=1}^{N} Lleft(y_{i}, H_{m-1}left(x_{i}
ight)+Tleft(x_{i} ; Theta_{m}
ight)
ight)\
&=sum_{i=1}^Nleft[y_i-H_{m-1}(x_i)-Tleft(x_i ; Theta_{m}
ight)
ight]^{2}\
&=sum_{i=1}^Nleft[r_i-Tleft(x_i ; Theta_{m}
ight)
ight]^{2}
end{align}
]
即在m步时拟合当前的残差即可
在前向算法中,如果采用了平方损失或者指数损失是非常容易实现的,如果采用其他的损失函数将不容易计算。为此采用了类似于梯度下降的思想提出了梯度提升树(GDBT),将采用平方损失的提升树中的残差表达式换为梯度值即可:
[r_{m i}=-left[frac{partial Lleft(y_{i}, hleft(x_{i}
ight)
ight)}{partial hleft(x_{i}
ight)}
ight]_{h(x)=H_{m-1}(x)}
]