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
相关产品推荐
相关产品推荐

