尝试在分类树后进行交叉验证时出错

时间:2019-04-07 19:00:25

标签: r decision-tree

我正在尝试使用tree包运行简单的分类树。我已经从一本教科书中获取了代码,一个接一个地复制,但是不管我做什么,它都行不通。

library(ISLR)
library(tree)
C = Carseats
C$HighSales = ifelse(C$Sales<=8,"No","Yes")
C = C[,-1]

set.seed(2)
train = sample(1:nrow(C), 200)
carseats.test = C[-train,]
high.test = C$HighSales[-train]

tree.carseats = tree(HighSales~., C, subset = train)
tree.predict = predict(tree.carseats, carseats.test, type = "class")
table(tree.predict,high.test)
(93+48)/200

set.seed(3)
cv.cs = cv.tree(tree.carseats, FUN = prune.misclass)

I am getting the following error:

Error in as.data.frame.default(data, optional = TRUE) : 
  cannot coerce class ‘"function"’ to a data.frame

我已经看过该功能的帮助。它需要一个树对象,这就是我放入的对象。

可能是什么问题?该代码与教科书以及引用该书的其他网站相同。

1 个答案:

答案 0 :(得分:1)

有两个问题。一个与tree中的公式有关:

  

公式-公式表达式。左侧(响应)应该是将要拟合回归树时的数值向量,或者是生成分类树时的因子。右侧应该是一系列用+分隔的数字或因子变量;不应有互动条款。两者都有。和-允许:回归树可以包含偏移项。

因此,我们应该改为

C$HighSales <- factor(ifelse(C$Sales <= 8, "No", "Yes"))

接下来,cv.tree处理变量存在问题(请参见here)。做类似的事情

mydf <- C
tree.carseats <- tree(HighSales ~ ., mydf, subset = train)

有效。问题在于,有一个名为C的函数,而cv.tree完全是指该函数,而不是您的数据集。