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
  • 对比资源占用如下图:
  • 对比正确率
原文地址:https://www.cnblogs.com/tgzhu/p/6723284.html