【问题标题】:r caret predict returns fewer output than inputr caret predict 返回的输出少于输入
【发布时间】:2015-08-21 18:39:53
【问题描述】:

我使用caret 训练了下面的rpart 模型。

trainIndex <- createDataPartition(d$Happiness, p=.8, list=FALSE)
dtrain <- d[trainIndex, ]
dtest <- d[-trainIndex, ]
fitControl <- trainControl(## 10-fold CV
  method = "repeatedcv", number=10, repeats=10)
fitRpart <- train(Happiness ~ ., data=dtrain, method="rpart",
                trControl = fitControl)
testRpart <- predict(fitRpart, newdata=dtest)

dtest 包含 1296 个观测值,因此我希望 testRpart 生成长度为 1296 的向量。相反,它长 1077,即短 219。

当我对dtest 的前 220 行运行预测时,我得到的预测结果为 1,因此它始终短 219。

任何解释为什么会这样,以及我可以做些什么来获得一致的输入输出?

编辑: d 可以从 here 加载以重现上述内容。

【问题讨论】:

  • 你能让你的例子可重现吗?
  • 已编辑提供链接以加载上述d (2.3 MB)。当要复制的数据相当大时,不确定 SO 上的协议是什么:我将它放在我的 Dropbox 中,这可能不是永久性的。有没有更好的办法?
  • 最好的方法是使用一个小的数据集,这样就可以发布了。您看到的行为应该很容易通过一小部分数据或一些模拟数据产生。

标签: r r-caret rpart


【解决方案1】:

我下载了您的数据并找到了解释差异的原因。

如果您只是从数据集中删除缺失值,则输出的长度匹配:

testRpart <- predict(fitRpart, newdata = na.omit(dtest))

注意nrow(na.omit(dtest)) 是 1103,length(testRpart) 是 1103。所以你需要一个解决缺失值的策略。请参阅?predict.rpart 和 na.action 参数的选项以选择您想要的内容。

【讨论】:

  • 这不是很有帮助,因为在很多情况下都需要缺失值。看来predict.train没有办法处理这个问题。
  • 与 Josh 提到的类似,如果您需要使用插入符号中的 predict.train 生成预测,只需传递 na.passna.action 即可:testRpart &lt;- predict(fitRpart, newdata = dtest, na.action = na.pass)
  • @davedgd 这应该是一个单独的答案!正是我想要的,添加 na.action = na.pass 对我来说似乎是最好的解决方案,并且完全解决了我的问题。
  • @Ricky:感谢您的建议——我已经继续添加它作为可见性的单独答案!
【解决方案2】:

我在预测函数中使用“newx”而不是“newdata”时遇到了类似的问题。使用“newdata”(或什么都不用)解决我的问题,希望它能帮助其他使用 newx 并遇到同样问题的人。

【讨论】:

    【解决方案3】:

    与 Josh 提到的类似,如果您需要使用插入符号中的 predict.train 生成预测,只需传递 na.passna.action

    testRpart &lt;- predict(fitRpart, newdata = dtest, na.action = na.pass)

    注意:根据 Ricky 对 Josh 上述答案的评论将其移至单独的答案以提高知名度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-24
      • 2018-11-04
      • 1970-01-01
      相关资源
      最近更新 更多