我发现插入符处理丢失值的一些意外行为与已保存的返回预测有关。
具体而言,如果指定了savePredictions = TRUE
,则将保存验证期间进行的所有预测,并与字段rowIndex
一起返回,该字段指定行对应的原始输入的索引。
但是,如果输入中缺少值,并且未指定na.action
,则这些行索引与原始输入的行索引不匹配。据推测,它们与过滤数据的行排成一行。
此外,文档指出默认na.action
为na.fail
,但我没有发现这种情况。
我在下面提供了一个最小的工作示例:
library(caret)
data = data.frame(
ID = c(1, 2, 3, 4, 5, 6),
predictor = c(1, 2,NA, 4, 5, 6)
)
ctl <- trainControl(method='cv', number=5, savePredictions=T)
fit <- train(data$ID ~ .,
data=data,
method='rpart',
trControl=ctl,
tuneLength = 1,
tuneGrid = data.frame(.cp = 0))
comparison <- fit$pred
comparison$ID <- data[fit$pred$rowIndex,]$ID
print(comparison)
在输出中,我们希望obs
始终等于rowIndex
,但事实并非如此。相反,我们得到以下输出:
pred obs rowIndex cp Resample ID
1 4.25 1 1 0 Fold1 1
2 4.00 2 2 0 Fold2 2
3 3.50 4 3 0 Fold3 3
4 3.25 5 4 0 Fold4 4
5 3.00 6 5 0 Fold5 5
请注意,从第3行开始(输入中出现NA),索引会被移位。
指定na.action = na.omit
后,我会看到相同的结果,但输出与na.action = na.roughfix
一样符合预期。