我有一个训练数据集,我是从中随机采样来训练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个类别预测变量(cyl
,gear
,carb
)组成的样本数据。
library(tidyverse)
df <- mtcars %>%
select(mpg, cyl, gear, carb) %>%
mutate_at(vars(-mpg), as.factor)
然后,我们在观测的训练数据集上训练模型,该训练数据集对于
cyl
和gear
仅具有一些(但不是全部)因子水平。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::imap
和purrr::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/