您的位置:首页 > Web前端

林轩田之机器学习课程笔记( combining predictive features之 adaptive boosting)(32之24)

2018-01-02 08:39 495 查看
概要

为什么要做boosting

通过调整权重达到模型多样性

Adaptive Boosting算法

Adaptive Boosting实战

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

对于模型融合可以参考:

http://scikit-learn.org/stable/modules/ensemble.html

Adapitve boosting的参考:

http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.AdaBoostClassifier.html

题目可能不全,因为有字数限制,不好意思,可以参考:

https://www.csie.ntu.edu.tw/~htlin/course/ml15fall/

概要

上节讲到了blending和bagging,通过一堆基本模型得到一个还不错的模型,要得到基本模型提出了通过放回抽样的方法,得到bagging。本节主要讲通过另外的方法达到模型的多样性。

为什么要做boosting

我们首先来看看一个例子,比如在分辨是否是苹果的过程中,老师给了一堆水果给全班童鞋辨识,整个的辨识过程如下图:



通过上面的学习过程,同学们就学习到了,苹果可能是圆的,是红的…….。将这些规则组合起来就可能还不错的基本模型。

这就是adaptive boosting算法的流程,核心在于基本分类器在不断的学习过程中,专注在错误的样本上,调整相应权重,给予下一次的基本分类器学习。

比如现在只能给予基分类器垂直线,那么会得到什么结果呢?

如下图:



最后可能就得到这些弯弯曲曲的线条,将数据分割开。

通过调整权重达到模型多样性

我们先看看通过拔靴法得到bagging方法如下图:



当采用放回抽样的时候,数据的有的会有重复,有的会没有,其实这个和在该点添加相关的整数权重什么分别。

所以采用放回抽样的方式本质上是一种通过调节资料点权重的方式

而我们知道,抽样的话,权重是整数的,可不可以权重是正实数,这样灵活性更高,就像计算阶乘,整数的阶乘是可以很好计算的,那么要计算一个小数的阶乘呢?是吧

通过调整权重得到的样本最后的损失函数如下:

Euin=1N∑n=1Nunerr(yn,h(xn))

实际的模型中怎么做到这种随心权重呢?在SVM和逻辑回归中如何做呢?



1)在soft-margin的SVM中,超参数C前面添加权重就可以了。然后通过对偶方式求解。

2)对于通过SGD方式进行优化的算法,比如逻辑回归等,可以在抽样的时候通过概率分布来做到,给予该点抽样概率。

其实在处理类别不平衡的方法中,其中一种方法就是修改损失函数类别权重。而这里是通过修改每个点的权重,就相当于是以前的一种衍生。

那么我们如何修改这些权重,使得我们的算法越来越好呢?每个基模型差异性比较大。考虑做一个二分类模型,算法迭代到了t轮以及t+1轮。

gt=argminh∈H(∑n=1Nutn[yn≠h(xn)])gt+1=argminh∈H(∑n=1Nut+1n[yn≠h(xn)])

我们的目的是要使得算法的差异性比较大,这样最后模型模型提升效果才明显。那怎么做呢?假如经过t轮后,给予后面资料点的权重,使得gt模型在下一次加权后的数据上表现很差是不是就可以了?

gt在ut+1n赋予的权重下表现差,而gt+1表现好啊

怎么才叫做表现差呢?如果gt在ut+1n赋予的权重下几乎无法分辨不就行了吗?

所以要满足:

∑Nn=1ut+1n[yn≠gt(xn)]∑Nn=1ut+1n=12

这是boosting算法的核心思想。通过使得本轮产生的模型在下轮数据样本上表现差而达到多样性的目的。

那么要如何来求解上面的式子呢?

换一种思维,对于二分类的问题,要使得算法表现趋于随机,就是该模型做对的代价和做错的代价一样就好么嘛。

令:

wrong=∑n=1Nut+1n[yn≠gt(xn)]right=∑n=1Nut+1n[yn=gt(xn)]

就是要使得错误的代价和正确代价一致:wrong=right

举个简单例子,假如gt在分类任务中,错误率为ϵt,那么正确率为:1−ϵt

要使得gt在下一轮的分类任务中趋于随机。给正确的点分配错误率的权重,给错误的点分配正确率的权重不就好么?

如下:假如gt得到错误的权重是1126,正确的损失权重是:6211。要使得其在下一次计算的时候正确率为:1/2。那么只要把所有gt计算正确的点乘以6211,错误的点乘以1126。这样不就好了吗?



或者乘以错误率也可以:



Adaptive Boosting算法

在二分类中,假设gt的错误率为ϵt,那么有:

ϵt=∑Nn=1utn[yn≠gt(xn)]∑Nn=1utn

同时定义一个变量:t=1−ϵtϵt−−−−√

在更新的时候我们这么更新:

错误的点的权重=错误的点的权重∗t正确的点的权重=正确的点的权重t

我们看看合不合理,如果ϵt≤12那么t≥1

这就相当于更多的关注了错误的点,而给予正确的点少的权重。

这样得到了一堆的基模型,这个时候可以采用blending的方式来得到最后的模型。

1)得到的基模型不能通过等权重统一投票的方式,对于同样的样本,因为gt表现好,但是gt+1就表现差了,两者会相互抵消。

2)可以通过线下的blending或者stacking 的方式。

这里将通过一边得到基模型,一边得到权重的方式。

设定权重为:

αn=ln(t)

这个是可以被证明出来的,这里就不细讲了,具体可以参考李航博士的《统计学习方法》138~146页。http://item.jd.com/10975302.html

所以整个adaboosting算法的流程如下:

1)初始化每个点的权重为1N

2) for t in range(1,T): 进行T轮迭代

1:得到第t轮的演算法gt

2:算出准确率ϵt,ϵt=∑Nn=1utn[yn≠gt(xn)]∑Nn=1utn

3:算出系数:k=1−ϵtϵt−−−−√

4:更新下一轮模型需要样本点的权重:错误的点的权重=错误的点的权重∗k,正确的点的权重=正确的点的权重k

5:算出基模型系数:αk=ln(k)

3)组合最后得到的模型G(x)=sign(∑t=1Tαtgt(x))

所以总的算法差不多就这样,因为这里用到了迭代的t,所以把系数改写成了k。

下面看看通过这样的算法,在VC维上有啥保证呢?

有这样的结论:



这个算法的设计者证明了

1)如果每次迭代的基本算法比乱猜好,就是ϵ>12 那么最多经过O(log(N))次迭代就可以使得Ein(G)=0

2)又因为后面的模型复杂度的项目是和迭代次数有关,这样当数据量足够的时候,可以将Eout(G)做好。

Adaptive Boosting实战

从上面得到,只要在Adaptive Boosting 这个框架下,挑选一些弱弱的算法就可以得到还不错的结果。

这些弱弱的算法有哪些呢?比如逻辑回归、决策树桩等。

这里以决策树桩为例,在二维平面上就是一些垂直于坐标轴的直线。



对于复杂的点其实也是一样的。



在复杂的边界中也表现不错。这是一个非线性的模型。

在实际工作中,比较成功的案例是即时人脸识别



关于使用adaboost算法进行人脸识别可以参考;

http://www.doc88.com/p-0853166847289.html

http://www.docin.com/p-1379994056.html

欢迎转载,可以关注博客:http://blog.csdn.net/cqy_chen
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐