集成学习算法梳理——GBDT

文章目录

  • GBDT概述
  • 前向分步算法
  • 损失函数
    • 负梯度拟合
    • 损失函数
  • 分类算法
  • 正则化
  • 优缺点
    • 优点
    • 缺点
  • sklearn API
    • sklearn.ensemble.GradientBoostingClassifier()
  • 应用场景
  • 参考资料

GBDT概述

GBDT(Gradient Boosting Decision Tree, 梯度提升决策树)不仅可以用于分类问题,还可以用于回归问题,GBDT的核心思想在于,每一棵树学习的是之前所有树的整体预测和标签的误差,这里称之为残差. 即给定A的真实年龄为18,第一棵树预测的年龄是12岁,那么第二棵树预测的目标应当是6岁(18-12)…

GBDT中的所有的树都是CART回归树,而不是分类树.

前向分步算法

对于加法模型
f ( x ) = ∑ m = 1 M β m b ( x ; γ m ) f(x)=\sum_{m=1}^M\beta_mb(x;\gamma_m) f(x)=m=1Mβmb(x;γm)
其中 b ( x ; γ m ) b(x;\gamma_m) b(x;γm)为基函数, γ m \gamma_m γm为基函数的参数, β m \beta_m βm为基函数的系数.
在给定训练数据及损失函数的条件下,学习加法模型 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}^NL\Big(y_i,\sum_{m=1}^M\beta_mb(x_i;\gamma_m)) β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}^NL(y_i,\beta b(x_i;\gamma)) β,γmini=1NL(yi,βb(xi;γ))
算法

输入
训练数据集T,损失函数 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 m=1,2\dots,M m=1,2,M
    1. 极小化损失函数
      ( β m , γ m ) = a r g min ⁡ β , γ ∑ i = 1 N L ( y i , f m − 1 ( x i ) + β b ( x i ; γ ) ) (\beta_m,\gamma_m)=arg \min_{\beta,\gamma}\sum_{i=1}^NL(y_i,f_{m-1}(x_i)+\beta b(x_i;\gamma)) (βm,γm)=argβ,γmini=1NL(yi,fm1(xi)+βb(xi;γ))
      得到其参数 β m , γ m \beta_m,\gamma_m βm,γm

    2. 更新
      f m ( x ) = f m − 1 ( x ) + β m b ( x ; γ m ) f_m(x) = f_{m-1}(x) + \beta_mb(x;\gamma_m) fm(x)=fm1(x)+βmb(x;γm)

  3. 得到加法模型
    f ( x ) = f M ( x ) = ∑ m = 1 M β m b ( x ; γ m ) f(x) = f_M(x) = \sum_{m=1}^M\beta_mb(x;\gamma_m) f(x)=fM(x)=m=1Mβmb(x;γm)

这样就将同时求解从 m = 1 m=1 m=1到M所有参数 β m , γ m \beta_m,\gamma_m βm,γm的优化问题简化为逐次求解各个 β m , γ m \beta_m,\gamma_m βm,γm的优化问题.

损失函数

负梯度拟合

利用损失函数的负梯度来作为残差的估计值. 当损失函数为平方误差损失函数时,负梯度就是残差,对于一般的损失函数,它则是残差的近似值.

损失函数

对于分类问题,常用的损失函数为logloss.

对于回归问题,常用的损失函数为MSE、MAE.

分类算法

  1. 损失函数采用指数损失函数
  2. 损失函数采用对数似然损失函数

正则化

  1. Early Stop
  2. subsample
  3. 弱分类器剪枝

优缺点

优点

  1. 可以灵活处理各种类型的数据,包括连续值和离散值.
  2. 在相对少的调参时间情况下,预测的准确率也可以比较高。这个是相对SVM来说的.
  3. 使用一些健壮的损失函数,对异常值的鲁棒性非常强。比如Huber损失函数和Quantile损失函数.

缺点

同Adaboost一样,由于是boosting算法,很难并行加速.

sklearn API

sklearn.ensemble.GradientBoostingClassifier()

参数 类型 默认值 作用
loss {‘deviance’, ‘exponential’} ‘deviance’ 损失函数
learning_rate float 0.1 学习率,即每个学习器的权重
n_estimators int 100 树的棵树
criterion str ‘friedman_mse’ 分裂算法
max_depth int or None None 决策树最大深度
n_iter_no_change int or None None 早停轮数
tol float 1e-4 早停阈值
validation_fraction float 0.1 早停验证比例
min_samples_split int or float 2 分裂时最小样本数
min_samples_leaf int or float 1 叶节点最小样本数
min_weight_fraction_leaf float 0 叶节点最小样本权重总值
max_features int float str None ‘auto’ 切分时最大的特征数量
max_leaf_nodes int or None None 最大叶节点个数
min_impurity_decrease float 0. 切分点不纯度最小减少程度,若节点不纯度小于该值,则被移除
random_state int or None None 随机种子
verbose int 0 日志输出间隔
warm_start boolean False 是否热启动,对上一个模型采用追加的方式

应用场景

回归问题和分类问题都可.

参考资料

梯度提升树(GBDT)原理小结-刘建平Pinard

你可能感兴趣的:(机器学习)