博主前段时间学习了AdaBoost,写这篇博客一方面是为了加深自己的理解及记忆,另一方面是给初学者以启发,同时也便于大家一起交流学习。
弱学习器常指泛化性能略优于随机猜测的学习器,例如在二分类问题上精度略高于50%的分类器。强学习器常指泛化性能比较好的学习器。
集成学习通过构建并结合多个个体学习器(基学习器\组件学习器)来完成学习任务。一般而言,通常所说的集成学习中的多个学习器都是同质(同种类型)的"弱学习器",将这些弱学习器基于某种策略集成后获得一个精度较好的"强学习器"。
根据个体学习器的生成方式,目前的集成学习方法大致可分为两类,即:个体学习器之间存在强依赖关系,必须串行生成的序列化方法,代表是Boosting;以及个体学习器之间不存在强依赖关系,可同时生成的并行化方法,代表是Bagging和随机森林。
给定包含m个样本的数据集,使用自助采样法采样出T个含m个训练样本的采样集。然后基于每个采样集训练出一个基学习器,得到T个基学习器。当新数据到来时,输入T个基学习器会得到T个结果,最后若是分类任务则使用简单投票法,若是回归任务则使用简单平均法。
先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本的分布进行调整,使得先前基学习器做错的训练样本在后续受到更多关注,然后基于调整后的训练样本来训练下一个基学习器;如此重复进行直至基学习器数目达到事先指定的值T,最终将这T个基学习器进行加权组合。
关于错误率ε的理解:
传统意义理解错误率: ε = 未正确分类的样本 / 所有样本数目
此算法错误率也是这样计算的,但是由于该算法为每个数据赋予一个权值,故稍有些区别。
举个例子,在以前没有权重时(其实是平局权重时),一共10个点时,对应每个点的权重都是0.1,分错1个,错误率就加0.1;分错3个,错误率就是0.3。现在,每个点的权重不一样了,还是10个点,权重依次是[0.01,0.01,0.01,0.01,0.01,0.01, 0.01,0.01,0.01,0.91],如果分错了第1一个点,那么错误率是0.01,如果分错了第3个点,那么错误率是0.01,要是分错了最后一个点,那么错误率就是0.91。
关于每轮训练弱学习器的训练集:
采用自助采样法生成训练集,即有放回抽样。
关于每轮权值更新:
每次更新是对初始样本集的权重更新,被基分类器误分类样本的权值
增大,而被正确分类样本的权值减小;
使用交叉验证确定超参数(弱分类器数目T)的最优值及强分类器与弱分类器结果比较。
数据集大小为 770 * 9,1~8列为描述属性,第9列为label属性(取值为{1,-1})。
弱分类器为决策树桩,即单层决策树。
for T in range(1, 51):
axis_x.append(T)
accCount = 0.0
# 对每个 T 使用 5-折交叉验证
for k in range(5):
index = []
# 筛选训练集索引
for i in range(5):
if i != k:
index.append(i)
x_train = np.concatenate((x_split[index[0]], x_split[index[1]], x_split[index[2]], x_split[index[3]]), 0)
y_train = np.concatenate((y_split[index[0]], y_split[index[1]], y_split[index[2]], y_split[index[3]]), 0)
x_test = x_split[k]
y_test = y_split[k]
# prepare test and train data
x_train = x_train.transpose()
x_test = x_test.transpose()
# train
ada = AdaBoost(x_train, y_train)
ada.train(T)
# predict
y_pred = ada.pred(x_test)
acc = accuracy_score(y_test, y_pred)
阅读到这里,这篇博客就要结束了,感谢大家阅读,有任何问题可在下方评论,欢迎大家交流,如需转载,请注明出处,谢谢!
最后附上完整代码链接:http://download.csdn.net/download/qq_35874169/12062570,无下载积分的可私信博主发邮箱。