5 min read

Machine Learning With Boosting Scott Hartshorn 阅读笔记

1 决策树解决回归

注意这两幅图,就是通过x不断的切bin去完成对y一个连续变量的预测,我们会发现,当x进行不断切分的时候,也就是复杂程度增加的时候, 冒着过拟合的风险,逐渐拟合了 非线性 的关系。因此也印证了, 决策树预测非线性关系本身比较好。

2 决策树解决分类

注意这幅图,这就是决策树对分类分类处理的逻辑,我们认为图中两个x,连续的,然后一个y,用有限的颜色标记。

3 Boosting的直觉

那么在树形结构上,决策树是一个if-then结构,那么boosting就是把决策树串联/并联起来。

4 weak learner的定义

对于一个分类,可能一个weak learner对 某些样本可以精准分类 ,某些不能。但是只要它擅长某一部分,或者只要比均匀分布瞎猜的好,我们就认为是weak learner。 一群weak learner,分工处理自己擅长的地方,按照串联链接,那么就是boosting。 因此串联的时候,好像按照时间进行的,不同的weak learner在正确的时间进行划分就好。 如果按照bagging的思想,让他们同时做,然后求平均,实际上可能是十个weak的结果,得到1个weakly combined 产品。

不是特别听的懂,boosting连接的时候。 p.23 好无聊,还不如看pandas呢。

现在开始总结regression using boosting。

5 regression using boosting理解

假设总体方程为

Y=sinx+1

显然就是把正弦函数上移一个单位。

5.1 round=1

假设y^0=0 所以u^=yy^=y。 然后我们取x的中间值x=3.14进行决策树的第一个切割。 注意这个时候,u^的变化曲线就是y的变化曲线,所以我们不需要再画了。

我们在各自的分样本中找到了均值,

y^2(1)=1.63

y^2(2)=0.37

u^2|3.14=(u^1|x<3.14)1.63=

u^2|3.14=(u^1|x3.14)0.37=

5.2 round=2

通过第一次的boosting,我们的结果不是很好。 那么我们可以开始第二次的boosting。

在原来u^2的基础是,我们再进行一次决策树1

横线衡量了分样本均值,公式可以这么书写。

u^3|x<0.48=(u^2|x<0.48)0.40=

u^3|x<0.48=(u^2|x0.48)0.05=

所以,

如果我们对比原图,就是第一次出现的图像是,会出现,

对于第一个部分,

u^0u^1=y^1=1.63 u^1u^2=y^2=0.4

所以,

y^=y^1+y^2=1.63+(.4)=1.24

已知,

u^1y^2(0.4)=u^2

所以u^2>u^1,最左边的图像发生上移。

我们知道

y^2(0.4)+u^2=u^1

因此,在y^2(0.4)u^2的图像中,他们的移动方向相反。

他们之间的变化趋势如图。

5.3 round>=3

到迭代9和10的时候,基本上已经没有什么切分了。

5.4 depth = 2的精进

以上是depth = 1的方法,迭代到10就没有进步了。 也就是说depth太少,迭代没有意义。

这个时候可以增加depth,也就是每次决策树要 跑慢一点。

好处就是 因为一刀两半,两层就是四半了,更佳精密。 满足2depth的关系。

显然虽然depth=2单次时间长了,因为层级多了,但是理论上迭代的也少了。

但是实际上还是depth多的好,如图,这是5次迭代depth=2的情况。

这是10次depth=1的情况。

这是10次depth=2的情况。已经非常精细化了。

这恰好说明了。第十次迭代虽然整体上是weak的,但是是某方面的专家。 并且注意,其他地方的y^=0因此,没有使得其他地方变差。

上图是u^的变化情况,理论上就是要衰减到0。

第11次迭代,完全预测准确,

u^i1u^i=y^i

u^11=y^12,那么u^12=0

这里给出了证明rmse的确是depth=2降低的快。

总结

depth设置太小了,很影响拟合效果。 一般sklearn是depth=3的默认值。

这篇文献论证了nodes=6比多的好。

6 学习率

学习率越大,表示迭代越快,步子越大。

这里注意第一步u^0α=y^1,因此 修改了learning rate,需要修改nrounds 很直观!!! nrounds就更加慢了。

因此存在

α(u^0u^1)=y^1

这里就是说,实际上每次的错误,y^1只吸收α,还有1α不吸收,但是随着迭代数量增加,会慢慢吸收的。

6.1 对overfitting加深理解

显然学习率下降后,更加慢,模型更加拟合、代表训练组。 但是如果训练组中包含了error或者noise,那么训练组就不能代表整体样本了,这就是 过拟合

  • 全信 -> overfitting
  • 不信 -> under-fitting
  • 要学会独立思考

error客观存在的,因此反而这个时候y-y_hat = 0 不是好事情了,说明y_hat captures noise.

因此,就是说,步子大了,不好。 因为可能是噪音导致的,以下就冲出轨道了。 因此,慢慢来,虽然耗时间,但是不会出错。

跑得快,但是最终没有0.1的好 读书就是这样,慢慢来,最后后来者居上。

6.2 α[0,1]

之前论述,

α(u^0u^1)=y^1

  • 如果α>1就是在扩大误差。
  • 如果α<0就是在往反方向。

7 进行一定的总结

可知,

u^i1y^i=u^i

我们发现,就是上一期的误差u^i1,也就是说从y=u^0开始,不断的剪去平均数,直到y^iu^i1为止, 也就是u^i0。 其中,这种之后u^i0的,之后的y^i+1也是0,所以u^i+10的。 因此,满足稳定的迭代关系。 后面哪些u^i+10的会被针对,区别对待,特别的锤。

并且会锤的很猛,因为损失函数决定了, 是以RMSE来结算, 那么在此之前,u^i=10u^i=5,会被=102:52=4:1的倍数对待,前者被使劲锤。

当然AdaBoost,是把 对的样本比例放小, 错的样本比例放大。 因此,默认的GBM,各个样本比例是均分的,都为1.

8 classification using boosting理解

先用最详细的讲法讲,然后总结两次,相当于复习。

8.1 总结1

我们发现多了5、6、7步骤,这是因为引入了转换函数logit函数和反函数expit函数。

我们假设目标函数为

Z = int(max(X,Y)) \% 2

max决定了在哪个区块, \% 2奇偶数决定了在Red还是Blue。 这里, Red=0, Blue=1

我们看到的图,其实是总体分布,实际我们是不知道的,现在我们需要用训练组去模拟出来。

这是我们的样本,我们分个训练组出来。

接下来我们要讨论的是 Zmax(X,Y) 的关系,而非 ZX+Y 。 因为现在二元问题,有点复杂,我们直接讲一元问题。 但是这个max函数很好理解的,图上也标注了。 并且,max(X,Y)对于每个点也是唯一的2

u^0y^1=u^10,10.60.6,0.4

y^1=y¯=0.6

u^1都下降了0.6

Iter1

计算Zone3的变化

u^1y^1(1y^1)=19×0.419×0.6×(10.6)=1.6667

那么

ln(y^11y^1)+u^1y^1(1y^1)=ln(y^21y^2)ln(0.610.6)+1.6667=ln(y^21y^2)y^2=0.8882

zone2

zone3

最后

  • zone1上升了很多
  • zone2下降了很多
  • zone3上升了一点

三刀的过程

因为Zone3的点最多 值得一bin

我的感觉是,因为6个组中间, 最右一组的数量最多,所以先单独分出去。 最右二组的数量也多,所以也单独分出去。

Iter2

Iter3

为什么跑中间了,因为中间的Error大,其他都因为分工被针对过了, 因此这些大的Error的被氛围一组,恰好在中间。 因此就是先右边,再左边,最后中间。

8.2 总结2

classification 涉及两个函数

logit函数

p=11+ez

expit函数

z=ln(p1p)

它们互为反函数

zp定义域不同3

  • z(,+)
  • p[0,1]

但是正相关

  • z=0y=12
  • z=y=0
  • z=+y=1

我们看看实际效果

  • p=0.50z=0
  • p=0.75z=+1.09×1
  • p=0.90z=+1.09×2
  • p=0.96z=+1.09×3
  • p=0.99z=+1.09×4

因此我们发现zp是一个边际递减的过程,类似于经济学的效用函数,因此这种假设实际用的时候还是蛮bug的,因此有时候用ReLu函数,SVM常用到。

这里我们使用了depth = 2,因此最多产生4个组。 但是实际上,我们想要6个组。 但是depth = 2就这点能力,没办法。

  • Iter =1的时候,我们从右边开始切
  • Iter =2的时候,我们从左边开始切
  • Iter =3的时候,我们从中间开始切

因此这里就发生了 分工

8.3 总结3

classification相比regression,多个一个转换函数和转换函数反函数的过程。这里使用logit和expit函数。

当我们拿到数据的时候,我们假设 y=u^0 y¯=y^1

因此得到

u^1=u^0y^1

因为每个点的u^1都不同,我们根据u^1的 __相似程度__进行分刀。 对分刀的各个组,我们计算

u^1y^1(1y^1)|group=j

我们注意分母恒大于0, 因此该公式的正负受到u^1决定。 我们知道如果该公式中大部分u^1>0,那么就是+,反之u^1>0u^0(=1)>y^1, 因此y^1估计太小,需要增加。

ln(y^11y^1)+u^1y^1(1y^1)=ln(y^21y^2)

因此y^1↑→y^2

同理

ln(y^i1y^i)+u^iy^i(1y^i)=ln(y^i+11y^i+1)

8.4 总结4

以上特征变量只有一个,当特征变量超过一个时,其实也是类似的,这里就不叙述了。

9 多分类的理解

9.1 总结1

假设我们有一个训练组,有三类。 样本占比为 {z1,z2,z3}。 显然 (z1,z2,z3)=1z1,z2,z3[0,1]

用one vs. rest approach

Iter1

{z1,z2,z3} y^11=ez1ez1+ez2+ez3 y^11 u^0y^1=u^1 u^11 u11bin 计算 u^11y^11(1y^11)n1n z1:=Δ+z1 更新z1

然后,完成了分类1的Iter1, 把结果应用到分类2的Iter14, 产生更新z2后, 把结果应用到分类3的Iter1。

这样完成了第一次迭代。

其中, y^11表示类别1的第一个预测值。

9.2 总结2

因此,如果我们迭代10次,如果多分类为3个,那么一次要三次决策树,一共为3×10次决策树。 因此多分类比二分类慢。

这是流程图。

一般情况下, 更新的zi要比第二大的zi大6 unit,才能说,这个分的好了。

总体分布

第一次迭代中,三个分类,在one vs. rest 的情况下的表现。

先考虑分类1,

y^11=ez1ez1+ez2+ez3

这个是估计值。

这个是 第一次迭代中 分类1 的分刀表现。

g1 g2 g3 ori
2.573 0.142 -0.77 0.15
0.450 0.450 0.45 0.45
0.400 0.400 0.40 0.40
g1 g2 g3 ori
0.8106962 0.2735948 0.1314202 0.2751876
0.0970177 0.3722808 0.4451449 0.3714645
0.0922861 0.3541244 0.4234349 0.3533479

注意 一个是z的区间, 一个是y^的区间。 我们发现,$

针对于第一次迭代完, 分类1的新y^的情况,如图。

再考虑分类2,

y12因为z1的更新也发生了改变,但是是好的,你看图。

迭代完的情况。

再考虑分类3, 同样,y13因为z1z2的更新也发生了改变,但是是好的,你看图。

后面就不说了,以此类推。

这样就完成了Iter1。

然后开始Iter2。

10 参数总结

10.1 决策树参数(Python)

dot max_depth max_depth max_leaf_nodes max_leaf_nodes max_depth->max_leaf_nodes 控制深度 控制最后的节点 max_features max_features max_depth->max_features 防止过拟合 一般为n的开根 min_samples_split min_samples_split min_samples_leaf min_samples_leaf min_samples_split->min_samples_leaf 控制bin前最小样本 控制bin后最小样本 min_weight_fraction_leaf min_weight_fraction_leaf min_samples_leaf->min_weight_fraction_leaf 控制bin后最小样本比例 min_impurity_spit min_impurity_spit min_weight_fraction_leaf->min_impurity_spit 控制bin前最小Gini系数 不是非常直觉 防止过拟合

10.2 Boosting参数(Python)

  • learning_rate
  • n_estimators
  • subsample

10.3 其他参数

  • random_state
  • warm_start

11 boosting的局限性 - 特征工程

  • max(x,y)
  • x2+y2
  • x+y

这些都是特征工程,好处就是减少迭代次数,省时间。

例如,之前我们的例子中,max(x,y)就是要比x和y单独去跑节省时间。

如果总体是个圆。

直接搞就很糟糕。

终于搞完了!

12 连续变量是否需要离散化

当简单对连续变量进行离散化处理时,DMLC (2016) 给出关于 Age和因变量的卡方检验证明,离散化处理不会得到的卡方值低,提高较小的信息值。

DMLC. 2016. “Understand Your Dataset with Xgboost.” 2016. http://xgboost.readthedocs.io/en/latest/R-package/discoverYourData.html.


  1. 看到我们的切分点变了,这个是根据信息增益来决定的。

  2. 类似于现在的标准是, X,Y max(X,Y)的转化率是100% 我们只要把max(X,Y) Red/Blue这一步转化做好就行了。 不需要X,Y Red/Blue

  3. 我们注意为什么z的定义域那么广,为了迭代,可以一直加加减减。

  4. 这样的话就利用了第一次决策树的结果。下文会显示这样的利用是有效的。