GBDT算法梳理

1、前向分布算法

加法模型

加法模型公式:html

f(x)=\sum _{ m=1 }^{ M }{ { \beta  }_{ m } } b(x;{ \gamma  }_{ m }

其中,b为基函数,\gamma为基函数参数,\beta为基函数系数, 表示该项函数在加法模型中的重要性node

前向分步算法

在给定训练数据和损失函数L(y,f(x))的条件下,学习加法模型成为经验风险极小化 (即损失函数极小化问题)  算法

即最小化每一步生成的基函数之和。 前向分步算法求解这一优化问题的想法是:因为学习的是加法模型,若是能从前向后每一步只学习一个基函数及其系数,逐步逼近优化目标函数式。那么能够简化算法复杂度,优化每一步的基分类器。 即每次只优化当前的基分类器,使其损失函数最小。
《统计学习方法》
《统计学习方法》
这样,前向分布算法将同时求解从m=1到M的全部参数的优化问题简化为逐次求解各个基分类器对应的参数问题。

负梯度拟合

大牛 Freidman 提出了用损失函数的负梯度来拟合本轮损失的近似值,进而拟合一个 CART 回归树。第 t 轮的第 i 个样本的损失函数的负梯度表示为: dom

利用 (x_i,r_{ti})(i=1,2,..m) 咱们能够拟合一颗 CART 回归树,获得了第 t 颗回归树,其对应的叶节点区域 R_{tj},j=1,2,...,J. 其中 J 为叶子节点的个数。   针对每个叶子节点里的样本,咱们求出使损失函数最小,也就是拟合叶子节点最好的的输出值 c_{tj} 以下:
  这样咱们就获得了本轮的决策树拟合函数以下:

h_t(x)=\sum\limits_{j=1}^{J}c_{tj}I(x \in R_{tj})

  从而本轮最终获得的强学习器的表达式以下:机器学习

f_{t}(x)=f_{t-1}(x)+\sum\limits_{j=1}^{J}c_{tj}I(x\in R_{tj})

  经过损失函数的负梯度来拟合,咱们找到了一种通用的拟合损失偏差的办法,这样无轮是分类问题仍是回归问题,咱们经过其损失函数的负梯度的拟合,就能够用 GBDT 来解决咱们的分类回归问题。区别仅仅在于损失函数不一样致使的负梯度不一样而已。函数

损失函数

不一样问题对应的损失函数不一样,这篇博客作了一个很好的总结。后续对应不一样的问题会有不一样的损失函数。 梯度提高树 (GBDT) 原理小结学习

回归

二分类,多分类

二元 GBDT 分类算法

对于二元 GBDT,若是用相似于逻辑回归的对数似然损失函数,则损失函数为:优化

L(y, f(x)) = log(1+ exp(-yf(x)))

其中 y \in{-1, +1}。则此时的负梯度偏差为 spa

对于生成的决策树,咱们各个叶子节点的最佳负梯度拟合值为
因为上式比较难优化,咱们通常使用近似值代替

c_{tj}=\sum\limits_{x_i \in R_{tj}}r_{ti}\bigg / \sum\limits_{x_i \in R_{tj}}|r_{ti}|(1-|r_{ti}|)

除了负梯度计算和叶子节点的最佳负梯度拟合的线性搜索,二元 GBDT 分类和 GBDT 回归算法过程相同。.net

多元 GBDT 分类算法

多元 GBDT 要比二元 GBDT 复杂一些,对应的是多元逻辑回归和二元逻辑回归的复杂度差异。假设类别数为 K,则此时咱们的对数似然损失函数为:

L(y, f(x)) = - \sum\limits_{k=1}^{K}y_klogp_k(x)

其中若是样本输出类别为 k,则 y_k=1。第 k 类的几率 p_k(x) 的表达式为:

p_k(x) = exp(f_k(x)) \bigg / \sum\limits_{l=1}^{K}exp(f_l(x))

集合上两式,咱们能够计算出第 t 轮的第 i 个样本对应类别 l 的负梯度偏差为

观察上式能够看出,其实这里的偏差就是样本 i 对应类别 l 的真实几率和 t-1 轮预测几率的差值。 对于生成的决策树,咱们各个叶子节点的最佳负梯度拟合值为
上式比较难优化,咱们可使用近似值代替

c_{tj} = \frac{K-1}{K} \quad \frac{\sum\limits_{x_i \in R_{tjl}}r_{til}}{\sum\limits_{x_i \in R_{til}}|r_{til}|(1-|r_{til}|)}

除了负梯度计算和叶子节点的最佳负梯度拟合的线性搜索,多元 GBDT 分类和二元 GBDT 分类以及 GBDT 回归算法过程相同。

正则化

和 Adaboost 同样,咱们也须要对 GBDT 进行正则化,防止过拟合。GBDT 的正则化主要有三种方式。

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

f_{k}(x) = f_{k-1}(x) + h_k(x)

若是咱们加上了正则化项,则有

f_{k}(x) = f_{k-1}(x) + \nu h_k(x)

\nu 的取值范围为 0\le \nu \le 1。对于一样的训练集学习效果,较小的 \nu 意味着咱们须要更多的弱学习器的迭代次数。一般咱们用步长和迭代最大次数一块儿来决定算法的拟合效果。

• 第二种正则化的方式是经过子采样比例(subsample)。取值为 (0,1]。注意这里的子采样和随机森林不同,随机森林使用的是放回抽样,而这里是不放回抽样。若是取值为 1,则所有样本都使用,等于没有使用子采样。若是取值小于 1,则只有一部分样本会去作 GBDT 的决策树拟合。选择小于 1 的比例能够减小方差,即防止过拟合,可是会增长样本拟合的误差,所以取值不能过低。推荐在0.5, 0.8 之间。 使用了子采样的 GBDT 有时也称做随机梯度提高树(Stochastic Gradient Boosting Tree, SGBT)。因为使用了子采样,程序能够经过采样分发到不一样的任务去作 boosting 的迭代过程,最后造成新树,从而减小弱学习器难以并行学习的弱点。

• 第三种是对于弱学习器即 CART 回归树进行正则化剪枝。

优缺点

优势

  • 能够灵活处理各类类型的数据,包括连续值和离散值。
  • 在相对少的调参时间状况下,预测的准确率也能够比较高。这个是相对 SVM 来讲的。
  • 使用一些健壮的损失函数,对异常值的鲁棒性很是强。好比 Huber 损失函数和 Quantile 损失函数。

缺点

  • 因为弱学习器之间存在依赖关系,难以并行训练数据。不过能够经过自采样的 SGBT 来达到部分并行。

sklearn参数

class sklearn.ensemble.GradientBoostingClassifier(loss='deviance', learning_rate=0.1, n_estimators=100, subsample=1.0, criterion='friedman_mse', min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_depth=3, min_impurity_decrease=0.0, min_impurity_split=None, init=None, random_state=None, max_features=None, verbose=0, max_leaf_nodes=None, warm_start=False, presort='auto', validation_fraction=0.1, n_iter_no_change=None, tol=0.0001)[source]¶
复制代码

几个主要参数:

  • loss : {‘deviance’, ‘exponential’}, optional (default=’deviance’) loss function to be optimized. ‘deviance’ refers to deviance (= logistic regression) for classification with probabilistic outputs. For loss ‘exponential’ gradient boosting recovers the AdaBoost algorithm. 损失函数
  • learning_rate: 学习率
  • n_estimators: int (default=100)弱学习器的个数

应用场景

因为缺少这方面的经验,故此部分不做赘述。 查到了一篇文章: GBDT 入门教程之原理、所解决的问题、应用场景讲解


参考

  1.  【机器学习】集成学习 (三)---- 前向分步算法、提高树与 GBDT
  2. GBDT 算法详解
相关文章
相关标签/搜索