1

我有一些通过非随机过程生成 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

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

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

因此,它似乎正在放弃对新数据进行预测的 NA。理想情况下,我希望在测试和训练数据集中的每一行上看到预测的 1-1 关系,但我不知道为什么 GBM 只会为训练返回这个,而不是测试集. 谢谢你的帮助。

4

1 回答 1

4

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

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

test.pred <- predict(fit, newdata = test, type="prob",na.action =NULL)
nrow(test)
#[1] 14
nrow(test.pred)
#[1] 14
于 2015-12-17T01:40:30.383 回答