林轩田之机器学习课程笔记( combining predictive features之gradient boosted decision tree)(32之27)

欢迎转载,可以关注博客:http://blog.csdn.net/cqy_chen
对于模型融合可以参考:
http://scikit-learn.org/stable/modules/ensemble.html
GBDT参考:
http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingClassifier.html#sklearn.ensemble.GradientBoostingClassifier
http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingRegressor.html#sklearn.ensemble.GradientBoostingRegressor
XGB参考:
http://xgboost.readthedocs.io/en/latest/
题目可能不全,因为有字数限制,不好意思,可以参考:
https://www.csie.ntu.edu.tw/~htlin/course/ml15fall/

概要

本节主要讲解GBDT(gradient boosted decision tree),中文翻译叫做梯度下降增强决策树。上节讲解了随机森林,通过bagging 的方式组合树。得到的结果还不错。本节将Adaboost+决策树进行组合。

Adaptive Boost 决策树

首先对比下bagging决策树和Adaboost的流程如下:
这里写图片描述
对于随机森林我们知道,就是随机的提取样本,随机的抽取特征达到数据的差异性,从而得到不一样的模型。
而Adaboost算法则是通过同样一批数据,给予不同的权重,达到数据的差异性,从而达到不一样的模型。

那么在AdaBoost算法中,就必须要使得基本模型能够训练带有权重的数据,那么决策树如何训练带有权重的数据呢?
首先看看常规化的做法:

Euin=1Nn=1Nunerr(yn,h(xn))

我们是在损失函数中,添加了权重。比如在soft-margin的SVM中,我们限定了系数的范围。
但是在决策树中呢?在进行划分的时候需要考虑权重,同时在叶子节点也是需要考虑权重。这样在很多地方都需要考虑,这将会导致很大的麻烦。
能不能采用另外的办法,比如讲权重设置成分布,通过分布抽样的方式?
这里写图片描述

所以在bagging中,我们是通过拔靴法抽样得到数据,其实还是在资料中添加了权重。而在AdaBoost 决策树中呢,因为每次迭代需要调整样本权重,那么不是直接在损失函数中修改,而是通过抽样的方式使得抽取到的数据服从权重的分布。

这采用树还有个问题,在Adaboost算法中,我们知道

αn=1ϵnϵn

如果给决策树的资料都不一样,会导致完全生成的树误差为0。就是 ϵn=0 . αn=+ 。所有我们需要限定树不要做得太好,怎么办呢?正则化啊,限定树的高度,叶子节点,等方法。
如果决策树的高度为1,就成了决策树桩。
这里写图片描述

如果采用决策树桩,则一般会将权重添加到资料中,而不是通过采样,因为这个很简单。而一般的树则通过采样。

如何优化AdaBoost决策树

在AdaBoost算法中,二分类情况下:

(1)t=1ϵtϵt(2)at=log(t)<======>t=eat(3)ut+1n={utntutntut+1n=utntyngt(xn)=utneynangt(xn)

我们将公式(3)调整如下:
ut+1n=u1t=1Teynangt(xn)=1NeynTt=1atgt(xn)

所以我们看到在每笔资料进行权重更新的时候,可以是进行一个连乘,最后变成累加求指数的操作。
这里特别用红色标记起来。这个就是:
G(x)=sign(t=1Tatgt(xn))

我们把红色部分称之为投票分数,就是说每一轮迭代需要的样本权重是前面生成的基础模型的投票分数相关。

这里写图片描述
其实我们看到这个投票分数和SVM一样也是算一个距离。当然希望这个距越大越好。
这样就会导致,权重逐渐减小。对比0/1的分类错误情况如下:
这里写图片描述
所以AdaBoost的损失函数也可以看做是0/1的一个上限,其实前面都介绍过SVM,逻辑回归,线性回归,等都是这个的上限。
所以这里可以将每轮迭代后产生的权重之和作为AdaBoost的损失函数写作:

n=1NuT+1n=1Nn=1NeynTt=1atgt(xn)

所以我们的目的其实就是在下一轮找到一个函数使得这个式子达到最小,采用泰勒展开式:
minhE^ada=1Nn=1Neyn(T1t=1atgt(xn)+ηh(xn)=n1Nutn eynηh(xn)n1Nutn(1ynηh(xn))=n1Nutnηn1Nutnh(xn)

回想下在梯度下降采用的公式:
这里写图片描述
所以要想使得我们的Ada的损失函数最小,即是要得到一个函数使得如下式子越小越好:
ηn1Nutnh(xn)

对于一个二分类的情况如下:
这里写图片描述
所以我们找到一个函数 gt=h 使得最后的损失函数越来越小。这样求解损失函数是米有什么问题的,可以使得AdaBost算法的 Ein 变小。

那么现在的问题是如何求得这个步长。写不动了,贴图
这里写图片描述
所以最后求出导数得到的步长就是 αt=ln1ϵtϵt

所以这里也证明了为什么在adaboost 中是选用的这个步长了。
参考:http://blog.csdn.net/cqy_chen/article/details/78948634
当时只是写了该做怎么做。

GBDT

上面是采用了二分类的情况做的损失函数:

argminη,h1Nn=1Neyn(T1t=1atgt(xn)+ηh(xn))

如果我们的损失函数不在是进行二分类,比如做回归,采用其他函数:
argminη,h1Nn=1Nerr(yn,(t=1T1atgt(xn)+ηh(xn)))

所以在这个架构下,可以实现自己的损失函数,求出每一轮的基本函数以及相关步长。我们可以先固定参数求出基本函数,然后固定函数求出固定参数。
假如采用误差为: (sy)2 就是计算得到的分数和实际值的平方和。
在我们采用梯度下降的方法中,是怎么计算的呢?是一步的泰勒展开式,后面会介绍XGB,采用了两步的泰勒展开。
上面式子展开, (sy)2 ,令 sn=err(yn,T1t=1atgt(xn))
=1Nn=1Nerr(yn,(t=1T1atgt(xn)+ηh(xn)))=1Nn=1Nerr(yn,t=1T1atgt(xn))+1Nn=1Nynηh(xn)errss=sn=+ηNn=1Nh(xn)2(snyn)

ok优化到了这一步我们需要这个确定这个函数 h(x) 以及步长,在我们做梯度下降中,通常将梯度下降的方向定为1,这样再通过限定步长进行调节。在这里也可以限定|h(x)|=1,不过这样比价麻烦。
我们这里采用拉格朗日乘子的方式。
=+ηNn=1Nh(xn)2(snyn)=+ηNn=1N(h(xn)2(snyn)+(h(xn))2)=+ηNn=1N(+(h(xn)(ynsn))2)

所以要求得最佳的函数不就是让红色的部分为0吗?
h(x)=ys

所以在平方误差的情况下,我们的梯度下降的函数是余数。但是在其他的损失函数下就不是余数了,切记。因为有的时候,我们需要根据要求调整损失函数
求得函数方向后,下面就是要求得步长。
在梯度函数确定之后,得到:
minη1Nn=1N(sn+ηg(t)yn)2=1Nn=1N((ynsn)ηg(t)2

这个可以看做是将余数作为目标,将转换函数看做特征映射,进行回归求解。
这里写图片描述
当我们采用树的模型,通常是cart树进行回归的求解。这样的算法就称之为GBDT。
关于演示大家可以参考李航博士的《统计学习方法》

模型融合的总结

首先模型融合有三种方式:
1)投票方式,这种方式得到bagging的方法
2)线性的blending,这种方式代表AdaBoost算法
3)非线性blending,这种方式代表是决策树

bagging+决策树=随机森林
AdaBoost+弱弱的决策树
gradient boosted+决策树=GBDT=====》优化后得到XGBoost

如下图常用的算法:
这里写图片描述

在做模型融合的时候一方面可以看做是做特征转换,如决策树。同时也可以看做是防止过拟合,如随机森林。所以模型融合要知道每种融合的道理,以及基本模型的特性。

欢迎转载,可以关注博客:http://blog.csdn.net/cqy_chen

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值