Adaboost 的思想
Adaboost的想法是通过多个弱分分类器,组成一个效果很好的分类器。
对于第一个分类器分类错误的点,他们的权重变大,使得后面的分类器不得不去关注这些权值更大的点。然后,多个分类器累加在一起,实现一个比较好的效果。
Adaboost 一个例子
- 基本的步骤是:
- 求每个点的权重
- 求一个基分类器
- 求在这个基分类器上面的误差
- 得出基分类器的权重
- 更新每个点的权重,跳到step1
我们按照这个例子,走一遍流程。
step1 计算权重
对于刚开始,数据的每个权值都是 1/10。即 D1=(w11,w12,.....,w110),每一个的权重都是1/10 。-
step2 计算基分类器
(在这里做了一个简单的假设,就是基分类器是一个弱分类器,由x<v 或 x>v 产生)。在权重分布是D1的数据集上面,v=2.5是一个最好的情况。所以,基分类器是:
-
step3 计算当前分类器的误差
误差的计算公式是:
仔细一看,不就是对分类错误的点的权重求和吗?嗯嗯,是的!
于是,这个的有三个点被分类错误,每一个点的权重都是0.1,所以分类错误的权重是0.1*3 = 0.3 -
step4 求解当前基分类器的权重
那么这个的权重是:
-
step5 更新训练数据的权值分布
公式里面的Zm指的是:
这个公式看起来稍稍复杂一点,但是细看一下也不是很复杂。对于当前点的权重的更新,我们写一段小代码,求解一下。
import math
def creatdataset():
x=[0,1,2,3,4,5,6,7,8,9]
y=[1,1,1,-1,-1,-1,1,1,1,-1]
return x,y
#a指的是基分类器的权重
def update_weight(a,weight,x,y,y_pre):
res=[]
for i in range(0,10):
res.append(weight[i] * math.exp(-a*y[i]*y_pre[i]))
new_weight = [float(ele)/sum(res) for ele in res]
return new_weight
if __name__=="__main__":
#原始的权重
weight = [0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1]
#数据集
x,y= creatdataset()
#基分类器的分类效果
y_pre = [1,1,1,-1,-1,-1,-1,-1,-1,-1]
# 更新权重
new_weight = update_weight(0.4236,weight,x,y,y_pre)
print (new_weight)
输出结果:
[0.07143206644239734, 0.07143206644239734, 0.07143206644239734,
0.07143206644239734, 0.07143206644239734, 0.07143206644239734,
0.1666585116344062, 0.1666585116344062, 0.1666585116344062,
0.07143206644239734]
这个是第一个分类器的分类效果。我们再往下计算。重复进行刚才的计算。
对于第二个分类器:
对于第三个分类器:
(sign函数是一个分段函数)
这就是adaboost的一个例子。这个多个弱分类器组合出一个强分类器的优点是可以明显提高模型的泛化能力(也就是不会出现决策树那样的过拟合的情况)。
参考文献:
《统计学习方法》