提升方法的思路是综合多个分类器,得到更准确的分类结果。 说白了就是“三个臭皮匠顶个诸葛亮”。
目录
提升方法
提升方法AdaBoost算法
提升方法思路比较简单,它意在通过改变训练样本之间相对的权重,从而学习出多个分类器,并将这些分类器进行线性组合,从而提高分类的性能。
从以上思路可以看出,提升方法将一个复杂的任务分配给多个专家进行判断,并且对判断的结果进行综合,这样做要比只让一个专家来判断要好,毕竟大家说好才是真的好。
AdaBoost是提升算法的代表,所谓提升算法,指的是一种常用的统计学习方法,应用广泛且有效。在分类问题中,它通过改变训练样本的权重,学习多个分类器,并将这些分类器进行线性组合,提髙分类的性能。
算法 (AdaBoost)
输入:训练数据集
T={(x1,y1),(x2,y2),...,(xN,yN)}
,其中,
xi∈X=Rn
,
yi∈Y={−1,+1}
,弱学习算法;
输出:最终分类器
G(x)
。
(1) 初始化训练数据的权值分布
D1=(w11,...,w1i,...,w1N),w1i=1N,i=1,2...,N
(2) 对
m=1,2,...,M
(a) 使用具有权值分布
Dm
的训练数据集学习,得到基本分类器
Gm(x):X→{−1,+1}
(b) 计算
Gm(x)
在训练数据集上的分类误差率
em=P(Gm(xi)≠yi)=∑i=1NwmiI(Gm(xi)≠yi)
(c) 计算
Gm(x)
的系数
αm=12log1−emem
这里的对数是自然对数。
(d) 更新训练数据集的权值分布
Dm+1=(wm+1,1,...,wm+1,i,...,wm+1,N)
wm+1,i=wmiZmexp(−αmyiGm(xi))i=1,2,...,N
也可以写成
wm+1,i={wmiZme−αm,wmiZme−αm,Gm(xi)=yiGm(xi)≠yi
这里,
Zm
是规范化因子
Zm=∑i=1Nwmiexp(−αmyiGm(xi))
它使
Dm+1
成为一个概率分布。
(3) 构建基本分类器的线性组合
f(x)=∑m=1MαmGm(x)
得到最终分类器
G(x)=sign(f(x))=sign(∑m=1MαmGm(x))
从以上算法可以看到:最开始步骤1,我们假设了样本具有均匀的权重分布,它将产生一个基本分类器
G1(x)
。步骤2是一个m从1到M的循环过程,每一次循环都可以产生一个弱分类器。
- 分类误差率实际上就是被误分类点的权值之和。
- 在计算当前弱分类器在线性组合中的系数时,当
e≥0.5
时,
α≥0
,并且随着e的减小而增大,正好印证了需要使误差率小的弱分类器的权值更大这个事实。
- 每一个样本的权值
w
,都与它原来的标签
yi
以及预测的标签
Gm(xi)
有关,当预测正确即它们同号时,exp指数是一个负值,这样就会减小原来样本点的权重;当预测不正确即它们异号时,exp指数是一个正值,它会增加当前样本点的权重。这正印证了我们需要使被误分类样本的权值更大这个事实。
AdaBoost算法的解释
AdaBoost算法还有另一个解释,即可以认为AdaBoost算法是模型为加法模型、损失函数为指数函数、学习算法为前向分步算法时的二类分类学习方法。
前向分步算法
考虑加法模型(additive model)
f(x)=∑m=1Mβmb(x;γm)
其中,
b(x;γm)
为基函数,
γm
为基函数的参数,
βm
为基函数的系数。显然,
f(x)=∑m=1Mβmb(x;γm)
是一个加法模型。
在给定训练数据及损失函数的条件下,学习加法模型
f(x)
成为经验风险极小化即损失函数极小化问题:
minβm,γm∑i=1NL(yi,∑m=1Mβmb(xi;γm))
通常这是一个复杂的优化问题。前向分步算法(forward stage wise algorithm)求解这一优化问题的想法是:因为学习的是加法模型,如果能够从前向后,每一步只学习一个基函数及其系数,逐步逼近优化目标函数式,那么就可以简化优化的复杂度。具体地,每步只需优化如下损失函数:
minβ,γ∑i=1NL(yi,βb(xi;γ))
算法 (前向分步算法)
输入:训练数据集
T={(x1,y1),(x2,y2),...,(xN,yN)}
,损失函数
L(y,f(x))
和基函数的集合
{b(x;γ)}
;
输出:加法模型
f(x)
.
(1) 初始化
f0(x)=0
(2) 对
m=1,2,...,M
(a) 极小化损失函数
(βm,γm)=argminβ,γ∑i=1NL(yi,fm−1(xi)+βb(xi;γ))
得到参数
βm,γm
(b) 更新
fm(x)=fm−1(x)+βmb(x;γm)
(3) 得到加法模型
f(x)=fM(x)=∑m=1Mβmb(x;γm)
这样,前向分步算法将同时求解从
m=1
到
M
所有参数
βm,γm
的优化问题简化为逐次求解各个
βm,γm
的优化问题。
前向分步算法与AdaBoost
由前向分步算法可以推导出AdaBoost,AdaBoost算法是前向分歩加法算法的特例。这时,模型是由基本分类器组成的加法模型,损失函数是指数函数。
提升树
提升树是以分类树或回归树为基本分类器的提升方法。提升树被认为是统计学习中性能最好的方法之一。
提升树模型
提升方法实际采用加法模型(即基函数的线性组合)与前向分步算法。以决策树为基函数的提升方法称为提升树(boosting tree)。对分类问题决策树是二叉分类树,对回归问题决策树是二叉回归树。在原著例题中看到的基本分类器,可以看作是由一个根结点直接连接两个叶结点的简单决策树,即所谓的决策树桩(decision stump)。提升树模型可以表示为决策树的加法模型:
fM(x)=∑m=1MT(x;Θm)
其中,
T(x;Θm)
表示决策树;
Θm
为决策树的参数;
M
为树的个数。
提升树算法
提升树算法采用前向分步算法。首先确定初始提升树
fm(x)=0
,第
m
歩的模型是
fm(x)=fm−1(x)+T(x;Θm)
其中,
fm−1(x)
为当前模型,通过经验风险极小化确定下一棵决策树的参数
Θm
Θ^m=argminΘm∑i=1NL(yi,fm−1(xi)+T(xi;Θm))
由于树的线性组合可以很好地拟合训练数据,即使数据中的输入与输出之间的关系很复杂也是如此,所以提升树是一个髙功能的学习算法。
不同问题有大同小异的提升树学习算法,其主要区别在于使用的损失函数不同。包括用平方误差损失函数的回归问题,用指数损失函数的分类问题,以及用一般损失函数的一般决策问题。
对于二类分类问题,提升树算法只需将AdaBoost算法中的基本分类器限制为二类分类树即可,可以说这时的提升树算法是AdaBoost算法的特殊情况。
算法 (回归问题的提升树算法)
输入:线性可分训练数据集
T={(x1,y1),(x2,y2),...,(xN,yN)}
,其中,
xi∈X⊆Rn
,
yi∈Y⊆R
;
输出:提升树
fM(x)
.
(1) 初始化
f0(x)=0
(2) 对
m=1,2,...,M
(a) 计算残差
rmi=yi−fm−1(xi),i=1,2,...,N
(b) 拟合残差
rmi
学习一个回归树,得到
T(x;Θm)
(c) 更新
fm(x)=fm−1(x)+T(x;Θm)
(3) 得到回归问题提升树
fM(x)=∑m=1MT(x;Θm)
算法 (梯度提升算法)
输入:线性可分训练数据集
T={(x1,y1),(x2,y2),...,(xN,yN)}
,其中,
xi∈X⊆Rn
,
yi∈Y⊆R
,损失函数
L(y,f(x))
;
输出:回归树
f^(x)
.
(1) 初始化
f0(x)=argminc∑i=1NL(yi,c)
(2) 对
m=1,2,...,M
(a) 对
i=1,2,...,N
,计算
rmi=−[∂L(yi,f(xi))∂f(xi)]f(x)=fm−1(x)
(b) 对
rmi
拟合一个回归树,得到第
m
棵树的叶节点区域
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)+∑j=1JcmjI(x∈Rmj)
(3) 得到回归树
f^(x)=fM(x)=∑m=1M∑j=1JcmjI(x∈Rmj)
参考文章
- 提升方法
- 《统计学习方法(李航)》讲义 第08章 提升方法
- 提升方法及AdaBoost