ML(4.1): CART在R中应用

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

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

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

策决树剪枝


  • 剪枝的原因是避免决策树过拟合(Overfitting)样本,算法生成的决策树非常详细并且庞大,每个属性都被详细地加以考虑,决策树的树叶节点所覆盖的训练样本都是“纯”的。因此用这个决策树来对训练样本进行分类的话,你会发现对于训练样本而言,这个树表现完好,误差率极低且能够正确得对训练样本集中的样本进行分类。训练样本中的错误数据也会被决策树学习,成为决策树的部分,但是对于测试数据的表现就没有想象的那么好,或者极差,这就是所谓的过拟合(Overfitting)问题。Quinlan教授试验,在数据集中,过拟合的决策树的错误率比经过简化的决策树的错误率要高
  • 剪枝可以分为两种 :预剪枝(Pre-Pruning)和后剪枝(Post-Pruning)
    1. PrePrune:预剪枝,及早的停止树增长
    2. PostPrune:后剪枝,在已生成过拟合决策树上进行剪枝,可以得到简化版的剪枝决策树
  • 剪枝的准则是如何确定决策树的规模,可以参考的剪枝思路有以下几个:
    1. 用训练集合(Training Set)和验证集合(Validation Set),来评估剪枝方法在修剪结点上的效用
    2. 使用所有的训练集合进行训练,但是用统计测试来估计修剪特定结点是否会改善训练集合外的数据的评估性能,如使用Chi-Square(Quinlan,1986)测试来进一步扩展结点是否能改善整个分类数据的性能,还是仅仅改善了当前训练集合数据上的性能
    3. 使用明确的标准来衡量训练样例和决策树的复杂度,当编码长度最小时,停止树增长,如MDL(Minimum Description Length)准则
  • Reduced-Error Pruning(REP,错误率降低剪枝):该剪枝方法考虑将树上的每个节点作为修剪的候选对象,决定是否修剪这个结点有如下步骤组成:
    1. 删除以此结点为根的子树
    2. 使其成为叶子结点
    3. 赋予该结点关联的训练数据的最常见分类
    4. 当修剪后的树对于验证集合的性能不会比原来的树差时,才真正删除该结点
  • 因为训练集合的过拟合,使得验证集合数据能够对其进行修正,反复进行上面的操作,从底向上的处理结点,删除那些能够最大限度的提高验证集合的精度的结点,直到进一步修剪有害为止(有害是指修剪会减低验证集合的精度)。EP是最简单的后剪枝方法之一,不过在数据量比较少的情况下,REP方法趋于过拟合而较少使用。这是因为训练数据集合中的特性在剪枝过程中被忽略,所以在验证数据集合比训练数据集合小的多时,要注意这个问题。  尽管REP有这个缺点,不过REP仍然作为一种基准来评价其它剪枝算法的性能。它对于两阶段决策树学习方法的优点和缺点提供了了一个很好的学习思路。由于验证集合没有参与决策树的创建,所以用REP剪枝后的决策树对于测试样例的偏差要好很多,能够解决一定程度的过拟合问题。
  • Pessimistic Error Pruning(PEP,悲观剪枝):计算规则在它应用的训练样例上的精度,然后假定此估计精度为二项式分布,并计算它的标准差。对于给定的置信区间,采用下界估计作为规则性能的度量。这样做的结果,是对于大的数据集合,该剪枝策略能够非常接近观察精度,随着数据集合的减小,离观察精度越来越远。该剪枝方法尽管不是统计有效的,但是在实践中有效。
  • 剪枝过程特别重要,所以在最优决策树生成过程中占有重要地位。有研究表明,剪枝过程的重要性要比树生成过程更为重要,对于不同的划分标准生成的最大树(Maximum Tree),在剪枝之后都能够保留最重要的属性划分,差别不大。反而是剪枝方法对于最优树的生成更为关键。

车型推测示例


  • #安装载入所需软件包

    #安装"mboost", "rpart","maptree"
    #install.packages("mboost")
    #install.packages("rpart")
    #install.packages("maptree")
    
    library(parallel)
    library(stabs)
    library(mboost)
    library(rpart)
    library(cluster)
    library(maptree)
  • 建立公式、构建树模型
    > #建立公式
    > myformular= car~ dv + da + soc + sht + ht
    > #用rpart命令构建树模型,结果存在fit变量中
    > model.CART=rpart(myformular,data=trainData)
    > #保存模型数据
    > #save(model.CART,file = "E:\\RML\\CART.rda")
  • 测试结果集预测及结果查看

    > #测试结果集预测
    > results.CART <- predict(model.CART, newdata = testData,type="class")
    > # 查看预测的结果
    > table(results.CART,testData$car,dnn = c("predict","actual"))
                      actual
    predict            \x87\xff NJL6129BEV4 SDL6122EVG SDL6831EVG WG6820BEVH 雅LXML6809JEV10C
      \x87\xff                0           0          0          0          0                0
      NJL6129BEV4             1       24534          0          0          0                0
      SDL6122EVG              0           0      55249          0          0             1455
      SDL6831EVG              0           0          0      58978          1                0
      WG6820BEVH              0           0          0          0      49681                0
      雅LXML6809JEV10C        0           9          1          0          0            18043

完整示例代码


  • setwd("E:\\RML")
    cars <- read.csv("car1.csv",header=TRUE,stringsAsFactors=TRUE)
    
    #查看数据分布
    table(cars$car)
    
    #从cars数据集中随机抽70%定义为训练数据集,30%为测试数据集
    ind <- sample(2, nrow(cars), replace=TRUE, prob=c(0.7, 0.3))
    trainData <- cars[ind==1,]
    testData <- cars[ind==2,]
    
    #安装"mboost", "rpart","maptree"
    #install.packages("mboost")
    #install.packages("rpart")
    #install.packages("maptree")
    
    library(parallel)
    library(stabs)
    library(mboost)
    library(rpart)
    library(cluster)
    library(maptree)
    
    #建立公式
    myformular= car~ dv + da + soc + sht + ht
    #用rpart命令构建树模型
    model.CART=rpart(myformular,data=trainData)
    #保存模型数据
    #save(model.CART,file = "E:\\RML\\CART.rda")
    
    #测试结果集预测
    results.CART <- predict(model.CART, newdata = testData,type="class")
    # 查看预测的结果
    table(results.CART,testData$car,dnn = c("predict","actual"))
时间: 2024-10-23 01:15:10

ML(4.1): CART在R中应用的相关文章

ML(3.1): NavieBayes在R中的应用

朴素贝叶斯方法是一种使用先验概率去计算后验概率的方法, 具体见上一节. 算法包:e1071 函数:navieBayes(formule,data,laplace=0,...,subset,na.action=na.pass) Formule: 公式的形式:class~x1 + x2 + .....  相互作用是不允许的 data: 数据集 lapace: 正面双控制拉普拉期平滑.默认值(0)禁用拉普拉斯平滑.它的思想非常简单,就是对没类别下所有划分的计数为1,这样如果训练样本集数量充分大时,并不

R中读取EXCEL 数据的方法

最近初学R语言,在R语言读入EXCEL数据格式文件的问题上遇到了困难,经过在网上搜索解决了这一问题,下面归纳几种方法,供大家分享: 第一:R中读取excel文件中的数据的路径: 假定在您的电脑有一个excel文件,原始的文件路径是:D:\work\data\1 如果直接把这个路径拷贝到R中,就会出现错误,原因是: \是escape character(转义符),\\才是真正的\字符,或者用/ 因此,在R中有两种方法读取该路径: 1:在R中输入一下路径:D:\\work\\data\\1     

【转】R中有关数据挖掘的包

下面列出了可用于数据挖掘的R包和函数的集合.其中一些不是专门为了数据挖掘而开发,但数据挖掘过程中这些包能帮我们不少忙,所以也包含进来. 1.聚类 常用的包: fpc,cluster,pvclust,mclust 基于划分的方法: kmeans, pam, pamk, clara 基于层次的方法: hclust, pvclust, agnes, diana 基于模型的方法: mclust 基于密度的方法: dbscan 基于画图的方法: plotcluster, plot.hclust 基于验证的

R语言编程艺术(2)R中的数据结构

本文对应<R语言编程艺术>第2章:向量:第3章:矩阵和数组:第4章:列表:第5章:数据框:第6章:因子和表 ========================================================================= R语言最基本的数据类型就是向量(vector),单个数值和矩阵都是向量的一种特例. 声明:R中不需要声明变量,但是注意函数式语言的特性,如果读写向量中的元素时,R事先不知道对象是向量的话,则函数没有执行的对象.如下代码是无法工作的: y[1]

R中按组数据分析

如下的一组数据: age group 1 23.0883 1 2 25.8344 1 3 29.4648 1 4 32.7858 2 5 33.6372 1 6 34.9350 1 7 35.2115 2 8 35.2115 2 9 35.2115 2 10 36.7803 1 如果想要对两组数据分别进行均值和求和,最简单的想法是按类做分组的子矩阵,但是太麻烦. 如果要得到下面的结果:group mean sd 1 34.5 5.6 2 32.3 4.2 ...今天学到的方法是:plyr包中的d

R 中正则

在R中使用正则,可以指定perl=True 构造复杂正则,这也是本人比较熟悉在方式 > word <- c('a1:23asdfjaskldjf<->aa:112xzvasoiffncx909<->bb:23asdfjaskldjfAAA') > pattern<- 'bb.*(?=(<->|$))' > (gregout <- gregexpr(pattern,word,perl=TRUE)) [[1]] [1] 45 attr(,

简单介绍一下R中的几种统计分布

统计学上分布有很多,在R中基本都有描述.因能力有限,我们就挑选几个常用的.比较重要的简单介绍一下每种分布的定义,公式,以及在R中的展示. 下面先列举各种分布: rnorm(n, mean=0, sd=1) 高斯(正态)分布rexp(n, rate=1) ?指数分布rgamma(n, shape, scale=1) γ分布 rpois(n, lambda) Poisson分布rweibull(n, shape, scale=1) Weibull分布 rcauchy(n, location=0, s

R语言学习中的小bug:R中矩阵相乘错误于A %*% B: 需要数值/复数矩阵/矢量参数

遇到了小bug: R中矩阵相乘错误于A %*% B: 需要数值/复数矩阵/矢量参数 看到网上别人的做法,发现了用class(A)和class(B)之后才发现,是因为读入的时候数据的类型不对,A.B的类型并不是matrix,才导致了这个问题. 用as.matrix来变型一下,就OK了. R语言学习中的小bug:R中矩阵相乘错误于A %*% B: 需要数值/复数矩阵/矢量参数,布布扣,bubuko.com

R语言基础知识学习(四):R中的画图函数--plot()函数

plot()函数是R中基本的画x-y两个变量的函数,其用法如下为:plot(x, y, ...) 例如:首先我用runif()函数产生了两列随机数:x1,y1,然后用plot()函数直接画图: > x1 <- round(runif(20,min = 0 ,max = 100))> x1 [1] 90 84 86 86 28 43 86 76 90 76 14 62 40 52 87 57 88 17[19] 10 27> y1 <- round(runif(20,min =