Boost算法是根据Valiant提出的PAC学习模型衍生得到,是一种可以自适应的改变训练样本的分布,从而使得基分类器聚焦在特殊样本的迭代方法。从基本的Boost算法原理,发展了很多不同的提升算法,如AdaBoost,Gradient Boosting等,本文着重介绍AdaBoost算法。
AdaBoost算法
与Bagging算法(R语言)不同的是,AdaBoost给每一个训练样本赋予一个权值,并且可以在每次提升后,自动调整权值。在从原始数据集抽取自助样本集时,权值可以影响抽样分布。并且此算法对每个基分类器进行加权,而不是使用投票的方式得到最终结果。
算法流程
step1
N=原数据集大小;
k=提升轮数;
w={所有样本初始权值1/N};
step2
step3
for i=1 to k{
根据w生成大小为N的自助样本集D[i];
D[i]上训练一个基分类器C[i];
C[i]对所有原始样本进行分类;
增加错误分类样本权值,减小争取分
类样本权值,得到新的w;
}
根据权重聚合每轮得到的C[i],得到最终
组合分类器;
不同提升算法的差别主要在于:(1)每轮提升后如何修改样本权值;(2)如何聚合基分类器得到最终分类器。Gradient Boosting算法是通过在迭代时,使损失函数在梯度方向上下降,来保证最好的效果。
R语言实现
adabag包中的boosting()函数可以实现AdaBoost算法,此函数中选取的基分类器为分类树。选取线性分类器与性能评价(R语言)中的数据来进行AdaBoost算法的实例演示,并展示了基分类器个数与误差变化关系图。
library(adabag)
library(ggplot2)
target.url <- 'https://archive.ics.uci.edu/ml/machine-learning-databases/undocumented/connectionist-bench/sonar/sonar.all-data'
data <- read.csv(target.url,header = F)
#divide data into training and test sets
set.seed(1500)
index <- sample(nrow(data),0.7*nrow(data))
train <- data[index,]
test <- data[-index,]
#AdaBoost algorithm with different numbers of classifiers
error <- as.numeric()
for(i in 1:20){
data.adaboost <- boosting(V61~., data=train, mfinal=i)
data.pred <- predict.boosting(data.adaboost,newdata = test)
error[i] <- data.pred$error
}
error <- as.data.frame(error)
p <- ggplot(error,aes(x=1:20,y=error))+
geom_line(colour="red", linetype="dashed",size = 1)+
geom_point(size=3, shape=18)+
ylim(0.13,0.45) +
xlab("the number of basic classifiers")+
theme_bw()+
theme(panel.grid = element_blank())+
theme(axis.title = element_text(face = "bold"))
p
图像结果为:
可以看出,随着基分类器增加,误差虽有波动,但有减小趋势,逐渐趋向于0.22左右。
优缺点
1,AdaBoost充分考虑的每个分类器的权重。
2,Boosting通常用于弱学习,即没有分离白噪声的能力。
3,由于倾向于那些被错误分类的样本,Boost技术容易受过拟合影响。
4,训练比较耗时。