集成方法(boosting又称为提升方法)
提升方法重要概念
- 1.思路:三个臭皮匠顶个诸葛亮
- 2.重要概念:
PAC:(Probably approximately correct):概率近似正确
强可学习:PAC中,面对假设模型,如果存在一个多项式的学习算法能够学习它,且正确率很高,那么这个概念就是强可学习
弱可学习:PAC中,面对假设模型,如果存在一个多项式的学习算法能够学习它,且正确率仅仅比随机猜测好,那么这个概念就是弱可学习
注意:强可学习实质上等价于弱可学习
在PAC学习的框架下,一个概念是强可学习的充分必要条件是这个概念是弱可学习的
问题: 弱可学习如果提升为强可学习?
- 方案:对分类问题而言,提升方法就是弱学习算法出发,反复学习,得出一系列弱分类器,组合这些弱分类器,构成一个强分类器,
提升方法:为改变训练数据的概率分布(训练数据的权值分布),针对不同的训练数据调用弱分类器算法
给出方案之后,提升方法的两个问题?
1.在每一轮中如何改变训练数据的权值或概率分布
2.如何将弱分类器组合成一个强分类器
AdaBoost给出的解决方案
1.提高那些被前一轮弱分类器错误分类样本的权值,降低被正确分类的样本权值
2.加权多数表决的方法 将弱分类器线性组合起来
AdaBoost
Input:DataSet T={(x1,y2),(x2,y2),...,(xn,yn)}xi∈χ⊆R,yi∈Y=−1,+1,弱学习分类器 T = { ( x 1 , y 2 ) , ( x 2 , y 2 ) , . . . , ( x n , y n ) } x i ∈ χ ⊆ R , y i ∈ Y = − 1 , + 1 , 弱 学 习 分 类 器
Output: 最终分类算法G(x) 最 终 分 类 算 法 G ( x )
算法实现过程:
step1: 初始化训练数据的权值分布
D1=(W11,W12,...,W1i,W1N),W1i=1N,i=1,2,...,N
D
1
=
(
W
11
,
W
12
,
.
.
.
,
W
1
i
,
W
1
N
)
,
W
1
i
=
1
N
,
i
=
1
,
2
,
.
.
.
,
N
step2: 对m=1,2,.....,M 对 m = 1 , 2 , . . . . . , M , 表示有m个弱分类器
- (a) 使用具有权值分布
Dm
D
m
的训练数据集学习,得到基本m个基本分类器
Gm(x):X−>−1,+1 G m ( x ) : X − > − 1 , + 1 - (b) 计算
Gm(x)
G
m
(
x
)
在训练集上的分类误差率
em=P(Gmxi≠yi=∑i=1NWmiI(Gm(x)≠yi) e m = P ( G m x i ≠ y i = ∑ i = 1 N W m i I ( G m ( x ) ≠ y i )
实质上是错分数据的权值之和 - (c) 计算
Gm(x)的系数
G
m
(
x
)
的
系
数
αm=12log1−emem α m = 1 2 log 1 − e m e m (d) 更新训练数据集的权值分布
D(m+1)=(Wm+1,1,Wm+1,2,....,Wm+1,i,.......,Wm+1,N D ( m + 1 ) = ( W m + 1 , 1 , W m + 1 , 2 , . . . . , W m + 1 , i , . . . . . . . , W m + 1 , N
Wm+1,i=WmiZmexp(−αmyiGm(xi)) W m + 1 , i = W m i Z m exp ( − α m y i G m ( x i ) )
实质上是:指数惩罚函数
当yi==Gm(xi)时:yiGm(xi)=1,即−αmyiGm(xi)<0,权重减小 当 y i == G m ( x i ) 时 : y i G m ( x i ) = 1 , 即 − α m y i G m ( x i ) < 0 , 权 重 减 小
当yi!=Gm(xi)时:yiGm(xi)=−1,即−αmyiGm(xi)>0,权重增加 当 y i ! = G m ( x i ) 时 : y i G m ( x i ) = − 1 , 即 − α m y i G m ( x i ) > 0 , 权 重 增 加Zm是规范化因子Zm=∑i=1NWmiexp(−alphayiGm(xi)) Z m 是 规 范 化 因 子 Z m = ∑ i = 1 N W m i exp ( − a l p h a y i G m ( x i ) )
这样更新训练数据的权值分布 Dm+1 D m + 1
step3:构建基本分类器的线性组合
f(x)=∑m=1MαmGm(x)
f
(
x
)
=
∑
m
=
1
M
α
m
G
m
(
x
)
得出最终分类器:
G(x)=sign(f(x))=sign(∑m=1MαmGm(x))
G
(
x
)
=
s
i
g
n
(
f
(
x
)
)
=
s
i
g
n
(
∑
m
=
1
M
α
m
G
m
(
x
)
)
AdaBoost算法说明
(1) 假设训练数据集具有均匀的权值分布,即每个训练样本在基本分类器的学习中作用相同===》在此基础上,首先得出基本分类器
(2)
AdaBoost
A
d
a
B
o
o
s
t
反复学习基本分类器,在每一轮
m=1,2,...,M
m
=
1
,
2
,
.
.
.
,
M
顺次的执行下列操作:
- (a)使用当前分布 Dm D m 加权的训练数据集,学习基本分类器 Gm(x) G m ( x )
- (b)计算基本分类器
Gm(x)
G
m
(
x
)
在加权训练集上的分类误差率
em=P(Gm(xi)≠yi)=∑Gm(xi)≠yiWmi e m = P ( G m ( x i ) ≠ y i ) = ∑ G m ( x i ) ≠ y i W m i
Wmi表示在第m轮更新中,第i个实例的权值,∑i=1NWmi=1 W m i 表 示 在 第 m 轮 更 新 中 , 第 i 个 实 例 的 权 值 , ∑ i = 1 N W m i = 1
表明: Gm(x) G m ( x ) 在加权的训练数据集上的分类误差率是被 Gm(x) G m ( x ) 误分类样本的权值之和,由此确定数据权值分布 Dm D m 与基本分类器 Gm(x) G m ( x ) 的分类误差率的关系 (c)计算基本分类器 Gm(x)的系数αm,αm表示Gm(x)在最终分类器中的重要性 G m ( x ) 的 系 数 α m , α m 表 示 G m ( x ) 在 最 终 分 类 器 中 的 重 要 性
αm=12log1−emem α m = 1 2 log 1 − e m e m
性质: 当 em≤12时,αm≥0,并且αm随着em的减小而增大,所有分类误差率越小的基本分类器在最终分类器中的作用越大 e m ≤ 1 2 时 , α m ≥ 0 , 并 且 α m 随 着 e m 的 减 小 而 增 大 , 所 有 分 类 误 差 率 越 小 的 基 本 分 类 器 在 最 终 分 类 器 中 的 作 用 越 大(d)更新训练数据的权值分布为下一轮做准备
Wm+1,i=WmiZme−αm,Gmxi=yi W m + 1 , i = W m i Z m e − α m , G m x i = y i
Wm+1,i=WmiZmeαm,Gmxi=yi W m + 1 , i = W m i Z m e α m , G m x i = y i
Zm=∑i=1NWmiexp(−alphayiGm(xi)) Z m = ∑ i = 1 N W m i exp ( − a l p h a y i G m ( x i ) )
即: 在上述的迭代更新中, 被基本分类器
Gm(x)
G
m
(
x
)
误分类样本的权值得以扩大,而被正确分类样本的权值得以缩小,实质上
e2αm=em1−em
e
2
α
m
=
e
m
1
−
e
m
,使得误分类样本的作用在下一轮的作用中变得更好
不改变训练数据而改变权值分布, 使得训练数据在基本分类器中其不同的作用
(3)线性组合
f(x)实现M个基本分类器的加权表决,系数αm表示基本分类器Gm(x)的重要性,注意:这里∑αm≠1
f
(
x
)
实
现
M
个
基
本
分
类
器
的
加
权
表
决
,
系
数
α
m
表
示
基
本
分
类
器
G
m
(
x
)
的
重
要
性
,
注
意
:
这
里
∑
α
m
≠
1
-
f(x)的符号决定实例x的类
f
(
x
)
的
符
号
决
定
实
例
x
的
类
-
f(x)的绝对值表示分类的确信度
f
(
x
)
的
绝
对
值
表
示
分
类
的
确
信
度
最终: 利用基本分类器的线性组合构建最终分类器
例题及adaboost算法实现:
import numpy as np
D = None
fx = dict()
def loadDataSet(filename):
dataSet, labelMat = list(), list()
with open(filename, 'r') as fr:
for line in fr.readlines():
dataSet.append([int(line.split(',')[0])])
labelMat.append([int(line.split(',')[1])])
return np.mat(dataSet), np.mat(labelMat)
# 三个弱分类器
def weekClassify1(x):
if x < 2.5:
return 1
elif x > 2.5:
return -1
def weekClassify2(x):
if x < 8.5:
return 1
elif x > 8.5:
return -1
def weekClassify3(x):
if x > 5.5:
return 1
elif x < 5.5:
return -1
def calcErrorRate(dataSet, labelMat, func):
dataSize = np.shape(labelMat)[0]
errorIndex = list()
for index in range(len(dataSet)):
predict = func(dataSet[index])
if predict * labelMat[index] < 0:
errorIndex.append(index)
return errorIndex
def adaBoost(dataSet, labelMat, funcList):
"""
:param dataSet: 训练数据集 input 特征值
:param labelMat: 训练数据集 output 类标记
:param funcList: 弱分类器的列表集合
:return
fx 字典形式的基本分类器的线性组合
"""
# step1 初始化训练数据的权值分布
global D
global fx
if D is None:
dataSize = np.shape(labelMat)[0]
D = np.ones((dataSize, 1)) / dataSize
print(D) # [[0.1], [0.1], [0.1].....[0.1]]
else:
# step2 对m=1,2,....,M
# (a) 使用具有权值分布D的训练数据集学习 得到基本分类器 Gm(x)
# funcList = [weekClassify1, weekClassify2, weekClassify3]
# print(funcList)
# (b) 计算Gm(x)在训练数据集上的分类误差率 = 错分类数据权值之和
# fx 基本分类器的线性组合
errorRateList = list()
errorIndexList = list()
for funcIndex in range(len(funcList)):
errorIndex = calcErrorRate(dataSet, labelMat, funcList[funcIndex])
errorIndexList.append(errorIndex)
errorRate = 0
for index in errorIndex:
errorRate += float(D[index])
print('errorRate:', errorRate)
errorRateList.append(errorRate)
# print('min_errorRate', min_errorRate)
# (c) 计算Gm(x)的系数 选择弱分类器中错分率最低的分类器 优先计算系数
min_errorRate = min(errorRateList)
min_funcIndex = errorRateList.index(min_errorRate)
print('min_errorRate', min_errorRate)
print('min_funcIndex', min_funcIndex)
print('错分率最低的分类器索引', min_funcIndex)
alpha = (1 / 2) * np.log((1 - min_errorRate) / min_errorRate)
# print('alpha1', alpha)
# print('alpha2', alpha)
print('计算Gm(x)的系数', alpha)
# (d) 更新训练数据的权值分布
print(errorIndexList[min_funcIndex])
print('更新权重')
for indexD in range(len(D)):
if indexD in errorIndexList[min_funcIndex]:
# print('D indexD', D[indexD])
D[indexD] = D[indexD] / (2 * min_errorRate)
else:
D[indexD] = D[indexD] / (2 * (1 - min_errorRate))
print(D)
# step 3 构建基本分类器的线性组合
print('构建基本分类器的线性组合')
fx[alpha] = funcList[min_funcIndex]
# print('fx', fx)
sign_errorIndex = strongClassify(fx, dataSet, labelMat)
sign_errorRate = (1 - (float(len(sign_errorIndex)) / len(labelMat))) * 100
if sign_errorRate > 90.00:
print("最终分类器正确率率大于0.9, 正确率为%.2f %%" % sign_errorRate)
# print('fx:', fx)
return fx
else:
print("当前最终分类器正确率为%.2f %%" % sign_errorRate)
print('当前最终分类器误分类个数为: %d' % len(sign_errorIndex))
print('继续优化最终分类器fx:', fx)
return adaBoost(dataSet, labelMat, funcList)
# 最终分类器
def sign(fx, testData):
result = 0
for key, value in fx.items():
result += key * value(testData)
if result > 0:
result = 1
else:
result = -1
return result
# 强分类器验证
def strongClassify(fx, testData, labelMat):
errorIndex = list()
for index in range(len(testData)):
predict = sign(fx, testData[index])
# print(predict)
if predict != float(labelMat[index]):
errorIndex.append(index)
print('strongClassify errorIndex', errorIndex)
return errorIndex
def main():
filename = 'test.txt'
dataSet, labelMat = loadDataSet(filename)
funcList = [weekClassify1, weekClassify2, weekClassify3]
fx = adaBoost(dataSet, labelMat, funcList)
print(fx)
# correctRate = strongClassify(fx, dataSet, labelMat)
# print('AdaBoost StrongClassify CorrectRate:%.2f %%' % correctRate)
if __name__ == '__main__':
main()
AdaBoost算法误差分析
从定理中化简:训练数据的权值分布公式以及 Zm Z m 规范化因子公式
二分类问题Adaboost的训练误差界
Zm=∑i=1NWmiexp(−alphayiGm(xi))
Z
m
=
∑
i
=
1
N
W
m
i
exp
(
−
a
l
p
h
a
y
i
G
m
(
x
i
)
)
此时存在两种情况:
第一种:yi=Gm(xi)第二种:yi!=Gm(xi)
第
一
种
:
y
i
=
G
m
(
x
i
)
第
二
种
:
y
i
!
=
G
m
(
x
i
)
即: Zm=∑y=Gm(x)Wmie−αm+∑y≠Gm(x)Wmieαm=(1−em)exp−αm+emexpαm=2e(m1−em)−−−−−−−−√=1−4r2m−−−−−−−−√ Z m = ∑ y = G m ( x ) W m i e − α m + ∑ y ≠ G m ( x ) W m i e α m = ( 1 − e m ) exp − α m + e m exp α m = 2 e m ( 1 − e m ) = 1 − 4 r 2 m
其中
em为误分类权重之和(误分类率),rm=12−em
e
m
为
误
分
类
权
重
之
和
(
误
分
类
率
)
,
r
m
=
1
2
−
e
m
定理:在二分问题中Adaboost的训练误差为:
∏m=1MZm=∏m=1M[2em(1−em)−−−−−−−−−√=∏m=1M(1−4r2m)−−−−−−−−√≤exp(−2∑m=1Mr2m)
∏
m
=
1
M
Z
m
=
∏
m
=
1
M
[
2
e
m
(
1
−
e
m
)
=
∏
m
=
1
M
(
1
−
4
r
m
2
)
≤
exp
(
−
2
∑
m
=
1
M
r
m
2
)
前三项展开Zm可得,后两项由ex和1−x−−−−−√在x=0时使用泰勒公式展开推导可得 前 三 项 展 开 Z m 可 得 , 后 两 项 由 e x 和 1 − x 在 x = 0 时 使 用 泰 勒 公 式 展 开 推 导 可 得
又由公式:
zm=2em(1−em)−−−−−−−−−√
z
m
=
2
e
m
(
1
−
e
m
)
带入更新训练数据的权值分布中可得
重点:
当Gm(xi)=yi时,Wm+1,i=Wmi2(1−em)当Gm(xi)!=yi时,Wm+1,i=Wmi2em
当
G
m
(
x
i
)
=
y
i
时
,
W
m
+
1
,
i
=
W
m
i
2
(
1
−
e
m
)
当
G
m
(
x
i
)
!
=
y
i
时
,
W
m
+
1
,
i
=
W
m
i
2
e
m
定理: AdaBoost的训练误差界
1N∑i=1N(G(xi)≠yi)≤1N∑iexp(−yif(xi))=∏mZm 1 N ∑ i = 1 N ( G ( x i ) ≠ y i ) ≤ 1 N ∑ i exp ( − y i f ( x i ) ) = ∏ m Z m
其中:
G(x)=sign(f(x))=sign(∑m=1MαmGm(x),最终分类器f(x)=∑m=1MαmGm(x),系数∗基本分类器Zm=∑i=1NWmiexp(−alphamyiGm(xi)),规范化因子
G
(
x
)
=
s
i
g
n
(
f
(
x
)
)
=
s
i
g
n
(
∑
m
=
1
M
α
m
G
m
(
x
)
,
最
终
分
类
器
f
(
x
)
=
∑
m
=
1
M
α
m
G
m
(
x
)
,
系
数
∗
基
本
分
类
器
Z
m
=
∑
i
=
1
N
W
m
i
exp
(
−
a
l
p
h
a
m
y
i
G
m
(
x
i
)
)
,
规
范
化
因
子
证明:
当G(xi)≠yi时,yif(xi)≤0,此时exp(−yif(xi))≥1
当
G
(
x
i
)
≠
y
i
时
,
y
i
f
(
x
i
)
≤
0
,
此
时
exp
(
−
y
i
f
(
x
i
)
)
≥
1
后两项由
Zm定义式可证明
Z
m
定
义
式
可
证
明
Zm=∑i=1NWmiexp(−alphayiGm(xi))
Z
m
=
∑
i
=
1
N
W
m
i
exp
(
−
a
l
p
h
a
y
i
G
m
(
x
i
)
)
将该式变化可得:
Zm+1,i=Wmiexp(−alphamyiGm(xi)
Z
m
+
1
,
i
=
W
m
i
exp
(
−
a
l
p
h
a
m
y
i
G
m
(
x
i
)
可证:
1N∑iexp(−yif(xi))=1N∑iexp(−∑m=1MαmGm(xi)yi=∑iW1i∏m=1Mexp(−αmyiGm(xi))=Z1∑iW1i∏m=1Mexp(−αmyiGm(xi))=∏m=1MZm
1
N
∑
i
exp
(
−
y
i
f
(
x
i
)
)
=
1
N
∑
i
exp
(
−
∑
m
=
1
M
α
m
G
m
(
x
i
)
y
i
=
∑
i
W
1
i
∏
m
=
1
M
exp
(
−
α
m
y
i
G
m
(
x
i
)
)
=
Z
1
∑
i
W
1
i
∏
m
=
1
M
exp
(
−
α
m
y
i
G
m
(
x
i
)
)
=
∏
m
=
1
M
Z
m
该定理说明: 在AdaBoost中只关注训练误差界的上确界,并且通过不断的选取适当的 Gm G m 可以使得 Zm Z m 最小,从而使得训练误差最小
参考文献
《统计学习方法》李航著;