引言
提升方法是一种常用的学习方法(确切来说是一种基于统计的学习方法),并且广泛有效,基本思想是:不需针对学习任务(分类或者回归,为叙述方便,后文中以分类为例)直接学习出一个模型,而是先学习出一个模型,对样本进行分类,在该模型无法准确分类的样本上学习第二个模型,以此类推,直到所有样本都被准确的分类,最终的模型是将之前学习到的模型进行线性组合,可看做是“分而治之”的思想。
AdaBoost
强弱学习器
强学习器亦叫做强可学习:是指一个模型针对学习任务结果具有很高的准确性;
弱学习器亦叫做弱可学习:是指一个模型针对学习任务的结果比随机猜测的准确性好。
所以提升方法中学习到的一系列学习器都是弱学习器,那为什么不直接学习出强学习器,反而要去学习一些准确性不高的弱学习器呢?因为困难啊,很多任务无法或者很困难去学习出一个好的强学习器,我们就退而求其次,先学习出一些弱学习器,明显,学习出一个弱学习器比学习出一个强学习容易得多得多啊!然后想办法将这些弱学习器提升成强学习器,这也就是提升方法这个名词的由来,在提升方法中,下一轮关注的样本始终是上一次学习器未能准确分类的样本集合,为了使这些样本在下一轮的学习中获得更多关注,往往我们会加大这些错误分类样本的权重,使之受到更大的重视程度,而降低已经被正确分类的样本权重。
AdaBoost算法
不是一般性,我们这里考虑一个二分问题。假定一个二分训练数据集:
AdaBoost算法步骤:
输入: 训练集{(x_1,y_1),(x_2,y_2)...(x_n,y_n)}
弱学习器法
输出: 最终分类器G(x)
(1). 初始化训练样本的权值(weight)分布
D_1 = (w_11, ... w_1i,...w_1N), w1i=1/N, i=1,2,3...N
(2). 对m=1,2...,M
a.使用具有训练权值分布Dm的训练数据集学习,得到基本分类器:
G_m(x)->{-1,+1}
b.计算Gm(x)在训练数据集上的分类错误率
e_m=P(G_m(x_i)!=y_i)=sum(w_mi*I(G_m(xi)!=y_i))
c.计算G_m(x)的系数
a_m=1/2*log((1-e_m)/e_m)
d.更新训练权值
D_m+1=(w_m+1_1,w_m+1_i,...,w_m+1_N)
w_m+1_i=(w_mi/Z_m)exp(-a_m*y_i*G_m(x_i))
这里Z_m是规范化因子
Zm=SUM(w_mi*exp(-a_m*y_i*G_m(x_i))
(3). 构建线性组合
f(x)=sum(a_m*G_m(x))
得到最终的分类器:
G(x)=sign(f(x))=sign(sum(a_m*G_m(x)))
步骤分析:
step1 . 初始化权重为均匀分布,表示所有的样本在初始化时的作用是一样的;
step2 . 对M个学习器进行学习,每一步包括一下内容:
a . 通过加权样本学习到本轮学习器 Gm(x)
b . 计算学习器 Gm(x) 的错误率
c . 计算 Gm 系数 αm , αm 表示 Gm 在最终模型中的重要性,注意到 αm 的计算方法:
d . 更新权重,为下一个学习器 Gm+1 做准备。
step3 . 归一化学习器权重 αm ,并把 Gm(x) 加入到已有的模型中,作为最后模型的组成部分。
前向分步式算法
考虑AdaBoost的模型可表示为:> input: 训练集 T={(x1,y1),(x2,y2)...(xn,yn)} ,损失函数 L(y,f(x)) ,基函数集 {b(x:γ)}
> output: 加法模型 f(x)
> (1). 初始化 f0(x)=0
> (2). 对 m=1,2,...,M :
> a. 极小化损失函数
> b. 更新:
> (3). 得到加法模型:
AdaBoost其实就是特殊的前向分步算法,用到的损失函数是指数函数。具体证明请参考相关资料(《统计学习方法》 李航)。
提升树模型(GBDT)
提升树是以决策树为基学习器的加法模型,在分类问题时用的是二叉分类树,在回归问题时用的二叉回归树,最简单的回归树可看做是一个根节点连接的左右子树的二叉树,即所谓的决策树桩。提升树的模型可表示为:
提升树算法
由于提升树是加法模型,则依然可以用前向分步式算法进行模型的求取,首先确定
f0(x)=0
,第
m
步的模型可表示为:
对于分类问题,只需要将上述的AdaBoost的基学习器限定为二分类树,其余的和上述的AdaBoost内容无差。对于回归问题,可看做是对输入空间 χ 划分为 J 个不相交的区域,在每个区域上输出的常量为
其中 θ={(R1,C1),(R2,C2),...,(RJ,CJ)} 表示树的区域和区域上的常数, J 表示区域的个数。对于回归树的前向分步式算法有:
(1). 初始化$f_0(x)=0
(2). 对 m=1,2,..,M :
a . 计算残差 r=y−fm−1(x)
b . 拟合残差,学习一个回归树,得到 T(x;θm)
c . 更新 fm(x)=fm−1(x)+T(x;θm)
(3). 得到回归提升树fM(x)=∑m=1MT(x;θm)
梯度提升方法
前面用到的损失函数都有比较好的性质,如平方误差、指数函数等,但对于一般的函数来说,问题可能会变得复杂些,针对这一问题Freidman提出了梯度提升(Gradient Boosting),这是利用最速下降的近似方法,其关键是利用损失函数的负梯度在当前模型的值
算法步骤:
(1). 初始化f0(x)=argminc∑i=1NL(yi,c)
(2). 对 m=1,2,..,M :
a . 对于 i=1,2,...,N , 计算rmi=−[∂L(y,f(xi))∂f(xi)]f(x)=fm−1(x)
b . 拟合 rmi ,学习一个回归树的叶节点区域 Rmj,j=1,2,...,J
c . 对 j=1,2,...,J 计算Cmj=argminc∑xi∈RmjL(yi,fm−1(xi)+C)
d . 更新 fm(x)=fm−1(x)+∑Jj=1CmjI(x∈Rmj)
(3). 得到回归树:f(x)∗=fM(x)=∑m=1M∑j=1JCmjI(x∈Rmj)
参考文献
[1] 《统计学习方法》李航
[2].http://www.jianshu.com/c/415a64b18dcc?utm_source=desktop&utm_medium=notes-included-collection