GBDT、随机森林(RF)、Xgboost、LightGBM

1.CART树

损失函数参考上一章

算法流程:

Step1:对于数据集D,遍历所有特色,依据Gini(D,A)找到A,用A对D进行划分

Step2:反复步骤1,为每个节点找寻到最佳特色直到:1)节点样本数小于阈值2)Gini(D,A)小于阈值3)没有更多的特征值

2.随机森林(bagging)

初始化:决策树的个数n,每个决策树里每次决裂所选取的特色个数k,$k = {\log _2}n$

森林函数:$f(x) = \frac{1}{n}\sum\limits_i^n {{\varphi _i}(x)}$

算法流程:

Step1:从原始数据集中有放回的抽n次,每次m个样本

Step2:$k = {\log _2}n$,对每一组m个数据进行训练CART树,特色是从原始特色中随机抉择k个

Setp3:每个树决裂上来,直到进行条件(参考CART树)

3.AdaBoost(Boosting

AdaBoost是boosting的想法,由一个弱学习器一直学习失去强学习器。AdaBoost次要增大了被分错样本的权重,扭转的是样本的权重。

算法流程:

Input:训练数据集$T = \{ ({x_1},{y_1}),({x_2},{y_2}),...,({x_N},{y_N})\}$

Output: 最终的分类器$G(x)$

1.初始化样本权重${D_0} = ({w_{0,1}},{w_{0,2}},...,{w_{0,N}})$

2.对设置要训练的M棵树(学习器)

  • 应用${D_m}$的权重样本数据进行训练,失去一个分类器${G_m}(x)$
  • 依据${G_m}(x)$计算分类误差:${e_m} = \sum\limits_{i = 1}^N {{w_{mi}}} I({G_m}({x_i}) \ne {y_i})$
  • 计算${G_m}(x)$的系数:${\alpha _m} = \frac{1}{2}\log \frac{{1 - {e_m}}}{{{e_m}}}$
  • 更新训练样本的权重:

$$\begin{array}{l}{D_m} = ({w_{m,1}},{w_{m,2}},...,{w_{m,N}})\\{w_{m,i}} = \frac{{{w_{m - 1,i}}}}{{{z_m}}}\exp ( - {\alpha _m}{y_i}{G_m}({x_i}))\end{array}$$

  • 构建最终分类器的线性组合:

$$G(x) = sign(\sum\limits_{m = 1}^M {{\alpha _m}{G_m}(x)} )$$

其中权重有以下特点:

  • ${e_m}$越小,${\alpha _m}$越大
  • 分类谬误的${w_{m,i}}$ > 分类正确的${w_{m,i}}$

4.GBDT(Gradient Boost Decision Tree)梯度晋升树

GBDT是以回归树为基学习器的算法,采纳Boosting思维。GBDT的外围在于:每一棵树学的都是之前所有树叠加后的残差。利用损失函数的负梯度在以后模型的值作为回归树的残差近似值。

算法流程:

Input:训练数据集$T = \{ ({x_1},{y_1}),({x_2},{y_2}),...,({x_N},{y_N})\}$

Output:回归树$\widehat f(x)$

1.初始化:${f_0}(x) = \mathop {\arg \min }\limits_c \sum\limits_{i = 1}^N {L({y_i},c)}$

2.对设置M棵树m=1,2,...,M:

  • 对i=1,2,...,N个样本,计算:${r_{mi}} = - {\left[ {\frac{{\partial L({y_i},f({x_i}))}}{{\partial f({x_i})}}} \right]_{f(x) = {f_{m - 1}}(x)}}$
  • 对${r_{mi}}$拟合一棵回归树,失去第m棵树的结点最优区域${R_{mj}},j = 1,2,...,J$。这个J是J个类别(分类树),叶子节点个数,能够了解为y的值个数(回归树)
  • 求解最优j区域(特色)的阈值,计算${C_{mj}} = \min \sum\limits_{{x_i} \in {R_{mj}}} {L({y_i},{f_{m - 1}}({x_i}) + c)}$
  • 更新${f_m}(x) = {f_{m - 1}}(x) + \sum\limits_{j = 1}^J {{C_{mj}}I(x \in {R_{mj}})}$

3.失去回归树:${f_m}(x) = \sum\limits_{m = 1}^M {\sum\limits_{j = 1}^J {{C_{mj}}I(x \in {R_{mj}})} }$

这里须要提一点,如果设置树的深度为5,每次2决裂,那么J=10个叶子节点。有J个叶子节点就有J个判断条件

5.Xgboost

GBDT的升级版,从下面GBDT的算法流程中能够看出在负梯度中是一阶导数,并且在求解Cmj的时候是一个线性搜寻,Xgboost把Rmj和Cmj合在一起求解,并且在损失函数中退出正则项

算法流程:

Input:训练数据集$T = \{ ({x_1},{y_1}),({x_2},{y_2}),...,({x_N},{y_N})\}$

Output:回归树$\widehat f(x)$

1.初始化:${f_0}(x) = \mathop {\arg \min }\limits_c \sum\limits_{i = 1}^N {L({y_i},c)}$

2.对设置M棵树m=1,2,...,M:

  • 对i=1,2,...,N个样本,计算一阶导数合${G_t} = \sum\limits_{i = 1}^N {{g_{ti}}} $以及二阶导数合${H_t} = \sum\limits_{i = 1}^N {{h_{ti}}} $,其中:

$$\begin{array}{l}{g_{ti}} = \frac{{\partial L({y_i},{f_{t - 1}}({x_i}))}}{{\partial {f_{t - 1}}({x_i})}},{h_{ti}} = \frac{{{\partial ^2}L({y_i},{f_{t - 1}}({x_i}))}}{{\partial {f_{t - 1}}^2({x_i})}}\end{array}$$

  • 求解最优j=1,2,...,J区域(特色)以及区域j阈值,依据${G_{tj}} = \sum\limits_{xi \in {R_{tj}}}^{} {{g_{ti}}} ,{H_{tj}} = \sum\limits_{xi \in {R_{tj}}}^{} {{h_{ti}}}$,求解叶子节点最优解:${\omega _{tj}} = - \frac{{{G_{tj}}}}{{{H_{tj}} + \lambda }}$,这个相似于GBDT的区域求解。
  • 对于k=1,2,...,K个特色,每个k特色线性划分不同阈值进行线性搜寻。初始化${\rm{score = 0}},{G_L} = 0,{G_R} = 0$,对每个i样本,求左右树的一阶导数合二阶导数:

$$\begin{array}{l}{G_L} = {G_L} + {g_{ti}},{G_R} = G - {G_L}\\{H_L} = {H_L} + {h_{ti}},{H_R} = H - {H_L}\end{array}$$

  • 计算$score = \max (score,\frac{1}{2}(\frac{{G_L^2}}{{{H_L} + \lambda }} + \frac{{G_R^2}}{{{H_R} + \lambda }} - \frac{{{{({G_L} + {G_R})}^2}}}{{{H_L} + {H_R} + \lambda }}) - \gamma )$

3.基于最大的score进行决裂
4.失去回归树:${f_m}(x) = \sum\limits_{m = 1}^M {\sum\limits_{j = 1}^J {{C_{mj}}I(x \in {R_{mj}})} }$

参考https://ranmaosong.github.io/...

6.LightGBM

具体算法参见https://zhuanlan.zhihu.com/p/...
优化点:

  • 特色对不同取值进行直方图分bin
  • 带深度限度的叶子节点决裂,Xgboost在决裂叶子节点时候是对同一层的所有叶子节点无差别决裂,权重雷同。这个是不适合的,因为每个叶子节点的决裂增益各不相同。ligtgbm对每一层只找到决裂增益最大的一个叶子节点进行决裂。
  • 对每个样本进行权重加成
  • 稠密特色合并。

这里比拟下GBDT合Xgboost的10个区别:

  • GBDT是机器学习算法,Xgboost是工程实现
  • Xgboost退出了正则项来避免过拟合
  • Xgboost采纳一阶和二阶泰勒开展损失函数
  • Xgboost反对多种基学习器
  • Xgboost对缺失值进行了解决
  • Xgboost退出了Shrinkage(缩减),每棵树乘上一个学习率,这样的话能够多学习几轮。
  • Xgboost反对叶子节点决裂的并行操作。
  • Xgboost采纳贪婪算法,也就是对每次决裂都是最大增益,而不是一个总的最小损失函数
  • Xgboost对特色当时排序了
  • Xgboost反对列抽样,参考随机森林的特色抽样