在 R 中使用带有 GBM 的 NA 预测新数据

Predicting new data with NAs with GBM in R

我有一些数据通过非随机过程生成 NA。通常,这涉及用户未手动输入数据或各种自动化作业的系统问题。由于这种 GBM 模型对我有吸引力,因为它们明确处理 NA 值,而不是插补。但是,我在让 GBM 输出对我的测试集中包含 NA 的行的预测时遇到了问题。这是 Iris 的一个工作示例:

library(missForest)
library(caret)

set.seed(1)
iris.na <- prodNA(iris, noNA = 0.1)
iris.na$Species <- ifelse(iris.na$Species == "setosa", "setosa", "other")
iris.na$Species <- as.factor(iris.na$Species)

set.seed(1)
train.idx <- createDataPartition(y = iris.na$Species, p = .90, list = FALSE)
train <- iris.na[ train.idx,]
test <- iris.na[ -train.idx,]
rm(train.idx)

fitControl <- trainControl(method = "cv", number = 5)
#fitControl <- trainControl(method = "oob")
fit <- train(Species ~ ., data = train, method = "gbm",
         trControl = fitControl,
         verbose = FALSE)

现在,样本预测按照我对 GBM 的预期工作,并且我收到了每一行的一个预测。

train.pred <- predict(fit, type="prob")
nrow(train)
#[1] 136
nrow(train.pred)
#[1] 136

但是,移动到样本外测试数据不会 return 对每一行进行一个预测。正如您在下面看到的,包含 NA 的每一行都不是 return 预测。

test.pred <- predict(fit, newdata = test, type="prob")
nrow(test)
#[1] 14
nrow(test.pred)
#[1] 10

所以它似乎正在放弃 NA 以预测新数据。理想情况下,我希望在测试和训练数据集中的每一行上看到 1-1 的预测关系,但我不知道为什么 GBM return 这仅用于训练,但不是测试集。谢谢你的帮助。

默认情况下,predict.train 将删除 NA:na.action = na.omit。您可以通过查看函数(在控制台中键入 predict.train)来了解这一点。另请注意,na.action 仅用于新数据(第 16 行的 !is.null(newdata))而不用于火车数据。

因此,解决方案是将 ,na.action =NULL 添加到预测中。

test.pred <- predict(fit, newdata = test, type="prob",na.action =NULL)
nrow(test)
#[1] 14
nrow(test.pred)
#[1] 14