我有一些通过非随机过程生成 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 只会为训练返回这个,而不是测试集. 谢谢你的帮助。