【问题标题】:Decision tree in rr中的决策树
【发布时间】:2016-05-18 05:05:36
【问题描述】:

我的数据集是:

x=data.frame(v1=c(97 ,  97 ,  85 ,  84 ,  90 ,  80 ,  81 ,  90 ,  80,    70,    90 ,   90,    90    ,95  ,  88 ,   99),
+ v2=c(99  , 91  , 91   ,83  , 99  , 95  , 74  , 88  , 82   , 80   , 96  ,  87  ,  92 ,   96  ,  88,    95),
+ v3=c( 89   ,93  , 87  , 80  , 96  , 96  , 75  , 90  , 78,    86  ,  92    ,88  ,  80,    88   , 98    ,98),
+ v4=c( 89  , 97   ,91  , 86  , 95 ,  95  , 89 ,  88  , 75,    82   , 99,    92  ,  95,    92   , 90,    98),
+ v5=c( 99   ,90  , 93   ,91  , 90  , 90  , 77  , 92  , 85,    76  ,  90,    96  ,  90,    90   , 90,    92))
> x
   v1 v2 v3 v4 v5
1  97 99 89 89 99
2  97 91 93 97 90
3  85 91 87 91 93
4  84 83 80 86 91
5  90 99 96 95 90
6  80 95 96 95 90
7  81 74 75 89 77
8  90 88 90 88 92
9  80 82 78 75 85
10 70 80 86 82 76
11 90 96 92 99 90
12 90 87 88 92 96
13 90 92 80 95 90
14 95 96 88 92 90
15 88 88 98 90 90
16 99 95 98 98 92

我使用rpart 包来应用决策树如下:

# Classification Tree with rpart
library(rpart)
fit <- rpart(v5 ~ v1+v2+v3+v4,
              method="class", data=x)

printcp(fit) # display the results 

Classification tree:
rpart(formula = v5 ~ v1 + v2 + v3 + v4, data = x, method = "class")

Variables actually used in tree construction:
character(0)

Root node error: 9/16 = 0.5625

n= 16 

    CP nsplit rel error xerror xstd
1 0.01      0         1      0    0


> summary(fit) # detailed summary of splits

Call:
rpart(formula = v5 ~ v1 + v2 + v3 + v4, data = x, method = "class")
  n= 16 

    CP nsplit rel error xerror xstd
1 0.01      0         1      0    0

Node number 1: 16 observations
  predicted class=90  expected loss=0.5625  P(node) =1
    class counts:     1     1     1     7     1     2     1     1     1
   probabilities: 0.062 0.062 0.062 0.438 0.062 0.125 0.062 0.062 0.062 

绘图树

 # plot tree 
 plot(fit, uniform=TRUE, 
+      main="Classification Tree ")

Error in plot.rpart(fit, uniform = TRUE, main = "Classification Tree ") : 
  fit is not a tree, just a root

 text(fit, use.n=TRUE, all=TRUE, cex=.8)

Error in text.rpart(fit, use.n = TRUE, all = TRUE, cex = 0.8) : 
  fit is not a tree, just a root

我申请 rpart 时出了什么问题?为什么它给我的树图错误?如何解决此错误错误:

fit 不是树,只是根

【问题讨论】:

  • 您是否意识到您的树没有任何分裂并且由单个节点组成?

标签: r tree machine-learning decision-tree


【解决方案1】:

我用您的x 数据框运行了以下代码,得到了如下所示的树:

library(rpart)
library(rattle)
library(rpart.plot)
library(RColorBrewer)

fit <- rpart(v5 ~ v1+v2+v3+v4,
             method="anova", 
             data=x,
             control = rpart.control(minsplit = 6, cp = 0.01))
fancyRpartPlot(fit)  #from RColorBrewer package

注意你的方法应该是anova,因为v5是一个连续变量,你必须覆盖控制参数control = rpart.control(...)来调整树的深度。

【讨论】:

    【解决方案2】:

    您正在使用 RPART 的默认控制参数。使用您的数据集,RPART 无法遵守默认值并创建树(分支拆分)

    rpart.control(minsplit = 20, minbucket = round(minsplit/3), cp = 0.01, 
                  maxcompete = 4, maxsurrogate = 5, usesurrogate = 2, xval = 10,
                  surrogatestyle = 0, maxdepth = 30, ...)
    

    根据数据集调整控制参数。

    例如:

    t <- rpart(formula = v5 ~ v1 + v2 + v3 + v4, data = x, method = anova",control =rpart.control(minsplit = 1,minbucket=1, cp=0))
    

    但请注意,这可能会创建一个过拟合的决策树。

    【讨论】:

      【解决方案3】:

      如果您正在构建分类树,请使用 method="class",如果您正在构建回归树,请使用 method="anova"。看起来你有一个连续的响应,所以你应该构建一个回归树(即 method="anova")。

      【讨论】:

      • Ryan,我运行`method="anova"`,它给了我同样的错误fit is not a tree just a root
      • 我认为绘制树的问题源于模型没有进行任何拆分的事实。在您的输出中,nsplit = 0,因此树中没有分支。因此,没有什么可绘制的。我认为这就是错误的来源。但这并不意味着您的模型有问题。
      • 瑞恩你能告诉我如何解决它。
      • 我建议查看 rpart 上的文档。如果您愿意,您会发现可以更改的不同参数。例如,如果您可以将 cp 的默认值从 0.01 更改为其他值,那么回归树可能会选择实际进行拆分的最佳模型。然后你会有一棵树来绘制
      猜你喜欢
      • 2014-08-21
      • 2014-08-20
      • 2018-07-24
      • 1970-01-01
      • 2014-05-09
      • 1970-01-01
      • 2018-06-11
      • 2014-12-11
      • 2021-12-16
      相关资源
      最近更新 更多