繁体   English   中英

R GLM 预测误差 - 因子有新水平

[英]R GLM Predict Error - factor has new levels

我正在使用 glm() 进行基本的逻辑回归

我将数据分成训练和测试,使用 glm 构建 model,然后尝试使用测试数据运行 predict()。

这是代码

data = read.csv('2022_data.csv')

data$A= as.factor(data$A)
data$B= as.factor(data$B)

# split train and test
df = sort(sample(nrow(data), nrow(data)*.8))
df_train = data[df,]
df_test = data[-df,]

# create model
model1 = glm(attrition ~ A+ B + C + D + E, data = df_train, family = binomial)

predict1 = predict(model1, df_test1, type='response')

我遇到

Error in model.frame.default(Terms, newdata, na.action = na.action, xlev = object$xlevels) : 
  factor A has new levels 

我知道这个错误消息意味着 A 列中有一个值未在 model 中计算。但我检查了训练和测试数据中 A 列的唯一值,两者具有完全相同的值

levels(as.factor(df_test1$A))
levels(as.factor(df_train$A))

两者都返回

[1] ""  "N" "Y"

我不确定我在这里错过了什么

更新:

我检查了 model 的摘要,它只显示了 A 的 1 个虚拟变量(即 AY,以 AN 为参考)。 似乎值“”被 glm() 自动排除。 我将“”更改为“无数据”,但仍然出现这种情况。

关于因素的事情是所有级别都存储在列的元数据中,无论该值是否在子集化后实际反映在数据中。

因此,您可能已经使用三个级别中的两个级别而不是第三个级别的数据进行了训练,然后显示在测试数据中。 (没有看到数据和基本的描述性统计我不能确定)

但是,您可以通过运行以下代码来测试它以了解我的意思:

x<-as.factor(x<-c("A", "B", "C","A", "B", "C","A", "B", "C","A", "B", "C"))
y<-x[1:2]

当你看看为什么这是你所看到的

 y
[1] A B
Levels: A B C

如果您想确保级别的所有值都反映在您的训练系数中,您应该使用分层抽样方法来考虑数据中的所有级别。

我会在你 go 之前检查太多,看是否每个级别都有足够的意义。

> table(x)
x
A B C 
4 4 4 

如果您只有几个一级,那么您需要考虑更大的问题。

您说您将“”更改为“无数据”。 如果您作为字符/字符串进行操作,那么您需要重新调整该因素以将新类别考虑在内。

这可能是最好的,如果你使用:

library(plyr)
revalue(x, c(""="no_data"))

这种转换方式将考虑现有级别,因为它会更改该级别的值。 即使您更改了一组值,级别的值仍然存在。 它会持续到你重新升级)

我会尝试

library(forcats)
df_test1$A <- df_test1$A |> fct_drop(c(""))

您的错误是指 model.frame.default。 我在想是不是在model中没有使用“”级别,然后在测试中发现。 或者您可能希望将“”级别分配给“Y”或“N”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM