r中的caret预测函数返回的输出比输入少。

8

我使用 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 来重现上述情况。


你能否让你的例子能够被重现吗? - Josh W.
已编辑以提供上载 d 的链接(2.3 MB)。不确定在 SO 上重现数据的协议是什么:我将其放在我的 Dropbox 中,但这可能不是永久的。有更好的方法吗? - Ricky
最好的方法是使用小数据集,以便可以发布。您所看到的行为应该很容易通过您的数据的一个小子集或一些模拟数据来产生。 - CoderGuy123
3个回答

14

我下载了您的数据并发现了这种偏差的原因。

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

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

注意:nrow(na.omit(dtest))为1103,length(testRpart)为1103。因此,您需要制定处理缺失值的策略。请参阅?predict.rpart和na.action参数的选项,以选择您想要的内容。


1
这并不是很有帮助,因为有许多情况需要缺失值。似乎 predict.train 没有解决这个问题的方法。 - CoderGuy123
1
与Josh所提到的类似,如果您需要使用caret中的predict.train生成预测结果,只需将na.action设置为na.pass即可:testRpart <- predict(fitRpart, newdata = dtest, na.action = na.pass) - davedgd
1
@davedgd 这应该是一个单独的答案!这正是我在寻找的,添加 na.action = na.pass 似乎是最好的解决方案,并完全解决了我的问题。 - Ricky
1
@Ricky:感谢您的建议 - 我已经将其作为单独的答案添加以增加可见性! - davedgd

2

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

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

注意:根据Ricky在上面Josh的回答中的评论,将此移动到单独的答案以增加可见性。


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接