Boosting算法的前世今生(上篇)

微信公众号:AIKaggle
欢迎建议和拍砖,若需要资源,请公众号留言;
如果你觉得AIKaggle对你有帮助,欢迎赞赏


目录


本系列文章将会梳理Boosting算法的发展,从Boosting算法入手,介绍Adaboost,GBDT/GBRT算法,XGBoost算法,LightGBM算法,CATBoost算法,Thunder GBM算法等,介绍Boosting算法族的原理,框架,推导等,本文 - Boosting算法的前世今生(上篇)将介绍AdaBoost算法和梯度提升树算法,下篇将会详细介绍XGBoost算法,LightGBM算法,CATBoost算法,Thunder GBM算法等,也可关注公众号:AIKaggle获取算法动态。

1. 引言

  • Boosting是一族可将弱学习器提升为强学习器的算法,它的个体学习器间存在强依赖关系、且必须串行生成,是集成学习(ensemble learning)的代表算法之一。通过构建并结合多个学习器来完成任务,有时也被称为多分类器系统(multi-classifier system)、基于委员会的学习(committee-based learning)等。
  • Boosting算法涉及到两个部分,加法模型和前向分布算法。加法模型就是说强分类器是由一系列弱分类器线性相加而成。一般组合形式如下:
    \[F_{M(x;P)} = \sum_{m=1}^{n}\beta_mh(x;a_m)\]
  • 其中,\(h(x;a_m)\)就是一个个弱分类器,\(a_m\)是弱分类器学习到的最优参数,\(\beta_m\)就是弱学习器在强分类器中的所占比重,\(P\)是所有\(a_m\)\(\beta_m\)的组合。这些弱分类其线性相加组成强分类器。
  • 前向分步算法就是说在训练过程中,下一轮迭代产生的分类器是在上一轮的基础上训练得来的。也就是可以写成这样的形式:
    \[F_m(x) = F_{m-1}(x) +\beta_mh_m(x;a_m)\]
  • 由于采用的损失函数不同,Boosting算法也因此有了不同的类型,AdaBoost就是损失函数为指数损失的Boosting算法。

2. AdaBoost

  • 现在叙述AdaBoost算法。假设给定一个二类分类的训练数据集

\[T = {(x_1,y_1), (x_2,y_2),..., (x_N,y_N)}\]

  • 其中,每个样本由实例与标记组成,实例\(x_i\in X\subset R^n\),标记\(y_i\in Y=\{-1,+1\}\)\(X\)是实例空间,\(Y\)是标记集合。AdaBoost利用以下算法,从训练数据中学习一系列弱分类器或基分类器,并将这些弱分类器线性组合成为一个强分类器。

    2.1 AdaBoost算法框架

输入:训练数据集\(T = {(x_1, y_1), (x_2, y_2),...,(x_N, y_N)}\),弱学习算法;其中\(x_i\in X\subset R^n\)\(y_i\in Y=\{-1,+1\}\)
过程:

(1) 初始化训练数据的权值分布
\[D_1 = (w_{11},..,w_{1i},...,w_{1N}), w_{1i} = \frac1N,i=1,2,...,N\]

(2) 对\(m=1,2,...,M\)
(2.a) 使用具有权值分布\(D_m\)的训练数据集学习,得到基分类器
\[G_m(x): X \rightarrow \{-1, +1 \}\]
(2.b) 计算\(G_m(x)\)在训练数据集上的分类误差率\(e_m\)
\[e_m = P(G_m(x_i)\neq y_i )=\sum_{i=1}^{N}w_{mi}I(G_m(x_i)\neq y_i)\]
(2.c) 计算\(G_m(x)\)的系数:
\[\alpha_m=\frac12 log \frac{1-e_m}{e_m}\]
这里的对数是自然对数。
(2.d) 更新训练数据集的权值分布
\[D_{m+1}= (w_{m+1, 1},..., w_{m+1, i},..., w_{m+1, N})\]
\[w_{m+1,i} = \frac{w_{mi}}{Z_m}exp(-\alpha_my_iG_m(x_i)), i=1,...,N\]
这里,\(Z_m\)是规范化因子,它使\(D_{m+1}\)成为一个概率分布。
\[Z_m = \sum_{i=1}^{N}w_{mi}exp(-\alpha_my_iG_m(x_i))\]

(3) 构建基本分类器的线性组合
\[f(x) = \sum_{m=1}^M\alpha_mG_m(x)\]
得到最终分类器
\[G(x) = sign(f(x)) = sign(\sum_{m=1}^M\alpha_mG_m(x))\]
输出:最终分类器\(G(x)\)

2.2 思考

  1. 什么样的弱分类器可以作为基分类器,也就是说,对于基分类器的选取有何要求?
  2. 为何这样选取基分类器的系数\[\alpha_m=\frac12 log \frac{1-e_m}{e_m}\]

3. 梯度提升树算法(GBDT/GBRT)

  • 以决策树为基函数的提升方法称为提升树,对分类问题决策树是二叉分类树,对回归问题决策树是二叉回归树。提升树模型可以表示为决策树的加法模型。
    \[f_M(x) = \sum_{m=1}^MT(x;\Theta_m)\]
  • 其中,\(T(x;\Theta_m)\)表示决策树;\(\Theta_m\)为决策树的参数;\(M\)为树的个数。
  • 对于二分类问题,提升树算法只需将AdaBoost算法中的基分类器限制在二类分类树即可。

    3.1 梯度提升树算法框架

输入:训练数据集\(T = {(x_1, y_1), (x_2, y_2),...,(x_N, y_N)}\),损失函数\(L(y,f(x))\);其中\(x_i\in X \subset R^n\)\(y_i\in Y \subset R^n\)
过程:

(1) 初始化\(f_0(x) = \arg\min_{c}\sum_{i=1}^NL(y_i,c)\)

(2) 对\(m=1,2,...,M\)
(2.a) 对\(i=1,2,...,N\),计算\(r_{mi} = -[\frac{\partial L(y_i, f(x_i)))}{\partial f(x_i)}]_{f(x) = f_{m-1}(x)}\)
(2.b) 对\(r_{mi}\)拟合一个回归树,得到第\(m\)棵树的叶结点区域\(R_{mj}, j=1,...,J\)
(2.c) 对\(j=1,2,...,J\),计算:
\[c_{mj} = \arg\min_c\sum_{x_i\in R_{mj}}L(y_i,f_{m-1}(x_i)+c)\]
(2.d) 更新\(f_m(x) = f_{m-1}(x)+\sum_{j=1}^Jc_{mj}I(x\in R_{mj})\)

(3) 得到回归树\(\hat f(x) = f_M(x) = \sum_{m=1}^M c_{mj}I(x\in R_{mj})\)
输出:回归树\(\hat f(x)\)

3.2 思考:

  1. 提升树模型中每棵树的权重怎么理解?是平均分配权重吗?

3.3 GBDT 常用损失函数

3.3.1 分类算法

对于分类算法,其损失函数一般有对数损失函数和指数损失函数两种:

  1. 指数损失函数,则损失函数表达式为
    \[L(y, f(x)) = exp(-yf(x))\]
  2. 对数损失函数,分为二元分类和多元分类两种。
3.3.2 回归算法

对于回归算法,常用的损失函数有如下4种:

  1. 均方差,这个是最常见的回顾损失函数:
    \[L(y, f(x)) = (y-f(x))^2\]
  2. 绝对损失,这个损失函数也很常见
    \[L(y, f(x)) = |y-f(x)|\]
    对应的负梯度误差为
    \[sign(y_i- f(x_i))\]
  3. Huber损失,它是均方差和绝对损失的折中产物,对于远离中心的异常点,采用绝对损失,而中心附近的点采用均方差。这个界限一般用分位数点度量。损失函数如下:

\[L(y,f(x))= \begin{cases} \frac12(y-f(x))^2, |y-f(x)|<\delta \\ \delta(|y-f(x)|-\frac{\delta}{2}), |y-f(x)|>\delta \end{cases}\]

对应的负梯度误差为:

\[r(y_i, f(x_i)) = \begin{cases} y_i -f(x_i), |y_i - f(x_i)|\leq \delta \\ \delta sign(y_i, f(x_i)), |y_i-f(x_i)|>\delta \end{cases}\]

  1. 分位数损失。它对应的是分位数回归的损失函数,表达式为

\[L(y, f(x)) = \sum_{y\geq f(x)} \theta|y-f(x)|+\sum_{y<f(x)}(1-\theta)|y-f(x)|\]

其中\(\theta\)为分位数,需要我们在回归前指定。对应的负梯度误差为:

\[r(y_i, f(x_i)) = \begin{cases} \theta, y_i\geq f(x_i) \\ \theta -1, y_i< f(x_i) \end{cases}\]

对于Huber损失和分位数损失,主要用于健壮回归,也就是减少异常点对损失函数的影响。

3.4 梯度提升树的正则化

和AdaBoost一样,我们也需要对GBDT进行正则化,防止过拟合。GBDT的正则化主要有三种方式。

  • 第一种是和AdaBoost类似的正则化项,即步长(learning rate)。定义为\(v\),对于前面的弱学习器的迭代

\[f_k(x) = f_{k-1}(x)+h_k(x)\]

如果我们加上了正则化项,则有

\[f_k(x) = f_{k-1}(x)+vh_k(x)\]

\(v\)的取值范围为 \(0<v\leq 1\) 。对于同样的训练集学习效果,较小的\(v\)意味着我们需要更多的弱学习器的迭代次数。通常我们用步长和迭代最大次数一起来决定算法的拟合效果。

  • 第二种正则化的方式是通过子采样比例(subsample)。取值为\((0,1]\)。注意到这里的子采样和随机森林不一样,随机森林使用的是放回抽样,而这里是不放回抽样。如果取值为1,则全部样本都使用,等于没有使用子采样。如果取值小于1,则只有一部分样本会去做GBDT的决策树拟合。选择小于1的比例可以减少方差,即防止过拟合,但是会增加样本拟合的偏差,因此取值不能太低。推荐在\([0.5, 0.8]\)之间。

使用了子采样的GBDT有时也称作随机梯度提升树(Stochatis Gradient Boosting Tree,SGBT)。由于使用了子采样,程序可以通过采样分发到不同的任务去做boosting的迭代过程,最后形成新树,从而减少弱学习器难以并行学习的弱点。

  • 第三种是对于弱学习器即CART回归树进行正则化剪枝,可参考决策树原理,此处不详细展开。

4. 关注AIKaggle

下面的是我的公众号二维码图片,本公众号深度解读机器学习算法,分享Kaggle比赛信息及实战案例,介绍数据科学方法论,分享竞赛技巧,分享tensorflow、keras、pytorch、深度学习、机器学习实战案例,欢迎关注。

5. 赞赏Kaggle实战机器学习

如果你觉得到Kaggle实战机器学习对你有帮助,欢迎赞赏,有你的支持,Kaggle实战机器学习一定会越来越好!
赞赏码


Nice to meet you !

猜你喜欢

转载自www.cnblogs.com/AIKaggle/p/11529718.html