R 集成算法② bagging

作者: 柳叶刀与小鼠标 | 来源:发表于2018-01-09 16:00 被阅读26次

    集成算法

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

    相关文章

      网友评论

        本文标题:R 集成算法② bagging

        本文链接:https://www.haomeiwen.com/subject/rnfgnxtx.html