speedglm调用predict返回全NA,能否修改对象类适配常规predict?
关于speedglm配合predict返回全NA的问题分析与解决
我来帮你捋捋这个问题哈,你遇到的两个核心问题:predict返回全NA、speedglm对象类的疑问,咱们一个个说清楚:
一、为什么predict返回全NA?
这是因为speedglm默认不会保存训练数据的模型矩阵和因子水平信息,而你的预测数据mtcars_test里的gear是因子类型,当模型没有保存训练时的因子水平时,无法正确匹配测试数据的因子类别,直接返回NA。
解决这个问题很简单,只需要在调用speedglm时加上model=TRUE参数,让模型保存必要的训练数据信息:
library(speedglm) mtcars2<-mtcars mtcars2$gear<-as.factor(mtcars2$gear) mtcars_train<-mtcars2[1:10,] mtcars_test<-mtcars2[11:nrow(mtcars2),] # 加上model=TRUE参数,保存训练数据的必要信息 model<-speedglm(formula = cyl ~ gear,data = mtcars_train,family=poisson(link="log"), model=TRUE) pred<-predict(object = model, newdata = mtcars_test) pred
运行这段代码就能得到正常的预测结果了。
二、能不能修改speedglm对象的类来用常规predict?
答案是绝对不可以。虽然speedglm对象的类是"speedglm" "speedlm",但它的内部结构和标准glm对象差异很大——speedglm是为了高效处理大规模数据设计的,做了很多内存优化,省略了glm里的一些冗余组件。强行修改类(比如用class(model) <- "glm")会导致后续调用predict.glm时出现各种报错,因为必要的结构根本不存在。
其实speedglm本身就有对应的预测方法predict.speedglm,你之前调用的predict其实已经在自动调用这个方法了,只是因为没加model=TRUE才出问题,完全不需要改用常规的predict函数。
补充优化方案
如果你担心保存整个模型矩阵会占用过多内存,还有另一种办法:提前确保测试数据的因子水平和训练集完全一致。比如可以先把训练集的因子水平同步到测试集:
# 同步训练集与测试集的因子水平 mtcars_test$gear <- factor(mtcars_test$gear, levels = levels(mtcars_train$gear)) # 即使不加model=TRUE,也能正常预测(但还是推荐加model=TRUE更稳妥) model<-speedglm(formula = cyl ~ gear,data = mtcars_train,family=poisson(link="log")) pred<-predict(object = model, newdata = mtcars_test)
内容的提问来源于stack exchange,提问作者HeyJane
相关产品推荐
相关产品推荐

