集成算法
如前文所述,集成算法是目前比较常用的,通过组合弱分类器以达到强分类的效果的方法。其中常见的未套袋法(bagging)和提升法(boosting)
-
套袋(Bagging)法:集成中的每个模型投票权重都相同。套袋法利用训练集中随机取出的子集来训练每个模型。这种方法有助于降低方差并有助于避免过拟合。最常见的例子就是随机森林。
-
由于adabag包既可以使用提升法,也可以利用套袋法。继续学习adabag包:
####################################
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)
pb<-tkProgressBar("进度","已完成 %",0,100)
u <- 1:20
for(i in u){
info<- sprintf("已完成 %d%%", round(i*100/length(u)))
setTkProgressBar(pb, i*100/length(u), sprintf("进度 (%s)", info),info)
data.bagging <- bagging(Species ~ ., data=train, mfinal=i)
data.predbagging <- predict.bagging(data.bagging,newdata = test)
error[i] <- data.predbagging$error
}
> error
error
1 0.07142857
2 0.03571429
3 0.03571429
4 0.07142857
5 0.04464286
6 0.03571429
7 0.01785714
8 0.04464286
9 0.03571429
10 0.02678571
11 0.02678571
12 0.03571429
13 0.02678571
14 0.01785714
15 0.03571429
16 0.01785714
17 0.02678571
18 0.03571429
19 0.03571429
20 0.03571429
##############################################
##############################################
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.1) +
xlab("Classifiers Numbers")
p1 <- p + theme_base()+
theme(panel.grid = element_blank())+
theme(axis.title = element_text(face = "bold"))
p1
-
结果如下:
-
选取error值最低时的classifiers为16,设定16为minfinal:
iris.bagging <- bagging(Species ~ ., data=train, mfinal=16)
importanceplot(iris.bagging )
-
结果:
-
结论:通过与boosting对比,发现在iris数据集中,boosting算法优于bagging。
-
由于bagging算法中最常用的时随机森林,尝试通过randomForest()建立随机森林。
随机森林
概述
随机森林(Random Forest)是一种基于分类树(classification tree)的算法(Breiman,2001)。这个算法需要模拟和迭代,被归类为机器学习中的一种方法。上世纪八十年代Breiman等人发明了分类和回归树(Classification and Regression Tree
简称CART)的算法(Breimanet al.,1984),通过反复二分数据进行分类或回归,计算量大大降低。2001年Breiman和Cutler借鉴贝尔实验室的Ho所提出的随机决策森林(random decision forests)(Ho,1995,1998)的方法,把分类树组合成随机森林(Breiman,2001),即在变量(列)的使用和数据(行)的使用上进行随机化,生成很多分类树,再汇总分类树的结果。后来Breiman在机器学习杂志上发表了他和Cutler设计的随机森林的算法(Breiman,2001)。这篇文章被大量引用(根据Google Scholar,该文章至2013年被引用9000多次),成为机器学习领域的一个里程碑。
优缺点
随机森林的优点是:
- 它的学习过程很快。在处理很大的数据时,它依旧非常高效。随机森林可以处理大量的多达几千个的自变量(Breiman,2001)。
- 现有的随机森林算法评估所有变量的重要性,而不需要顾虑一般回归问题面临的多元共线性的问题。
- 它包含估计缺失值的算法,如果有一部分的资料遗失,仍可以维持一定的准确度。
- 随机森林中分类树的算法自然地包括了变量的交互作用(interaction)(Cutler, et al.,2007),即X1的变化导致X2对Y的作用发生改变。交互作用在其他模型中(如逻辑斯蒂回归)因其复杂性经常被忽略。随机森林对离群值不敏感,在随机干扰较多的情况下表现稳健。
- 随机森林不易产生对数据的过度拟合(overfit)(Breiman,2001),然而这点尚有争议(Elith and Graham,2009)。随机森林通过袋外误差(out-of-bag error)估计模型的误差。对于分类问题,误差是分类的错误率;对于回归问题,误差是残差的方差。随机森林的每棵分类树,都是对原始记录进行有放回的重抽样后生成的。每次重抽样大约1/3的记录没有被抽取(Liaw,2012)。没有被抽取的自然形成一个对照数据集。所以随机森林不需要另外预留部分数据做交叉验证,其本身的算法类似交叉验证,而且袋外误差是对预测误差的无偏估计(Breiman,2001)。
随机森林的缺点:
- 它的算法倾向于观测值较多的类别(如果昆虫B的记录较多,而且昆虫A、B和C间的差距不大,预测值会倾向于B)。
- 另外,随机森林中水平较多的分类属性的自变量(如土地利用类型 > 20个类别)比水平较少的分类属性的自变量(气候区类型<10个类别)对模型的影响大(Deng et al.,2011)。
网友评论