R 集成算法① adaboost
2018-01-09 本文已影响55人
柳叶刀与小鼠标
集成算法
集成算法(Ensemble method)
是目前数据科学家工具箱的一种重要补充。这个工具非常流行,目前是许多机器学习比赛参赛者的选择策略。通常是通过一系列分类器,一般是决策树,然后对预测值进行投票。总而言之,集成算法不是挑选一个模型,而是通过一定的方式将多个模型组合起来。其中两个重要方法是套袋法(bagging)和提升法(boosting)。
套袋法和提升法
-
套袋(Bagging)法:集成中的每个模型投票权重都相同。套袋法利用训练集中随机取出的子集来训练每个模型。这种方法有助于降低方差并有助于避免过拟合。最常见的例子就是随机森林。
-
提升(Boosting)是一种常用的统计学习方法,在分类问题中,它通过改变训练样本的权重,学习多个分类器(一般是弱分类器),并将这些分类器线性组合,最终提高分类器的性能。Adaboost或者自适应boosting属于Boosting一种,该算法产生于弱分类器来迭代地学习训练集中很大比例的难以分类的样本,对经常分错的样本进行更多的关注(给与更大的权重。)
image
-
训练过程:
从未加权的数据开始,第一个分类器尝试对结果建模。预测正确的样本出现在下一个分类器的训练集中的可能性较小,相反,难以分类的样本将会出现的更频繁。当下一轮的弱分类器被添加后,他们用来训练后面更难的样本。该过程会持续进行,知道达到要求的总误差或者性能不能提高。这时每个分类器的票数会按照他们在建模数据集上的准确度进行加权。
- 代码:
setwd("E:\\Rwork")
library(rpart)
library(caret)
library(adabag)
library(ggplot2)
library(ggthemes)
set.seed(123)
data(iris)
index <- sample(nrow(iris),0.75*nrow(iris))
train <- iris[index,]
test <- iris[index,]
error <- as.numeric()
- 加载包以及划分训练集和测试集
library(tcltk)
u <- 1:20
pb <- tkProgressBar("进度","已完成 %", 0, 100)
for(i in u){
info<- sprintf("已完成 %d%%", round(i*100/length(u)))
setTkProgressBar(pb, i*100/length(u), sprintf("进度 (%s)", info),info)
data.adaboost <- boosting(Species ~ ., data=train, mfinal=i)
data.pred <- predict.boosting(data.adaboost,newdata = test)
error[i] <- data.pred$error
}
close(pb)
##################################################
##################################################
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,0.05) +
xlab("Classifiers Numbers")
p1 <- p + theme_base()+
theme(panel.grid = element_blank())+
theme(axis.title = element_text(face = "bold"))
p1
-
结果如下:
error分布图
- 结论: 用boosting()函数对训练集进行训练。首先定义基分类器个数为1,通过循环依次增加基分类器个数,直至达到20通过增加classifiers可以降低error,但是当number增加到一定范围时,error值将会稳定。
iris.adaboost <- boosting(Species ~ ., data=train, mfinal=10)
importanceplot(iris.adaboost)
-
选取10为mifinal值时,分别显示各变量对模型影响重要性,结果如下: