首页 > 代码库 > ML(4.1): CART在R中应用

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=http://www.mamicode.com/trainData) 
    > #保存模型数据
    > #save(model.CART,file = "E:\\RML\\CART.rda")
  • 测试结果集预测及结果查看
    > #测试结果集预测
    > results.CART <- predict(model.CART, newdata = http://www.mamicode.com/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=http://www.mamicode.com/trainData) 
    #保存模型数据
    #save(model.CART,file = "E:\\RML\\CART.rda")
    
    
    #测试结果集预测
    results.CART <- predict(model.CART, newdata = http://www.mamicode.com/testData,type="class")
    # 查看预测的结果
    table(results.CART,testData$car,dnn = c("predict","actual"))

     

ML(4.1): CART在R中应用