用R中的GBM用NAs预测新数据

时间:2015-12-17 00:58:02

标签: r prediction na r-caret gbm

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

因此,似乎它会删除NAs以预测新数据。理想情况下,我希望在测试和训练数据集中的每一行都能看到1-1的预测关系,但我不知道为什么GBM会仅为训练返回这一点,但没有测试集。谢谢你的帮助。

1 个答案:

答案 0 :(得分:4)

默认情况下,predict.train会删除NAs: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