You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言glm预测报错:factor has new levels问题排查求助

逻辑回归predict()报错:factor A存在新水平的排查与解决

问题描述

使用glm()做逻辑回归时,划分训练集和测试集后,基于训练集建模,对测试集调用predict()时报错:

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

检查训练集和测试集的A列因子水平,结果一致:

levels(as.factor(df_test1$A))
levels(as.factor(df_train$A))
# 输出均为:[1] ""  "N" "Y"

但查看模型摘要发现,A仅生成了虚拟变量AY(以AN为参考),空字符串水平被自动排除,将""改为"no data"后问题仍存在。

用户代码如下:

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')

排查方向与解决方法

1. 检查训练集里实际存在的A水平(不是仅看levels)

用table()查看训练集A列各水平的样本数,确认空字符串(或"no data")水平是否真的有样本:

table(df_train$A)

如果输出里没有""(或"no data")的条目,说明训练集里这个水平的样本要么被默认的na.omit(缺失值处理)删掉了,要么本来就没有。这种情况下模型根本没学习到这个水平的信息,测试集里出现就会报错。

2. 强制对齐训练集与测试集的因子水平

即使两边levels显示一致,也可能存在测试集因子水平的内部属性和训练集不匹配的情况,手动把测试集的A列因子水平和训练集对齐:

# 先统一替换空字符串
df_train$A[df_train$A == ""] = "no_data"
df_test$A[df_test$A == ""] = "no_data"

# 重新转成因子,强制对齐水平
df_train$A = factor(df_train$A, levels = c("no_data", "N", "Y"))
df_test$A = factor(df_test$A, levels = levels(df_train$A))

重新建模后再尝试预测。

3. 检查建模时的样本过滤情况

查看模型实际使用的训练样本,确认空字符串水平的样本是否被排除:

# 查看模型用到的数据集
head(model1$model)
# 统计模型数据里A的水平分布
table(model1$model$A)

如果这里没有""或"no_data",说明这些样本因为其他变量有缺失值,被默认的na.action = na.omit删掉了。解决方法:

  • 提前处理所有变量的缺失值(比如填充、删除)
  • 建模时设置na.action = na.exclude(保留缺失值的位置,预测时对应位置返回NA)

4. 检查代码笔误

注意到用户代码里测试集变量是df_test,但预测时写的是df_test1,如果是笔误导致用了其他数据集,也可能出现这个错误,先确认变量名一致。


内容的提问来源于stack exchange,提问作者Orvin Bellamy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 10:35:47