随机森林错误:`[.data.frame`(data ,, all.vars(Terms),drop = FALSE)出错:选择了未定义的列

时间:2016-12-17 10:17:16

标签: r time-series rstudio random-forest

我正在尝试使用随机森林构建时间序列模型。但是,每次运行代码时都会遇到同样的错误:

[.data.frame中的错误(data ,, all.vars(Terms),drop = FALSE):   选择了未定义的列

我非常了解随机森林背后的大部分理论,但是使用它并没有真正运行很多代码。

这是我的代码:

library(randomForest)
library(caret)

fitControl <- trainControl(
  method = "repeatedcv",
  number = 10,
  repeats = 1,
  classProbs = FALSE,
  verboseIter = TRUE,
  preProcOptions=list(thresh=0.95,na.remove=TRUE,verbose=TRUE))

set.seed(1234)

rf_grid <- expand.grid(mtry = c(1:6))

fit <- train(df.ts[,1]~.,
         data=df.ts[,2:6],
         method="rf",
         preProcess=c("center","scale"),
         tuneGrid = rf_grid,
         trControl=fitControl,
         ntree = 200,
         metric="RMSE")

对于可重现的示例,您可以在以下数据集上运行代码:

 df.ts <- structure(list(ts.t = c(315246, 219908, 193014, 231970, 248246, 
 + 247112, 268218, 263637, 264306, 245730, 256548, 227525, 304468,
 + 229614, 202985), ts1 = c(233913, 315246, 219908, 193014, 231970, 
 +  248246, 247112, 268218, 263637, 264306, 245730, 256548, 227525, 
 +   304468, 229614), ts2 = c(253534, 233913, 315246, 219908, 193014, 
 +   231970, 248246, 247112, 268218, 263637, 264306, 245730, 256548, 
 +  227525, 304468), ts3 = c(226650, 253534, 233913, 315246, 219908, 
 +  193014, 231970, 248246, 247112, 268218, 263637, 264306, 245730, 
 +  256548, 227525), ts6 = c(213268, 242558, 250554, 226650, 253534, 
 +  233913, 315246, 219908, 193014, 231970, 248246, 247112, 268218, 
 + 263637, 264306), ts12 = c(333842, 210279, 193051, 174262, 216712, 
 +  144327, 213268, 242558, 250554, 226650, 253534, 233913, 315246, 
 +  219908, 193014)), .Names = c("ts.t", "ts1", "ts2", "ts3", "ts6", "ts12"), row.names = 13:27, class = "data.frame")

我希望有人能发现我的错误

谢谢,

4 个答案:

答案 0 :(得分:2)

公式应与data中变量的名称相对应。例如。 y ~ .使用y中的所有其他变量预测data。或者,您可以使用y = df.ts[,1], x = df.ts[, -1]代替formuladata

因此正确的语法是:

fit <- train(ts.t ~ .,
             data=df.ts,
             method="rf",
             preProcess=c("center","scale"),
             tuneGrid = rf_grid,
             trControl=fitControl,
             ntree = 200,
             metric="RMSE") 

答案 1 :(得分:0)

library(randomForest)
library(caret)

fitControl <- trainControl(
  method = "repeatedcv",
  number = 10,
  repeats = 1,
  classProbs = FALSE,
  verboseIter = TRUE,
  preProcOptions=list(thresh=0.95,na.remove=TRUE,verbose=TRUE))

set.seed(1234)

rf_grid <- expand.grid(mtry = c(1:6))

fit <- train(ts.t~.,
         data=df.ts[,1:6],
         method="rf",
         preProcess=c("center","scale"),
         tuneGrid = rf_grid,
         trControl=fitControl,
         ntree = 200,
         metric="RMSE")

请注意,因变量应该在提供的用于训练模型的数据集中,而不是编写df.ts [,1],正确的表示法是与所有列相关的列名称“ ts.t”提供的数据集,即2到6。 这可以解决您的错误。 干杯!

答案 2 :(得分:0)

只需使用caret::train(var~., Data)代替train(Data$var~., data=Data),那应该可以。

答案 3 :(得分:0)

对我来说,使用classProbs = TRUE代替classProbs = FALSE也可以。