我有一些通过非随机过程生成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会仅为训练返回这一点,但没有测试集。谢谢你的帮助。
答案 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