boosting方法有多种,有gbm类和adaboost类。
1、gradient boosting
包括gbdt、xgboost、lightGBM。boosting tree的优化不能直接用SGD,因此是累加性的训练(additive training)
几个概念:
残差:真实值-预测值;只有当损失函数为均方误差时,负梯度等于残差,对于更一般的损失函数来说,负梯度不等于残差。
那么,为什么使用负梯度而不是残差?
原因1:负梯度受异常点的影响更小!(negative gradient vs residual:http://www.ccs.neu.edu/home/vip/teach/MLcourse/4_boosting/slides/gradient_boosting.pdf)
gbdt
gbdt的基函数是CART回归树;
前提:定义目标函数,也就是损失函数,,然后最小化loss;
训练过程:
在第i+1轮:
1、已有多个基函数,记为,
2、第i+1个基函数去拟合 loss 在的一阶导(注1)(也就是残差)(这里是SGD的思想): ~ *
3、具体单颗树的拟合:CART回归树,最优分裂点的选择:使得损失函数最小;回归问题中一般是均方误差,分类问题一般使用指数损失、信息增益(熵)或gini指数作为比较标准。
lr既是学习速率,也是每棵树的权重(除了第一棵树,第一颗的权重是1);
xgboost
参考:https://blog.csdn.net/u012332571/article/details/62883168
跟gbdt区别在于:首先说明,xgboost的优化点很多,包含目标函数、基础学习器、优化算法、实现等等方面;但是各方面都跟目标函数的改写有关。
目标函数:
1、多了正则项,,其中是正则项;
2、损失函数换成对应的二阶泰勒展开式形式,优势:比gbdt的一阶导更精确,会更快收敛;(题外话,前提是损失函数二阶可导,所以神经网络就不适合加二阶导);
3、二阶导在每棵树寻找最有分裂点时作为样本系数;
注意泰勒展开的第一个常数项被合并了带权重的分位数寻找算法:weighted quantile sketch
参考:https://www.jianshu.com/p/22b82127644a
1、quantile分位数的含义:10分位数,即将样本按特征值从小到大排序,再找出9个分裂点,将样本平均的分成10份;分位点数量是一个超参数,可以调(类似于gbdt里面bin的设置)。
2、带权重的:每个样本的权重为样本对应的二阶导。
稀疏特征的处理:
对于稀疏特征,在寻找分裂点的时候,先不考虑缺失值的样本,进行划分,然后分别将缺失值样本放在左边和放在右边,去计算目标函数的提升,从而决定缺失值样本的默认分支。
问题:文中列举了导致稀疏的原因,有特征缺失、大量的0值、one-hot编码,个人感觉0值和one-hot编码不能这样处理,这种0值是有意义的。
2、Adaboost
adaboost的核心点在于:
1、每个样本会有不同的权重,被错误分类样本的权重会被调大,然后训练下一个基分类器;
2、每个基分类器的权重根据其误差率进行设置,并且误差率的计算考虑了样本的权重;
注1:梯度作为
http://www.ccs.neu.edu/home/vip/teach/MLcourse/4_boosting/slides/gradient_boosting.pdf
网友评论