我有一个训练数据集,我是从中随机采样来训练R中的模型的。

sampleSize <- floor(0.1 * nrow(trainingDataFrame))
train_index <- sample(seq_len(nrow(trainingDataFrame)), size = sampleSize)
trainDF <- trainingDataFrame[train_index,]
fit <- train(dependentVariable ~ ., data=trainDF,
             trControl = trainControl(method = "cv",number = 10),method="lm")


然后,我将使用该模型对单独的测试数据集中的predict值。但是,对于我的测试数据集中的某些行,有一个因数字段,偶尔会出现训练集中未遇到的值,因为我是随机从训练集中采样的。这将导致"factor ... has new levels"错误。

我实际上是在多次迭代中重复进行此样本训练预测过程,因此每个测试数据集记录最终都将有一些有效的预测。因此,就我的用例而言,某些记录在任何特定的迭代中都是不可实现的,这实际上是可以的。我不想不必将有关领域从模型训练中排除。

而是可以指示predict函数为我提供predict或这些无效行的其他默认值吗?

最佳答案

这是一种可能性。

关键是定义您自己的predict函数,该函数将factor对象中lm变量与newdata中的变量的级别进行比较。然后,我们仅对那些具有匹配predict级别的观测值进行factor,并为所有其他观测值返回NA

我将演示如何使用mtcars数据。


首先,让我们创建由一个数字响应(mpg)和3个类别预测变量(cylgearcarb)组成的样本数据。

library(tidyverse)
df <- mtcars %>%
    select(mpg, cyl, gear, carb) %>%
    mutate_at(vars(-mpg), as.factor)

然后,我们在观测的训练数据集上训练模型,该训练数据集对于cylgear仅具有一些(但不是全部)因子水平。

df.train <- df %>% filter(cyl %in% c(4, 6) & gear %in% c(3, 4))

我们拟合一个简单的线性模型。

fit <- lm(mpg ~ ., data = df.train)

现在,我们定义一个自定义函数,该函数将newdata分为以下观察结果:(1)可以对factor进行响应的匹配predict级别,以及(2)我们将对NA进行响应的“新颖”级别。

所有类别变量的factor级别都作为fit$xlevels存储在list中。我们使用purrr::imappurrr::reduce(..., intersect)来确定newdata级别匹配的来自factor的那些观测的行索引。

my.predict <- function(fit, newdata) {
    lvls <- fit$xlevels
    idx <- reduce(imap(lvls, ~which(newdata[, .y] %in% .x)), intersect)
    res <- rep(NA, nrow(newdata))
    res[idx] <- predict(fit, newdata = newdata[idx, ])
    return(res)
}

我们在完整的df数据集中确认结果:

df$pred <- my.predict(fit, df)
df
#    mpg cyl gear carb  pred
#1  21.0   6    4    4 19.75
#2  21.0   6    4    4 19.75
#3  22.8   4    4    1 29.10
#4  21.4   6    3    1 19.75
#5  18.7   8    3    2    NA
#6  18.1   6    3    1 19.75
#7  14.3   8    3    4    NA
#8  24.4   4    4    2 24.75
#9  22.8   4    4    2 24.75
#10 19.2   6    4    4 19.75
#11 17.8   6    4    4 19.75
#12 16.4   8    3    3    NA
#13 17.3   8    3    3    NA
#14 15.2   8    3    3    NA
#15 10.4   8    3    4    NA
#16 10.4   8    3    4    NA
#17 14.7   8    3    4    NA
#18 32.4   4    4    1 29.10
#19 30.4   4    4    2 24.75
#20 33.9   4    4    1 29.10
#21 21.5   4    3    1 21.50
#22 15.5   8    3    2    NA
#23 15.2   8    3    2    NA
#24 13.3   8    3    4    NA
#25 19.2   8    3    2    NA
#26 27.3   4    4    1 29.10
#27 26.0   4    5    2    NA
#28 30.4   4    5    2    NA
#29 15.8   8    5    4    NA
#30 19.7   6    5    6    NA
#31 15.0   8    5    8    NA
#32 21.4   4    4    2 24.75

关于r - 我可以指示预测忽略R中的错误行吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51736684/

10-12 21:55