欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

R 集成算法② bagging

程序员文章站 2022-07-13 08:52:23
...

集成算法

如前文所述,集成算法是目前比较常用的,通过组合弱分类器以达到强分类的效果的方法。其中常见的未套袋法(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

  • 结果如下:


    R 集成算法② bagging
  • 选取error值最低时的classifiers为16,设定16为minfinal:


iris.bagging <- bagging(Species ~ ., data=train, mfinal=16)
importanceplot(iris.bagging )  
 
  • 结果:


    R 集成算法② 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)。