方法 = 模型 + 策略 + 算法
一、提升树模型(Boosting Tree)
Boosting方法的一种,区别在于基函数
提升树算法是AdaBoost算法的特殊情况(二分类问题,将基分类器限制为二分类树)
1.模型:加法模型,其中基函数为DTree(分类、回归),是只能用CART吗???
2.策略:损失函数(回归问题:平方误差;分类问题:指数损失;一般损失函数)
3.算法:前向分布算法
二、GBDT
针对的是一般的损失函数的优化(更一般的提升树)
1.模型:加法模型
2.策略:一般的损失函数
3.算法:前向分步算法
下面简单推导一下,为什么每一轮生成的树拟合的的是负梯度,不做严格证明:
对于一般的损失函数,我们的优化算法一般是:梯度下降法、牛顿迭代法。以梯度下降法为例:
即想要得到找到x,使得目标函数达到最小。而此时f(x) (即基函数的线性组合)视为 x,相当于泛函的思想,目标是找到f(x)使得损失函数达到最小。则有如下的:知乎:回归树拟合负梯度
而在XGBoost中,区别在于从梯度下降法那里开始,用的是牛顿迭代法。
这样的思想与前向分步算法也没有冲突:每一轮都生成一棵新的树。
而每一轮的树都是在拟合负梯度,为什么又说每一轮生成的树都是在拟合残差呢?
1.当损失函数为平方损失(针对回归问题),可以推导出此时残差就等于负梯度,而对于其他损失函数则是负梯度只是残差的近似值。
2.(自己的想法)这个问题等价于为什么负梯度能够作为残差的近似值?从梯度下降法的推导过程来看,根据Taylor公式可以得到:
第一项可以看做,对于yi,存在x+▲x,使得f(x+▲x)=yi,则等号左边相当于残差,而右边相当于梯度乘以▲x,一般▲x很小,所以说能够作为残差的近似值。
Q1:对于GBDT做分类和回归问题?
1.对于回归问题:损失函数用的是平方误差
每一步的树都是用来拟合残差,每一轮只需要确定出那棵树即可,就转化为如何求解CART回归树
求解CART回归树:每一步遍历各个特征值的各个取值,根据值得到一个划分,得到每一分类的预测值,计算出损失。利用贪心策略,得到损失最小的特征及其划分值,每一步达到局部最优。
2.对于分类问题??
损失函数用的是负二项对数,这是怎么求导出一阶导?这么复杂?
我的项目是如何做分类问题的,明明输入的是0-1,如何求出概率的?
Q2:与其他算法的区别?
Q3:如何处理特征,适用场景,优缺点?
二、XGBoost
基于GBDT的改进
1.模型:加法模型
2.策略:一般损失函数
3.算法:前向分步算法
主要是利用牛顿迭代法(收敛速度快)思想(不按照牛顿法的步骤来操作??)对损失函数进行二阶Taylor展开。
目标函数:损失函数 + 正则化项
接下来的问题就是,如何根据求出每一轮的新树(此时损失函数中除了新树,其他都是已知的,先不要管一阶导、二阶导如何求解)?
按照一般的想法就是:贪心法 + 最优特征及其特征值 + 损失函数最小
显然最棘手的就是损失函数这一步,太抽象了,所以还要进一步化简损失函数,变成”树的样子“(GBDT是怎么变成树的样子??):
这样的话,已知了特征及其取值,就可以得到预测值,计算出损失,求得每一次分裂的最优特征和值,逐步求得新树。
(话说一阶导、二阶导怎么求?)
面试的一些问题:
Q1:XGBoost算法特点
Q2:与GBDT的对比
Q3:调参,适用场景,适用数据
三、LightGBM
XGBoost的升级版,Light在大规模数据集上运行效率更高,GBM表示Gradient Boosting Machine。只需要关注两点:1.改进了XGB的哪些地方;2.如何加速(1、2 相互解释)
动机:
GBDT是否可以使用mini-batch方式训练,使得训练数据的大小不会受到内存限制,解决GBDT在海量数据遇到的问题。(因为GBDT在每次迭代的时候,都需要遍历整个训练数据多次。若把整个训练数据装进内存则会限制训练数据的大小;若不装进内存,反复读写训练数据又会消耗非常大的时间。不能满足工业级海量的数据)
Q1:LGB 对比 XGBoost
(如何自动处理缺失值?分类特征?)
1.改进了XGB哪些地方?
先来看看XGB有哪些地方慢,即复杂度高
主要减少的是每片叶子生成的复杂度
1)Histogram
2) GOSS算法
一些常见面试题