19

在我的数据集中,泄漏有两个值 1,0。只有大约 300 行有 1,另外 569378 行中有 1。这就是我在 rpart 结果中只有 1 个根的原因。

我该如何解决这个问题?

fm.pipe<-Leakage~PipeAge +PipePressure

> printcp(CART.fit)

Regression tree:
rpart(formula = fm.pipe, data = Data)

Variables actually used in tree construction:
character(0)

Root node error: 299.84/569378 = 0.00052661

n= 569378 

         CP nsplit rel error xerror xstd
1 0.0033246      0         1      0    0
4

3 回答 3

28

如果自变量没有提供足够的信息来生长树,则可能没有办法“解决”这个问题。例如,请参见 rpart.control 的帮助:“不会尝试任何不会将整体缺乏拟合度降低 cp 的分割。 ”您可以尝试放松控制参数,但不能保证会导致超越根的树。

CART.fit <- rpart(formula=fm.pipe, data=Data, control=rpart.control(minsplit=2, minbucket=1, cp=0.001))
于 2014-01-08T11:57:15.720 回答
8

我不确定我是否理解您的行长问题,但这是该错误通常的含义:

rpart 使用约束来构建决策树。这是来自文档的默认值:

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

你需要减少这些限制。正如@JeanVAdams 所说,从最低限度开始:

rpart(formula=fm.pipe, data=Data, 
      control=rpart.control(minsplit=1, minbucket=1, cp=0.001))

你的第一个结果可能会有太多的节点,所以你必须慢慢地建立这些限制,直到你得到一个大小合适的树。


如果你仍然感到困惑,这里有一个例子

假设您正在查看杂货店数据,并且想要查看最受欢迎的购物时间树。只有24小时,对吧?所以自变量只有 24 种可能性。Rpart 有一个条件说

“一个节点必须至少有20个东西我才能拆分它。”

这意味着您的节点甚至不能拆分一次。即使您有 150 亿行,也只有 24 种可能的拆分方式。它可能比这更复杂,但这是一个很好的起点。

实际上,我正在研究这个确切的问题(按小时计算的购物者),我不得不将我的约束保持在尽可能低的水平,以便完全得到一棵树:

rpart(formula=fm.pipe, data=Data, control=rpart.control(minsplit=1, minbucket=1, cp=0.001))

于 2016-11-12T15:52:36.190 回答
1

我的数据集仅包含 14 行。尝试使用以下代码:

dtm<-rpart(playtennis~., weathe_train, method="class", minsplit=2, minbucket=1)
于 2016-06-07T10:58:25.780 回答