决策树模型中最为流行的是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
  • 对比资源占用如下图:
  • 对比正确率

ML(4.1): R C4.5的更多相关文章

  1. ML: 聚类算法R包-对比

    测试验证环境 数据: 7w+ 条,数据结构如下图: > head(car.train) DV DC RV RC SOC HV LV HT LT Type TypeName 1 379 85.09 ...

  2. ML: 聚类算法R包-模糊聚类

    1965年美国加州大学柏克莱分校的扎德教授第一次提出了'集合'的概念.经过十多年的发展,模糊集合理论渐渐被应用到各个实际应用方面.为克服非此即彼的分类缺点,出现了以模糊集合论为数学基础的聚类分析.用模 ...

  3. ML: 聚类算法R包 - 模型聚类

    模型聚类 mclust::Mclust RWeka::Cobweb mclust::Mclust EM算法也称为期望最大化算法,在是使用该算法聚类时,将数据集看作一个有隐形变量的概率模型,并实现模型最 ...

  4. ML: 聚类算法R包-网格聚类

    网格聚类算法 optpart::clique optpart::clique CLIQUE(Clustering In QUEst)是一种简单的基于网格的聚类方法,用于发现子空间中基于密度的簇.CLI ...

  5. ML: 聚类算法R包-层次聚类

    层次聚类 stats::hclust stats::dist    R使用dist()函数来计算距离,Usage: dist(x, method = "euclidean", di ...

  6. ML: 聚类算法R包-K中心点聚类

    K-medodis与K-means比较相似,但是K-medoids和K-means是有区别的,不一样的地方在于中心点的选取,在K-means中,我们将中心点取为当前cluster中所有数据点的平均值, ...

  7. ML(4.3): R Random Forest

    随机森林模型是一种数据挖掘模型,常用于进行分类预测.随机森林模型包含多个树形分类器,预测结果由多个分类器投票得出. 决策树相当于一个大师,通过自己在数据集中学到的知识对于新的数据进行分类.俗话说得好, ...

  8. ML(4.2): R CART

    CART模型 :即Classification And Regression Trees.它和一般回归分析类似,是用来对变量进行解释和预测的工具,也是数据挖掘中的一种常用算法.如果因变量是连续数据,相 ...

  9. ML: 聚类算法R包 - 密度聚类

    密度聚类 fpc::dbscan fpc::dbscan DBSCAN核心思想:如果一个点,在距它Eps的范围内有不少于MinPts个点,则该点就是核心点.核心和它Eps范围内的邻居形成一个簇.在一个 ...

随机推荐

  1. 获取和设置消息队列的属性msgctl,删除消息队列

    消息队列的属性保存在系统维护的数据结构msqid_ds中,用户可以通过函数msgctl获取或设置消息队列的属性. int msgctl(int msqid, int cmd, struct msqid ...

  2. duilib 实现 XML重用(item完全重合的CList)

    最近做一个项目,界面库用的是duilib. 软件首页的左侧是一个机型列表,右侧是机型信息及其他信息,点击左侧的机型,右边跟着变为对应的信息. 由于右侧信息比较复杂,还有进度条什么的,所以如果右侧只用一 ...

  3. 重置delphi Printer对象

    http://www.efg2.com/Lab/Library/UseNet/1999/0714b.txt From: "Nick Ryan" <nick@avatardes ...

  4. 使用OpenSSL生成证书并配置Https

    1.密钥.证书请求.证书概要说明 在证书申请签发过程中,客户端涉及到密钥.证书请求.证书这几个概念.我们以申请证书的流程说明三者的关系.客户端(相对于CA)在申请证书的时候,大体上有三个步骤: 第一步 ...

  5. easyui datagrid 诡异的无法显示问题

    举个应用场景的例子来说明: 在采购单的编辑页面,上方为采购单自身的属性信息,下方使用tabs控件,加入两个tab页,分别为采购明细列表(DataGrid)和审核记录列表(DataGrid),即一个主业 ...

  6. Flappy Bird背后的故事

    更多有价值的互联网文章:晓煦分享(http://www.ihuxu.com/share) 由越南游戏工程师阮哈东(Nguyen Ha Dong)开发的Flappy Bird这款游戏,画面不算精致且看起 ...

  7. 将本地的一个新项目上传到GitHub上新建的仓库中去

    转载: 如何将本地的一个新项目上传到GitHub上新建的仓库中去 踩过的坑: 1.在git push时报错 error: RPC failed; curl 56 SSL read: error:000 ...

  8. Final阶段第1周/共1周 Scrum立会报告+燃尽图 02

    作业要求[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2481] 版本控制:https://git.coding.net/liuyy08 ...

  9. php session和cookie知识

  10. [Scala]Scala学习笔记七 正则表达式

    1. Regex对象 我们可以使用scala.util.matching.Regex类使用正则表达式.要构造一个Regex对象,使用String类的r方法即可: val numPattern = &q ...