Plotting a decision tree gives an error: dim(X) must have a positive length

Plotting a decision tree gives an error: dim(X) must have a positive length

我尝试使用以下数据集制作决策树:

RESULT EXPG_HOME R_HOME_3DAY
 1      1.321   0.20
 2      1.123   0.30
 1      0.762   0.26

如果我试试这个:

library(rpart)
tree <- rpart(RESULT ~ EXPG_HOME, df, method="class")
fancyRpartPlot(tree)

成功了。但是当我尝试时:

tree <- rpart(RESULT ~ R_HOME_3DAY, df, method="class")
fancyRpartPlot(tree)

我收到以下错误:

Error in apply(model$frame$yval2[, yval2per], 1, function(x) x[1 + x[1]]) : 
dim(X) must have a positive length

想知道这里出了什么问题吗?

EXPG_HOME 和 R_HOME_3DAY 都是数字。

这就是我使用相关变量得到的结果:

> table(df$R_HOME_3DAY)

      0         0.1 0.133333333 0.166666667         0.2 0.233333333 
     21          65          14          10         194          53 
0.266666667         0.3 0.333333333 0.366666667         0.4 0.433333333 
     63         248         107         185         369         169 
0.466666667         0.5 0.533333333 0.566666667         0.6 0.633333333 
    334         351         184         382         317         213 
0.666666667         0.7 0.733333333 0.766666667         0.8 0.833333333 
    336         251         112         217          92          64 
0.866666667         0.9 0.933333333 
     83          20           5 

问题是你没有得到树,只有根(节点):)

> tree <- rpart(RESULT ~ EXPG_HOME, df, method="class")
> fancyRpartPlot(tree)
Error in apply(model$frame$yval2[, yval2per], 1, function(x) x[1 + x[1]]) : 
  dim(X) must have a positive length
> plot(tree)
Error in plot.rpart(tree) : fit is not a tree, just a root
> tree
n= 3 

node), split, n, loss, yval, (yprob)
      * denotes terminal node

1) root 3 1 1 (0.6666667 0.3333333) *

发生的事情是自变量没有提供足够的信息来种植你的树。 rpart 包通过设置默认限制来限制树生长的深度。以下来自?rpart.control.

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

所以,您可能想放宽控制参数如下:

tree <- rpart(RESULT ~ EXPG_HOME, df, method="class",
              control = rpart.control(minsplit = 1, 
                                      minbucket = 1, 
                                      cp = 0.001)

这将极有可能产生一棵包含许多节点的树。从这里开始,您可以尝试使用参数来获得像样的树。