【问题标题】:Predicting new data with NAs with GBM in R在 R 中使用带有 GBM 的 NA 预测新数据
【发布时间】:2016-03-23 08:25:51
【问题描述】:

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

【问题讨论】:

    标签: r prediction na r-caret gbm


    【解决方案1】:

    默认情况下,predict.train 将删除 NA:na.action = na.omit。您可以通过查看函数来看到这一点(在控制台中输入predict.train)。另请注意,na.action 仅用于 newdata(第 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
    

    【讨论】:

    • 完美修复。感谢您的帮助!
    猜你喜欢
    • 2016-05-07
    • 1970-01-01
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 2020-05-27
    • 2022-01-11
    相关资源
    最近更新 更多