集成学习——Boosting提升方法2之前向分步算法、提升树

前向分布算法

Adaboost每次学习单一分类器以及单一分类器的参数(权重)。Adaboost算法可以解释为:模型为加法模型、损失函数为指数函数、学习算法为 前向分布算法的二分类 学习算法
前向分布算法是集成学习的重要框架,以至于既可以解决分类问题,也可以解决回归问题

首先来看加法模型:

f ( x ) = ∑ m = 1 M β m b ( x ; γ m ) f(x)=\sum_{m=1}^{M} \beta_{m} b\left(x ; \gamma_{m}\right) f(x)=m=1Mβmb(x;γm)
这个形式感觉和AdaBoost的线性组合很像,没错,AdaBoost是前向分布加法算法的特例。
上面的公式中, b ( x ; γ m ) b\left(x ; \gamma_{m}\right) b(x;γm)为基本分类器, γ m \gamma_{m} γm为基本分类器的参数, β m \beta_m βm为基本分类器的权重。

在给定训练数据以及损失函数 L ( y , f ( x ) ) L(y, f(x)) L(y,f(x))的条件下,学习加法模型 f ( x ) f(x) f(x)成为经验风险极小化即损失函数极小化问题:
min ⁡ β m , γ m ∑ i = 1 N L ( y i , ∑ m = 1 M β m b ( x i ; γ m ) ) \min _{\beta_{m}, \gamma_{m}} \sum_{i=1}^{N} L\left(y_{i}, \sum_{m=1}^{M} \beta_{m} b\left(x_{i} ; \gamma_{m}\right)\right) βm,γmmini=1NL(yi,m=1Mβmb(xi;γm))
通常这是一个复杂的优化问题,很难通过简单的凸优化的相关知识进行解决。
前向分步算法可以用来求解这种方式的问题,它的基本思路是:因为学习的是加法模型,如果从前向后,每一步只优化一个基函数及其系数,逐步逼近目标函数,那么就可以降低优化的复杂度。具体而言,每一步只需要优化:
min ⁡ β , γ ∑ i = 1 N L ( y i , β b ( x i ; γ ) ) \min _{\beta, \gamma} \sum_{i=1}^{N} L\left(y_{i}, \beta b\left(x_{i} ; \gamma\right)\right) β,γmini=1NL(yi,βb(xi;γ))

因为加法模型,每次迭代学习只能够使本次学习达到局部最优,再将所有局部最优的模型相加

学习加法模型 f ( x ) f(x) f(x)的前向分布算法:

  • 输入:训练数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯   , ( x N , y N ) } T=\left\{\left(x_{1}, y_{1}\right),\left(x_{2}, y_{2}\right), \cdots,\left(x_{N}, y_{N}\right)\right\} T={(x1,y1),(x2,y2),,(xN,yN)} x i ∈ X ⊆ R n x_{i} \in \mathcal{X} \subseteq \mathbf{R}^{n} xiXRn y i ∈ Y = { + 1 , − 1 } y_{i} \in \mathcal{Y}=\{+1,-1\} yiY={+1,1}。损失函数 L ( y , f ( x ) ) L(y, f(x)) L(y,f(x)),基函数集合 { b ( x ; γ ) } \{b(x ; \gamma)\} {b(x;γ)}
  • 输出加法模型 f ( x ) f(x) f(x)
  1. 初始化 f 0 ( x ) = 0 f_{0}(x)=0 f0(x)=0

  2. 最m=1,2,…,M次迭代学习:
    a. 极小化损失函数: ( β m , γ m ) = arg ⁡ min ⁡ β , γ ∑ i = 1 N L ( y i , f m − 1 ( x i ) + β b ( x i ; γ ) ) \left(\beta_{m}, \gamma_{m}\right)=\arg \min _{\beta, \gamma} \sum_{i=1}^{N} L\left(y_{i}, f_{m-1}\left(x_{i}\right)+\beta b\left(x_{i} ; \gamma\right)\right) (βm,γm)=argβ,γmini=1NL(yi,fm1(xi)+βb(xi;γ))

    因为加法模型是之前的学习器+本次的学习器

得到参数 β m \beta_{m} βm γ m \gamma_{m} γm

	b. 更新:

f m ( x ) = f m − 1 ( x ) + β m b ( x ; γ m ) f_{m}(x)=f_{m-1}(x)+\beta_{m} b\left(x ; \gamma_{m}\right) fm(x)=fm1(x)+βmb(x;γm)
c. 得到加法模型:
f ( x ) = f M ( x ) = ∑ m = 1 M β m b ( x ; γ m ) f(x)=f_{M}(x)=\sum_{m=1}^{M} \beta_{m} b\left(x ; \gamma_{m}\right) f(x)=fM(x)=m=1Mβmb(x;γm)

这样,前向分步算法将同时求解从m=1到M的所有参数 β m \beta_{m} βm γ m \gamma_{m} γm的优化问题简化为逐次求解各个 β m \beta_{m} βm γ m \gamma_{m} γm的问题。

局部最优,然后所有局部最优相加近似地认为是总体最优,贪心的思想

前向分布与AdaBoost

定理:Adaboost算法是前向分步算法的特例,Adaboost算法是由基本分类器组成的加法模型,损失函数为指数损失函数。
证明:前向分布算法学习的是加法模型,当奇函数是基本分类器是,该加法模型等价于AdaBoost的最终分类器 f ( x ) = ∑ m = 1 M α m G m ( x ) f(x)=\sum_{m=1}^{M} \alpha_{m} G_{m}(x) f(x)=m=1MαmGm(x) ,其中 G m ( x ) G_{m}(x) Gm(x)是基本分类器, a l p h a m alpha_{m} alpham是系数, m = 1 , 2 , . . . , M m=1,2,...,M m=1,2,...,M。前向分布算法逐一学习基本函数,这一过程与AdaBoost算法逐一学习基本分类器的过程一致。
下面证明前向分布算法的损失函数是指数损失函数 L ( y ,   f ( x ) ) = e − y f ( x ) ) L\left(y , \ f(x) \right)=e^{-yf(x))} L(y, f(x))=eyf(x))时,其学习的具体操作等价于AdaBoost算法学习的具体操作。

接下来的证明(李航老师的《统计学习方法》第八章的3.2节)我没看懂

提升树算法

基于残差学习的提升树算法:

前面都是在说分类树,其实基于加法模型和前向分布算法的框架可以实现回归问题的。
则选择决策树中的二叉回归树作为基函数,那么怎么寻找最佳划分点呢?在回归树中样本标签时连续数值,使用分类树的决策指标则不合适,那么选择平方误差为损失函数。

为什么最终选择平方误差?

那么回归问题的提升树的提升标准是什么?类比于分类错误率在AdaBoost中的作用:修改样本的权重分布;作为基分类器的权重系数。则使用残差达到相同的作用。

为什么就选择了残差呢?

回归问题的提升树算法:

  • 输入:数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯   , ( x N , y N ) } , x i ∈ X ⊆ R n , y i ∈ Y ⊆ R T=\left\{\left(x_{1}, y_{1}\right),\left(x_{2}, y_{2}\right), \cdots,\left(x_{N}, y_{N}\right)\right\}, x_{i} \in \mathcal{X} \subseteq \mathbf{R}^{n}, y_{i} \in \mathcal{Y} \subseteq \mathbf{R} T={(x1,y1),(x2,y2),,(xN,yN)},xiXRn,yiYR
  • 输出:最终的提升树 f M ( x ) f_{M}(x) fM(x)
  1. 初始化 f 0 ( x ) = 0 f_0(x) = 0 f0(x)=0

  2. 对n=1,2,…,M次迭代:
    a. 计算每个样本的残差: r m i = y i − f m − 1 ( x i ) , i = 1 , 2 , ⋯   , N r_{m i}=y_{i}-f_{m-1}\left(x_{i}\right), \quad i=1,2, \cdots, N rmi=yifm1(xi),i=1,2,,N
    b. 拟合残差$r_{m i}学习一颗回归树,得到决策树 T ( x ; Θ m ) = ∑ m = 1 M c j I ( x ∈ R j ) T\left(x ; \Theta_{m}\right)=\sum_{m=1}^{M}c_{j}I(x\in R_{j}) T(x;Θm)=m=1McjI(xRj),其中 Θ m \Theta_{m} Θm是决策树的参数, M M M是数的个数。

    决策树 T ( . ) T(.) T(.)的前景补充:将输入空间 X X X划分为 J J J个互不相交的区域 R 1 , R 2 , . . . , R J R_{1},R_{2},...,R_{J} R1,R2,...,RJ,并在每个区域上确定输出常量 c j c_{j} cj参数 Θ m \Theta_{m} Θm 表示树的区域划分和各区域上的常数 c c c J J J是回归树的复杂度即叶节点个数。

    c. 更新: f m ( x ) = f m − 1 ( x ) + T ( x ; Θ m ) f_{m}(x)=f_{m-1}(x)+T\left(x ; \Theta_{m}\right) fm(x)=fm1(x)+T(x;Θm)

  3. 得到回归问题的提升树 f M ( x ) = ∑ m = 1 M T ( x ; Θ m ) f_{M}(x)=\sum_{m=1}^{M} T\left(x ; \Theta_{m}\right) fM(x)=m=1MT(x;Θm)

    这个过程和前向分布算法很像

回归问题的提升树计算题(以树桩作为基函数)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

梯度提升决策树算法(GBDT)

学习链接:
https://blog.csdn.net/zpalyq110/article/details/79527653
https://zhuanlan.zhihu.com/p/45145899

对于一般的损失函数而言,往往每一步的优化不是那么容易,针对这一的问题,Freidman提出了梯度提升算法(gradient boosting),这是利用最速下降法的近似方法,利用损失函数的负梯度在当前模型的值 − [ ∂ L ( y , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x ) -\left[\frac{\partial L\left(y, f\left(x_{i}\right)\right)}{\partial f\left(x_{i}\right)}\right]_{f(x)=f_{m-1}(x)} [f(xi)L(y,f(xi))]f(x)=fm1(x)作为回归问题提升树算法中的残差的近似值,拟合回归树。

为什么对于一般的损失函数,优化不像提升树和AdaBoost那样容易?

梯度提升算法:

  • 输入:训练数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯   , ( x N , y N ) } , x i ∈ X ⊆ R n , y i ∈ Y ⊆ R T=\left\{\left(x_{1}, y_{1}\right),\left(x_{2}, y_{2}\right), \cdots,\left(x_{N}, y_{N}\right)\right\}, x_{i} \in \mathcal{X} \subseteq \mathbf{R}^{n}, y_{i} \in \mathcal{Y} \subseteq \mathbf{R} T={(x1,y1),(x2,y2),,(xN,yN)},xiXRn,yiYR和损失函数 L ( y , f ( x ) ) L(y, f(x)) L(y,f(x))
  • 输出:回归树 f ^ ( x ) \hat{f}(x) f^(x)
  1. 初始化: f 0 ( x ) = arg ⁡ min ⁡ c ∑ i = 1 N L ( y i , c ) f_{0}(x)=\arg \min _{c} \sum_{i=1}^{N} L\left(y_{i}, c\right) f0(x)=argminci=1NL(yi,c)

    估计是损失函数极小化的常数值,是只有一个根结点的树

  2. 对于m=1,2,…,M次迭代:
    a. 对i = 1,2,…,N个样本计算: r m i = − [ ∂ L ( y i , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x ) r_{m i}=-\left[\frac{\partial L\left(y_{i}, f\left(x_{i}\right)\right)}{\partial f\left(x_{i}\right)}\right]_{f(x)=f_{m-1}(x)} rmi=[f(xi)L(yi,f(xi))]f(x)=fm1(x)

    计算损失函数的负梯度在当前模型的值,将它作为残差估计。对于一般损失函数,是残差的近似值

    b. 对 r m i r_{mi} rmi拟合一个回归树,得到第m棵树的叶结点区域 R m j , j = 1 , 2 , ⋯   , J R_{m j}, j=1,2, \cdots, J Rmj,j=1,2,,J

    估计回归树叶节点区域,以怒喝残差估计的近似值

    c. 对j=1,2,…J,计算: c m j = arg ⁡ min ⁡ c ∑ x i ∈ R m j L ( y i , f m − 1 ( x i ) + c ) c_{m j}=\arg \min _{c} \sum_{x_{i} \in R_{m j}} L\left(y_{i}, f_{m-1}\left(x_{i}\right)+c\right) cmj=argcminxiRmjL(yi,fm1(xi)+c)

    用线性搜索估计叶节点区域的值,是损失函数极小化

    d. 更新 f m ( x ) = f m − 1 ( x ) + ∑ j = 1 J c m j I ( x ∈ R m j ) f_{m}(x)=f_{m-1}(x)+\sum_{j=1}^{J} c_{m j} I\left(x \in R_{m j}\right) fm(x)=fm1(x)+j=1JcmjI(xRmj)

  3. 得到回归树: f ^ ( x ) = f M ( x ) = ∑ m = 1 M ∑ j = 1 J c m j I ( x ∈ R m j ) \hat{f}(x)=f_{M}(x)=\sum_{m=1}^{M} \sum_{j=1}^{J} c_{m j} I\left(x \in R_{m j}\right) f^(x)=fM(x)=m=1Mj=1JcmjI(xRmj)

示例

这个博文写的很好,里面有示例

GradientBoostingRegressor参数

https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingRegressor.html#sklearn.ensemble.GradientBoostingRegressor

from sklearn.ensemble import GradientBoostingRegressor
  • loss:{‘ls’, ‘lad’, ‘huber’, ‘quantile’}, default=’ls’
    待优化的损失函数。“ ls”是指最小二乘回归。“ lad”(最小绝对偏差)是仅基于输入变量的顺序信息的高度鲁棒的损失函数。“ huber”是两者的结合。“quantile”允许分位数回归(用于alpha指定分位数)。

  • learning_rate:float,default= 0.1
    用learning_rate学习率缩小了每棵树的贡献。在learning_rate和n_estimators之间需要权衡。

  • n_estimators:int,default= 100
    要执行的提升次数。梯度提升对于过度拟合具有相当强的鲁棒性,因此大量提升通常会带来更好的性能。

  • subsample:float, default=1.0
    用于拟合各个基础学习器的样本比例。如果小于1.0,则将导致随机梯度提升。subsample与参数n_estimators相关。选择subsample < 1.0会导致方差减少和偏差增加。

  • criterion:{‘friedman_mse’, ‘mse’, ‘mae’}, default=’friedman_mse’
    衡量分割质量的功能。支持的标准是:“ friedman_mse”表示具有Friedman改进得分的均方误差,“ mse”表示均方误差,“ mae”表示平均绝对误差。通常,“ friedman_mse”的默认值是最好的,因为在某些情况下它可以提供更好的近似值。

  • min_samples_split :int或float,default=2
    拆分内部节点所需的最少样本数:

  • 如果为int,则认为min_samples_split是最小值。

  • 如果为float,min_samples_split则为分数, ceil(min_samples_split * n_samples)是每个拆分的最小样本数。

  • min_samples_leaf: int或float,default= 1
    在叶节点处需要的最小样本数。仅在任何深度的分裂点在min_samples_leaf左分支和右分支中的每个分支上至少留下min_samples_leaf个训练样本时才考虑。这可能具有平滑模型的效果,尤其是在回归中。

  • 如果为int,则认为min_samples_leaf是最小值。

  • 如果为float,min_samples_leaf则为分数, ceil(min_samples_leaf * n_samples)是每个节点的最小样本数。

  • min_weight_fraction_leaf :float,default= 0.0
    在所有叶节点处(所有输入样本)的权重总和中的最小加权分数。当未提供sample_weight时,样本具有相等的权重。

  • max_depth: int,default= 3
    各个regression estimators的最大深度。最大深度限制了树中节点的数量。调整此参数以获得最佳性能;最佳值取决于输入变量的交互作用。

  • min_impurity_decrease:float,default= 0.0
    如果节点分裂会导致杂质impurity的减少大于或等于该值,则该节点将被分裂。

  • min_impurity_split: float,default=None

  • 树生长中early stopping的阈值。如果节点的杂质impurity高于阈值,则该节点将分裂,否则为叶结点。

  • initestimator or ‘zero’, default=None
    一个estimator对象,用于计算初始预测。 init必须提供适合和预测。如果为“None”,则初始原始预测设置为零。默认情况下使用DummyEstimator,预测平均目标值(loss=‘ls’)或a quantile for the other losses。

  • random_state: int,RandomState instance or None, default=None
    控制每次增强提升时分配给每个Treeestimator的随机种子。另外,它控制每个分割处特征的随机排列。如果n_iter_no_change不是None ,它还控制训练数据的随机拆分以获得验证集。为多个函数调用传递可重复输出的int值。

  • max_features: {‘auto’,‘sqrt’,‘log2’},int或float,default=None
    寻找最佳分割时要考虑的features数量:

  • 如果为int,则max_features在每个拆分处考虑要素。

  • 如果为float,max_features则为小数,并 在每次拆分时考虑要素。int(max_features * n_features)

  • 如果为“auto”,则为max_features=n_features。

  • 如果是“ sqrt”,则max_features=sqrt(n_features)。

  • 如果为“ log2”,则为max_features=log2(n_features)。

  • 如果None,则max_features=n_features。

选择max_features < n_features,会导致方差减少和偏差增加。

注意:在找到至少一个有效的节点样本分区之前,分割的搜索不会停止,即使它需要有效检查超过max_features要素。

  • alpha:float, default=0.9
    huber loss function 和quantile loss function的alpha分位数。仅当loss='huber’或时loss=‘quantile’。

  • verboseint, default=0
    启用详细输出。如果为1,则偶尔打印一次进度和性能(树越多,频率越低)。如果大于1,则将打印每棵树的进度和性能。

  • max_leaf_nodes :int,default=None
    max_leaf_nodes以最佳至上的方式生成树。最佳节点定义为杂质impurity的相对减少。如果为None,则叶节点数不受限制。

  • warm_start :bool,default=False
    设置True为时,重用上一个调用的解决方案以适应并在集合中添加更多estimators,否则,只需擦除之前的解决方案即可。

  • validation_fraction:float,default=0.1
    预留的训练数据比例作为earlystopping的验证集。必须在0到1之间。仅当n_iter_no_change设置为整数时使用。

  • n_iter_no_change: int, default=None
    n_iter_no_change用于确定在验证分数没有改善时是否将使用早期停止来终止训练。默认情况下,将其设置为“None”以禁用early stopping。如果设置为数字,则它将保留validation_fraction训练数据的大小作为验证,并在以前的所有n_iter_no_change迭代次数中验证得分均未提高时终止训练。

  • tol: float,default= 1e-4
    early stopping的容忍度。当损失至少不能改善n_iter_no_change迭代次数(如果设置为数字)时,训练将停止。

  • ccp_alpha:non-negative float, default=0.0
    用于Minimal Cost-Complexity Pruning的Complexity parameter。具有最大成本复杂度的子树小于ccp_alpha所选择的子树 。默认情况下,不执行修剪。

GradientBoostingClassifier参数

https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingClassifier.html?highlight=gra#sklearn.ensemble.GradientBoostingClassifier

from sklearn.ensemble import GradientBoostingClassifier
  • loss:{‘deviance’, ‘exponential’}, default=’deviance’
    待优化的损失函数。 “deviance”是指对具有概率输出进行分类的deviance (= logistic regression) 。 对于损失‘exponential’ gradient boosting可恢复AdaBoost算法。
  • 没有alpha参数,其他的都与GradientBoostingRegressor参数一致
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值