CART模型 :即Classification And Regression Trees。它和一般回归分析类似,是用来对变量进行解释和预测的工具,也是数据挖掘中的一种常用算法。如果因变量是连续数据,相对应的分析称为回归树,如果因变量是分类数据,则相应的分析称为分类树。决策树是一种倒立的树结构,它由内部节点、叶子节点和边组成。其中最上面的一个节点叫根节点。 构造一棵决策树需要一个训练集,一些例子组成,每个例子用一些属性(或特征)和一个类别标记来描述。构造决策树的目的是找出属性和类别间的关系,一旦这种关系找出,就能用它来预测将来未知类别的记录的类别。这种具有预测功能的系统叫决策树分类器。

CART算法是一种二分递归分割技术,把当前样本划分为两个子样本,使得生成的每个非叶子结点都有两个分支,因此CART算法生成的决策树是结构简洁的二叉树。由于CART算法构成的是一个二叉树,它在每一步的决策时只能 是“是”或者“否”,即使一个feature有多个取值,也是把数据分为两部分。在CART算法中主要分为两个步骤

  • 将样本递归划分进行建树过程
  • 用验证数据进行剪枝

在R包中,有如下的算法包可完成CART 分类计算,如下,分别以鸢尾花数据集为例进行验证

  •  rpart::rpart
  •  tree::tree

rpart::rpart


  • rpart包中有针对CART决策树算法提供的函数,比如rpart函数,以及用于剪枝的prune函数
  • rpart函数的基本形式:rpart(formula,data,subset,na.action=na.rpart,method.parms,control,...)
  • 安装所需R包
    install.packages("mboost")
    install.packages("rpart")
    install.packages("maptree")
  • 数据集划分训练集和测试,比例是2:1
    set.seed(1234)
    index <-sample(1:nrow(iris),100)
    iris.train <-iris[index,]
    iris.test <-iris[-index,]
  • 构建CART模型,查看模型结构,在结构中能看到很多有意思的内容

    library(rpart)
    model.CART <-rpart(Species~.,data=iris.train)
    str(model.CART)
  • control:对树进行一些设置

    1. minsplit是最小分支节点数,这里指大于等于20,那么该节点会继续分划下去,否则停止
    2. minbucket:树中叶节点包含的最小样本数
    3. maxdepth:决策树最大深度
    4. xval:交叉验证的次数
    5. cp (complexity parameter),指某个点的复杂度,对每一步拆分,模型的拟合优度必须提高的程度。(即是每次分割对应的复杂度系数)
  • variable.importance:变量的重要性

    > model.CART$variable.importance
    Petal.Width Petal.Length Sepal.Length Sepal.Width
    60.58917 56.38914 39.79006 26.00328
  • 预测数据: vector: 预测数值   class: 预测类别  prob: 预测类别的概率
    > p.rpart <- predict(model.CART, iris.test,type="class")
    > table(p.rpart,iris.test$Species) p.rpart setosa versicolor virginica
    1 12 0 0
    2 0 21 3
    3 0 0 14
  • 可视化,需要rpart.plot包
#可视化决策树
#install.packages("rpart.plot")
library(rpart.plot)
rpart.plot(model.CART)
  • 效果如下图:
  • CART剪枝:
    1. prune函数可以实现最小代价复杂度剪枝法,对于CART的结果,每个节点均输出一个对应的cp
    2. prune函数通过设置cp参数来对决策树进行修剪,cp为复杂度系数
    3. 可以用下面的办法选择具有最小xerror的cp的办法:
      model.CART.pru<-prune(model.CART, cp= model.CART$cptable[which.min(model.CART$cptable[,"xerror"]),"CP"])
      model.CART.pru$cp
  • CART剪枝后的模型进行预测

    p.rpart1<-predict(model.CART.pru,iris.test,type="class")
    table(p.rpart1,iris.test$Species)

tree::tree


  • 数据集划分训练集和测试见上节
  • 构建模型,查看生成模型结构,如下图,错误率为:0.02667
    > #install.packages("tree")
    > library(tree)
    > ir.tr <- tree(Species~., iris)
    > summary(ir.tr) Classification tree:
    tree(formula = Species ~ ., data = iris)
    Variables actually used in tree construction:
    [1] "Petal.Length" "Petal.Width" "Sepal.Length"
    Number of terminal nodes: 6
    Residual mean deviance: 0.1253 = 18.05 / 144
    Misclassification error rate: 0.02667 = 4 / 150
  • 查看生成决策树及图例
    plot(ir.tr)
    text(ir.tr,pretty = 0)
  • 结果验证
    > tree_predict <- predict(ir.tr,iris.test,type="class")
    > table(tree_predict,iris.test$Species) tree_predict setosa versicolor virginica
    setosa 12 0 0
    versicolor 0 20 1
    virginica 0 1 16
  • 用误分类率来剪枝,做交叉验证,代码如下:
    > cv.carseats=cv.tree(ir.tr, FUN=prune.misclass)
    > str(cv.carseats)
    List of 4
    $ size : int [1:5] 6 4 3 2 1
    $ dev : num [1:5] 11 11 10 96 121
    $ k : num [1:5] -Inf 0 2 44 50
    $ method: chr "misclass"
    - attr(*, "class")= chr [1:2] "prune" "tree.sequence"
  • 可视化模型

    par(mfrow=c(1, 2))
    plot(cv.carseats$size, cv.carseats$dev, type="b")
    plot(cv.carseats$k, cv.carseats$dev, type="b")
  • 图表示例

  • 随着树的节点越来越多(树越来越复杂),deviance逐渐减小,然后又开始增大
  • 随着对模型复杂程度的惩罚越来越重(k越来越大),deviance逐渐减小,然后又开始增大 (此图暂看不起来)
  • 从左边的图可以看出,当树的节点个数为 3 时,deviance达到最小,画出3个叶子节点的树
    #画出3个叶子节点的树
    par(new = TRUE)
    prune.carseats <- prune.misclass(ir.tr, best=3)
    plot(prune.carseats)
    text(prune.carseats, pretty=0)
  • 图示例
  • 测试及结果
    > tree.pred  <- predict(prune.carseats, iris.test, type="class")
    > summary(tree.pred)
    setosa versicolor virginica
    12 24 14
    > table(tree.pred,iris.test$Species) tree.pred setosa versicolor virginica
    setosa 12 0 0
    versicolor 0 21 3
    virginica 0 0 14

ML(4.2): R CART的更多相关文章

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

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

  2. ML(4.3): R Random Forest

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

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

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

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

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

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

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

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

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

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

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

  8. ML(4.1): R C4.5

    决策树模型中最为流行的是C4.5算法,  该类算法70年代末,J Ross Quinlan提出ID3算法,此算法的目的在于减少树的深度.但是忽略了叶子数目的研究.1993年,Quinlan本人以ID3 ...

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

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

随机推荐

  1. 自定义Spark Partitioner提升es-hadoop Bulk效率——续

    对于es 2.4版本,要能定制spark partitioner需要如下方式启动spark shell: spark-2.0.0-bin-hadoop2.6/bin/spark-shell --jar ...

  2. gdb调试分析多线程死锁

    转载: http://blog.chinaunix.net/uid-30343738-id-5757210.html #include <stdio.h> #include <pth ...

  3. PHP:第一章——php中的变量001 /普通赋值/引用赋值/php变量的检查与销毁

    <?php //php中的变量: //php中的变量用一个美元符$后面紧跟着变量名来表示,变量名是区分大小写的. //有效的变量只能是字母或者下划线开头,后面跟任意数量的字母.数字.或者下划线. ...

  4. oracle创建dblink方法

    当用户要跨本地数据库,访问另外一个数据库表中的数据时,本地数据库中必须创建了远程数据库的dblink,通过dblink本地数据库可以像访问本地数据库一样访问远程数据库表中的数据.下面讲介绍如何在本地数 ...

  5. Winform中用comboBox来选择显示Dataset中表格数据

    这是一次偷懒的尝试,因为每次都必须打开代码,调试才能看见数据,发现问题.也是借鉴了调试中查看dataset数据的模式,查看不同表格.经历一番研究,总算实现了想要的效果了,故作此一笔记.与人共享. 界面 ...

  6. hdu4348

    题解: 因为卡空间,所以直接到spoj上面去做了 区间修改的线段树 但是加lazy会把之前的操作修改 正确的解法是lazy不下传,只是在当前计算 但是听说可以记录时间的下传,我弱弱不会 代码: #in ...

  7. Solr增删改查索引

    一.添加索引,提交文档 1.如图,我的xml文档有predicate.object字段,这些在Solr配置文档里没有,所以xml文档提交不了 2.在F:\solr-4.10.0\example\sol ...

  8. Schema——demo

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  9. C++中的接口继承和实现继承

    很多人认为,C++中是不存在接口继承的,只有Java.C#这类语言才提供了相应的语法支持. 但是,如同鲁迅说过的某句名言:世上本没有接口继承,用的人多了,才有了接口继承.C++中依然可以实现接口继承, ...

  10. C++ primer 第四版 练习3.13,3.14

    读一组整数到 vector 对象,计算并输出每对相邻元素的 和.如果读入元素个数为奇数,则提示用户后一个元素 没有求和,并输出其值. vector<int> ivec; int ival; ...