集成学习总结

集成学习是一种利用多个基础模型来构建更加准确、稳定的预测模型的机器学习技术。集成学习的基本思想是将多个模型组合起来,通过集体决策来提高模型的预测性能。它能够有效地降低单个模型的过拟合风险,提高模型的泛化性能。

集成学习有很多方法和框架,以下是整体的分类图:

集成学习方法汇总

串行集成学习

AdaBoost

AdaBoost算法是一种经典的串行式集成学习方法。在每次迭代中,AdaBoost算法会根据当前加权样本集训练一个弱分类器,并计算其错误率。然后,根据错误率计算分类器的权重,然后更新样本权重,并将更新后的样本集用于下一次迭代中。这样,每个分类器都是在当前加权样本集上训练的,而不是原始的训练集。

理解1:样本和分类器的加权

可以把AdaBoost算法类比为一个错题本,每个弱分类器都会形成一个错题本,在下一轮学习中,我们会针对错题本中的错误题目,更加用心地进行学习,以避免再犯相同的错误。

但需要注意的是,AdaBoost在每次迭代的时候并不只选取错题(错分类的样本),也会选择之前正确的题。就类似复习的时候不能只看错题,也得看看之前做对的题,只是权重更偏向错题。每个弱分类器都是在前一轮弱分类器分类错误的样本加权后训练的,以此更加关注分类错误的样本,从而提高分类性能。

那么,如何进行样本集的加权呢?

以下是具体的思路:

我们为了更聚焦与错误分类的那些样本,要设计一种形式使得当分类错误的时候更大,分类正确的时候更小。因此,可以考虑下面这种形式。

如果第\(t\)个分类器\(G_t\)错误分类了第\(i\)个样本,则第\(i\)个样本在第\(t+1\)轮中的权重为:

\[w_{i,t+1} = w_{i,t} \times e^{\alpha_t} \]

其中\(\alpha(t)\)是第\(t\)个分类器的权重。反之,如果第\(t\)个分类器正确分类了第\(i\)个样本,则第\(i\)个样本在第\(t+1\)轮中的权重为:\(w_{i,t+1} = w_{i,t} \times e^{-\alpha_t}\)。这样就可以保证

这两种情况可以统一为:

\[w_{i,t+1} = w_{i,t} \times e^{-\alpha_t y_i G_t(x_i)} \]

\(y_i G_t(x_i)\)在正确分类时为\(-1\),错误分类时为\(1\)。为了保证权重求和为\(1\),这样计算之后还会对整个权重进行归一化,即都除以\(\Sigma({w_{i,t}\times e^{-y_i\alpha(t)}})\)

然后我们考虑如何计算\(\alpha_t\)\(\alpha_t\)是基本分类器的权重,它的计算如下:

  1. 计算\(G_t\)在训练集上样本加权后的分类误差率:

\[e_t = \Sigma P(G_t(x_i)\neq y_i) = \Sigma w_{i,t}I(G_t(x_i)\neq y_i) \]

  1. 取自然对数

\[\alpha_t = \frac{1}{2}log\frac{1-e_t}{e_t} \]

第二步的公式怎么来的呢?

这是因为我们希望正确分类的样本的权重比上错误分类的样本的权重恰好是正确率和错误率的比值的反比,如果用上面的式子的话,就有

\[\frac{e^{-\alpha_t}}{e^{\alpha_t}} = \frac{e^{-\frac{1}{2}log\frac{1-e_t}{e_t}}}{e^{\frac{1}{2}log\frac{1-e_t}{e_t}}} \\ = \frac{(\frac{1-e_t}{e_t})^{-\frac{1}{2}}}{( \frac{1-e_t}{e_t})^\frac{1}{2}} \\ = \frac{e_t}{1-e_t} \]

假设两个弱分类器a和b,\(e_{a} = 0.8\)\(e_{b} = 0.1\),在这两种情况下,正确分类的样本的权重比上错误分类的样本的权重分别是\(8:2\)\(1:9\)。前一种情况的错误率很高,也就是大部分都是误分类的样本时,这时反而会提高分类正确的样本的权重。

AdaBoost算法在得到最终的分类器时,会对之前所有的分类器进行加权。以上面的分类器为例,a和b的\(\alpha\)的比值:

\[\frac{\alpha_a}{\alpha_b} = \frac{log\frac{1-e_a}{e_a}}{log\frac{1-e_b}{e_b}} \\ = \frac{log(\frac{1}{4})}{log (9)} \]

可知\(log(\frac{1}{4})\)是负数,\(log (9)\)是正数,此处可以看出,分类性能越好的分类器,计算出的权重会更大,对最终结果影响的程度越高。

理解2:前向分步算法

AdaBoost最后生成的强分类器可以认为是一个加法模型,即:

\[f(x) = \left(\sum_{t=1}^{T} \alpha_t h(x;\theta_t)\right) \]

其中,\(f(x)\)表示最终的强分类器,\(h(x;\theta_t)\)表示第\(t\)个弱分类器,\(\theta_t\)是该分类器的参数,\(\alpha_t\)是该分类器的权重。

学习这个模型可以最小化损失函数,但是这个问题非常复杂, 前向分步算法是用来解决这个优化问题。它通过从前向后每次学习一个基函数和系数,然后逐步逼近优化目标函数。

在AdaBoost中,优化的损失函数是指数损失函数,如下:

\[L(y,f(x)) = \exp(-yf(x)) \]

其中,\(y \in \{-1, +1\}\)表示样本的真实标签,\(f(x)\)表示模型的预测值。

通过优化目标,可以反过来推出\(\alpha_t\)的取值和上一种理解相同,如下:

\(k-1\)轮的强学习器可记为\(f_{k-1}(x) = \left(\sum_{t=1}^{k-1} \alpha_t h(x;\theta_t)\right)\),第\(T\)轮的强学习器记为\(f_{k}(x) = \left(\sum_{t=1}^{k} \alpha_t h(x;\theta_t)\right)\)
有:

\[f_{k}(x) = f_{k-1}(x) + \alpha_T h(x;\theta_k) \]

在优化最小化指数函数的时候,在第k步时,有:

\[ L = exp(-yf(x)) \\ = \Sigma_{i=1}^M exp(-y_if_k(x_i)) \\ = \Sigma_{i=1}^M exp(-y_i(f_{k-1}(x_i) + \alpha_k h(x_i;\theta_k))) \\ = \Sigma_{i=1}^M exp(-y_i(f_{k-1}(x_i)) exp(-y_i\alpha_kT h(x_i;\theta_k))) \\ = \Sigma_{i=1}^M W_i exp(-y_i\alpha_k h(x_i;\theta_k))) \\ = \Sigma_{y_i=h(x_i;\theta_k)} W_i exp(-\alpha_k) + \Sigma_{y_i\neq h(x_i;\theta_k)}W_i exp(\alpha_k) \\ = \Sigma_{i=1}^M W_i exp(-\alpha_k)(1-I(y_i\neq h(x_i;\theta_k)) + \Sigma_{i=1}^M W_i exp(\alpha_T)I(y_i\neq h(x_i;\theta_k) \\ = exp(-\alpha_k)\Sigma_{i=1}^M W_i + (exp(\alpha_k) - exp(-\alpha_k)) \Sigma_{i=1}^M W_iI(y_i\neq h(x_i;\theta_k) \]

其中\(exp(-y_if_{k-1}(x_i))\)来源于上一个学习器,相当于是常数项,直接记为\(W_i\)

\(\alpha_k\)取偏导并令其为0,就可以得到

\[\alpha_k = \frac{1}{2}log(\frac{1-e_k}{e_k}) \]

提升树

提升树(Boosting Tree)是一种常见的集成学习算法,它通过逐步迭代的方式训练多个决策树,每一棵树都试图纠正前面树的预测误差,从而得到一个更加准确的整体模型。

提升树的基本思路是,每一次训练新的决策树都会关注前面树的误差,让新树尽可能地纠正前面树的错误。在每一次训练中,提升树会根据当前模型的预测结果和真实标签之间的差异,构建一个新的树模型,并将其与前面的模型组合起来形成一个更加准确的模型。这个过程会重复多次,直到模型收敛或达到指定的迭代次数为止。

提升树其实就是一个加法模型,在每一轮迭代中,我们需要根据当前模型的预测结果,计算出样本的残差(即真实值与预测值之间的差值),并将残差作为下一轮迭代中的损失函数。

GBDT梯度提升决策树

GDBT, 即Gradient Boosting Decision Tree,梯度提升决策树。在提升树算法中,每一轮迭代并没有直接计算梯度值,而是根据损失函数的形式来构造残差,然后用基学习器去拟合这个残差。由于残差与负梯度的形式很相似,因此提升树算法也被视为一种近似梯度下降的方法。

而在梯度提升决策树算法中,每一轮迭代是直接计算损失函数的负梯度,来作为提升树里的残差。用一阶泰勒展开式可以推导出当取第k-1个模型损失函数的负梯度的时候,能够保证每一轮迭代都能够在前一轮的迭代上减小损失值。因此,梯度提升决策树算法可以看作是一种真正的梯度下降方法。

GBDT中,每一个基学习器用的是CART回归树,CART回归树可以很好地计算负梯度,因为CART回归树的叶子节点中存储的是训练数据的平均值或者众数,这个平均值或者众数可以作为当前回归树的预测值。

GBDT框架

  • XGBoost框架:采用了一系列的技术,包括Gradient Boosting、二阶泰勒展开、正则化、特征重要性评估、并行化等,从而在效果和速度上都有很好的表现。
  • LightGBM框架:主要思想是在构建模型的过程中,通过使用梯度单边采样的方法来减少数据集的大小,同时使用直方图算法对特征进行离散化,从而减少了内存占用和运行时间。

并行集成学习

Bagging并行式集成学习

Bagging,即Bootstrap AGGregatING,表示自助抽样集成,将训练集随机有放回地采样得到m个样本的采样集,基于每个采样集训练一个基学习器,再预测时将它们结合得到结果,通常分类问题使用投票法生成结果,回归问题使用平均法作为最终的结果。

以下是集合结果时使用的方法:

  • 投票法
    • 绝对多数投票 majority voting:选取过半数投票的结果
    • 相对多数投票 plurality voting:选取得票数最多的结果
    • 加权投票: 通过训练权重,对每个基分类器的结果加权处理
  • 平均法
    • 简单平均:直接算平均值作为最终结果
    • 加权平均:通过训练权重,对每个基分类器的结果加权处理

​Random Forest随机森林

随机森林采用 Bagging 技术和随机特征选择来构建决策树,因此能够有效地降低过拟合风险,提高模型的泛化能力。

整体的流程如下:

  1. 从原始数据集中使用自助采样(bootstrap sampling)的方法随机抽取若干个样本构建新的训练集,即每个训练集都是由原始数据集中采样得到的,每个样本被采样到新的训练集的概率为 \(\frac{1}{n}\)

  2. 从所有特征中随机选取一部分特征,比如说 \(m\) 个特征(\(m\) << 特征总数),然后从这 \(m\) 个特征中选择最优的特征进行节点分裂。这个过程可以通过计算信息增益(ID3)、增益比(C4.5)或基尼指数(CART)来选择最优特征。

  3. 对每个节点重复步骤 2 直到满足停止条件,比如说节点包含的样本数量小于某个阈值,或者树的深度达到了某个限制。

重复步骤 1 到 3,构建多棵决策树,最终的结果就和上述Bagging的集合结果的方法相似。

总结与比较

最后是常见概念的优缺点总结。

Bagging VS Boosting

  • Bagging
    • 主要关注降低方差,在不容易受样本扰动的学习器上的效用更明显
    • 可以有效地缓解过拟合问题,但它对于噪声数据的容忍度较低
  • Boosting
    • 更多地关注如何减小模型的偏差
    • 可以提高模型的泛化能力,但容易受到噪声数据的干扰

GDBT VS XGBoost

  • GBDT只用到了损失函数的一阶导;XGboost用到了损失函数的二次导,效果会更好
  • XGBoost加入了一个正则化项,包含了叶子节点的个数和各个叶子节点输出值的平方之和
  • XGBoost引入了列抽样,能够降低过拟合的风险,也减少了计算量
  • 当遇到负增益时,GBDT会马上停止分裂,但是XGBoost会一致分裂到指定的最大深度,然后回来剪枝。
  • XGBoost引入了并行,多线程地计算特征的增益,后面的迭代可以重复使用。
posted @ 2023-03-17 19:17  阿莱慢慢来  阅读(154)  评论(0)    收藏  举报