futurehau

导航

 
随机森林的Dtree是强分类器,而ABDT、GBDT的决策树是弱分类器。
ABDT GBDT的本质区别在于:损失函数不同,ABDT的损失函数是指数函数,GBDT做回归的损失函数是平方损失。min(eita) min(h)sigma n = 1,...,N err(sigma tao = 1,..., t - 1 alpha tao * g tao xn + eita h(xn), yn)
GBDT对弱分类器的要求是足够简单,并且是低方差variance和高偏差bias的,训练过程是不断降低偏差来提高精度。(高偏差,欠拟合),弱分类器一般选择cart,深度不会很深。
GBDT的GB体现在:让损失函数沿着梯度下降的方向,gbdt每轮迭代的时候,都回去拟合损失函数在当前模型下的负梯度。这样每轮训练的时候,能够让损失函数尽快减小。



  

 

Adaptive Boosted Decision Tree

由Random Forest引入Decision Tree:

Random Forest就是bagging + DTree(加上Random特征的操作)

那么很容易延伸到Ada Boost DTree。

但是有一个需要注意的问题就是我们每次喂给Dtree的资料不在是权值都相同的,

而是有一个权重u,为了不改变原始的DTee算法,这里需要特殊的处理一下。

DTree搭配Ada Boost的话,有权重,我们怎么让DTree知道有权重的信息呢?

当然一种方法是找到Ein,然后看看哪里可以加入权重。

但是Dtree一般还加入了许多特别的Tricks,所以摊开来看Ein,可能比较麻烦。

所以这里把原来的演算法当做黑盒子,对输入的资料做一些手脚,以达到Weight的效果。

所以可能根据得到的权重,首先做一个sampling,得到一组新的资料,资料里每种的比例可能就和权重差不多,

这样就包含了权重的信息。

AdaBoost的时候,最后每个g有一个权重,线性组合得到最后的G。但是在ABDT中存在一个问题:

如果是完全资料下的一课完全长成的数,得到的权重将会是无穷大,就没有了融合的效果。

解决办法:不要所有资料(计算alpha系数的时候是在所有资料上计算),不要完全长成。

 

我们需要弱一点点的树,那么怎样样是最弱的树呢?一层高。其实这就是之前AdaBoost讲过的Adaboost Decision Stump。

所以Adaboost Decision Stump就是AdaBoost DTree的一个特殊的例子。但Decision Stump很简单,一般就不会去做sampling,而是把权重直接丢到Ein系数中去。

 

Optimization View Of AdaBoost

之前讨论AdaBoost的时候,我们得到,每一轮根据训练的表现去更新不同的训练资料的权重。

其中alpha(t)为最后融合时候g的系数:alpha = ln(方块t)

那么,初始化为1/N,N轮迭代之后我们可以得到最后的一个系数如下:

接下来看看voting score里面有什么东西

g看为特征转换,alpha看为转换后的特征的权重,那么g * alpha就是margin

所以我们就希望voting score越大越好。也就是每个点的权重越小越好

AdaBoost有一个性质,每一轮所有点的权重加起来,这个和会越来越小。

这个值越来越小,就代表Adaboost尽量让每一个点的margin越来越大。

在AdaBoost里面,想办法让最后的权重组合小。就可以把它定义为一个损失ERR(ADA)

下面证明AdaBoost真的能够做得好么?

 之前的梯度下降是找一个Vec作为一个方向,现在我们的梯度下降是找一个函数。

梯度下降的话:就是在我当前的这个点,我会已经有一个值了,然后我会需要往梯度下降的方向走一点点

现在我们就希望找到一个好的h,那么然后呢?

所以说,我们要找到一个好的h,就希望后边那项较小,也就是Ein(h)小,而这正是AdaBoost的做法,找g(t)的时候,是找Ein小的。

但如果像之前的gradient的话,走的步长太小,可能效率太低,我们能不能走的大步一点呢?

那么,接下来就对eita做最佳化。

求得h之后带回Err(ADA)的表达式可以得到:

分正误分类带入得到:

好了,接下来就是对eita的最佳化的一个过程了,很简单,单变量求导就可以了。

好了,这就全对上了。

AdaBoost做的是首先根据Ein最小找到一个g,然后最后每个g的系数就是alpha,现在我们证明了,这种操作其实就是在做某一个最佳化的过程。

 steepest gradient descent(每次走一大步)。

Gradient Boosting

之前讨论了Adaboost实际上使用了Gradient求得一个最佳化的结果,现在对这进行扩充,变化Err function。

现在假设这个Err函数是平方误差

那么现在的意思就是我现在已经找到alpha g,在每一个点上加权算的一个分数sn,现在从sn出发,我需要找一个方向,在那个方向上走一步,让最小

那么我现在就是需要第二项最小化。h的方向和sn - yn 的方向相反,大小无限大,这能导致最小化,但这明显不对啊?

但是由于taylor近似的时候,是需要对h的大小做限制的。那么怎么限制呢?硬性加入条件后会变成一个有条件的最优化问题,

所以这里直接加入一个惩罚项。

所以我需要找到一个好的h,就是h和余数(y - s)(想要做到的y    已经做到的s)的差尽量小。

所以AdaBoost是让base learner 找一个好的Ein小的g

gradientBoost是让base learner 根据余数找一个好的g

 好了,找到一个好的g之后,我们继续寻找eita,这可以转化为一个线性回归问题

GBDT

好了,现在可以拿出我们的GBDT算法了

1.演算法和AdaBoost一样,跑了T轮之后,会得到一堆的g和alpha(用来做Regression,所以不用起sign,就是把g和alpha加权输出去)

2.每一轮做什么事情呢?

 每一轮先解一个Regression问题,使用一个baseLearner来解,比如DTree。(第一轮初始化为0)

 然后得到g后,用g转化,然后求解一个线性回归问题

3.T轮之后就ok

GBDT就是ABDT的一个Regression版本。

Summary of Aggregation Models

 Blending

Learning

Aggregation of Aggregation

不同的Aggregation追求的事情可能不一样,有一些在追求克服underfitting,有的在追求克服overfitting

 

posted on 2017-03-05 11:46  futurehau  阅读(415)  评论(0编辑  收藏  举报