zoukankan      html  css  js  c++  java
  • ML(4.1): R C4.5

         决策树模型中最为流行的是C4.5算法,  该类算法70年代末,J Ross Quinlan提出ID3算法,此算法的目的在于减少树的深度。但是忽略了叶子数目的研究。1993年,Quinlan本人以ID3算法为基础研究出C4.5/C5.0算法,C4.5算法在ID3算法的基础上进行了改进,对于预测变量的缺值处理、剪枝技术、派生规则等方面作了较大的改进,既适合于分类问题,又适合于回归问题。在R包中,有如下的算法包可完成C4.5 分类计算,如下,分别以鸢尾花数据集为例进行验证

    • partykit::ctree 
    • RWeka::J48
    • C50:C5.0
    • 总结及对比分析

    partykit::ctree 


    • 所需安装的R包如下:
      install.packages("RWeka")
      install.packages("party")
      install.packages("partykit")
    • 数据集iris包含五个指标萼片长度、萼片宽度、花瓣长度、花瓣宽度、三种花类型, 建立模型
      set.seed(1234)
      #从iris数据集中随机抽70%定义为训练数据集,30%为测试数据集
      ind <- sample(2, nrow(iris), replace=TRUE, prob=c(0.7, 0.3))
      trainData <- iris[ind==1,]
      testData <- iris[ind==2,]
      library(party)
      #建立决策树模型预测花的种类
      myFormula <- Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width
      iris_ctree <- ctree(myFormula, data=trainData)
      # 查看预测的结果
      table(predict(iris_ctree), trainData$Species)
    •  结果如下:

      > table(predict(iris_ctree), trainData$Species)
                  
                   setosa versicolor virginica
        setosa         40          0         0
        versicolor      0         37         3
        virginica       0          1        31
    •  对照数据结构看决策图

      > #输出决策树图
      > head(trainData,10)
         Sepal.Length Sepal.Width Petal.Length Petal.Width Species
      1           5.1         3.5          1.4         0.2  setosa
      2           4.9         3.0          1.4         0.2  setosa
      3           4.7         3.2          1.3         0.2  setosa
      4           4.6         3.1          1.5         0.2  setosa
      6           5.4         3.9          1.7         0.4  setosa
      7           4.6         3.4          1.4         0.3  setosa
      8           5.0         3.4          1.5         0.2  setosa
      9           4.4         2.9          1.4         0.2  setosa
      10          4.9         3.1          1.5         0.1  setosa
      11          5.4         3.7          1.5         0.2  setosa
      > plot(iris_ctree)
    •  输出结果图如下:

    • 对测试集进行预测
      > testPred <- predict(iris_ctree, newdata = testData)
      > table(testPred, testData$Species)
                  
      testPred     setosa versicolor virginica
        setosa         10          0         0
        versicolor      0         12         2
        virginica       0          0        14
    •  在测试集上结果看模型有较好的泛化能力

    RWeka::J48


    • RWeka包在上例已经安装,测试及训练数据见上例
      library(RWeka)  
      library(party)  
      #训练与测试样本见上例
      m1<-J48(Species~.,data=trainData)  
      table(trainData$Species,predict(m1))  
      plot(m1)
    • m1结果如下:
    • 预测结果
      > testPred <- predict(m1, newdata = testData)
      > table(testPred, testData$Species)
                  
      testPred     setosa versicolor virginica
        setosa         10          0         0
        versicolor      0         12         1
        virginica       0          0        15
    • 从结果上看,貌似比ctree训练算法稍强点, 需大的数据来深入对比

    C50:C5.0


    • C5.0 是Ross Quinlan 1998年提出来的,对C4.5做了很多改进,目前他是作为商业机密在售卖。该算法引入了Boosting的算法框架,比前面提到的算法性能更快,对内存的使用更有效,决策树更小等等。更详细的请访问他的个人主页查阅文章http://www.rulequest.com/see5-unix.htmlhttp://rulequest.com/download.html%20
    • 用法:C5.0(formula, data, weights, subset, na.action = na.pass, ...)
      > library(C50)
      > #ls("package:C50")
      > #训练与测试样本见上例
      > m_c50 <- C5.0(Species ~., data = trainData)
      > C5imp(m_c50)
                   Overall
      Petal.Length  100.00
      Petal.Width    64.29
      Sepal.Length    0.00
      Sepal.Width     0.00
    •  plot(m_c50) 输出图结果如下:

    • 从图上可发现建树差异,预测结果正确率:
      > c50_pred <- predict(m_c50,newdata = testData)
      > table(c50_pred, testData$Species)
                  
      c50_pred     setosa versicolor virginica
        setosa         10          0         0
        versicolor      0         12         2
        virginica       0          0        14

    总结及对比分析


    • 上几节仅是对不同包的算法进行了介绍,数据量太小,比较不出在资源占用、正确率方面的差异,下面以较大数据的情况,对这三个包的结果进行对比分析,正确率如下:
    • 其中C50算法中提供的函数,最重要的参数如下:
      > myFormula <- Type ~.
      > m.C50 <- C5.0(myFormula, data = mytrain)
      > C5imp(m.C50)
         Overall
      DV  100.00
      LV   66.07
      LT   51.07
    • 对比资源占用如下图:
    • 对比正确率
  • 相关阅读:
    __attribute__ 总结
    linux文件夹打包命令
    学习ARM的一些基本知识,个人整理
    备忘录之 —— .bashrc(IC工具篇)
    GitHub的基本使用
    02: SocketServer服务
    01: socket模块
    08: python基础练习题
    07: 高阶函数&异常处理
    06: 面向对象
  • 原文地址:https://www.cnblogs.com/tgzhu/p/6723284.html
Copyright © 2011-2022 走看看