考虑一个简单的数据集,分为训练和测试集:
dat <- data.frame(x=1:5, y=c("a", "b", "c", "d", "e"), z=c(0, 0, 1, 0, 1))
train <- dat[1:4,]
train
# x y z
# 1 1 a 0
# 2 2 b 0
# 3 3 c 1
# 4 4 d 0
test <- dat[5,]
test
# x y z
# 5 5 e 1
Run Code Online (Sandbox Code Playgroud)
当我训练逻辑回归模型来预测z使用x并获得测试集预测时,一切都很好:
mod <- glm(z~x, data=train, family="binomial")
predict(mod, newdata=test, type="response")
# 5
# 0.5546394
Run Code Online (Sandbox Code Playgroud)
但是,对于具有"因子具有新级别"错误的等效外观逻辑回归模型,此操作失败:
mod2 <- glm(z~.-y, data=train, family="binomial")
predict(mod2, newdata=test, type="response")
# Error in model.frame.default(Terms, newdata, na.action = na.action, xlev = object$xlevels) :
# factor y has new level e
Run Code Online (Sandbox Code Playgroud)
自从我y从模型方程中删除后,我很惊讶地看到这个错误信息.在我的应用程序中,dat非常宽,所以z~.-y最方便的型号规格.我能想到的最简单的解决方法是y从我的数据框中删除变量,然后使用z~.语法训练模型,但我希望有一种方法来使用原始数据集而无需删除列.
mat*_*t_k 37
您可以尝试mod2$xlevels[["y"]]在模型对象中进行更新
mod2 <- glm(z~.-y, data=train, family="binomial")
mod2$xlevels[["y"]] <- union(mod2$xlevels[["y"]], levels(test$y))
predict(mod2, newdata=test, type="response")
# 5
#0.5546394
Run Code Online (Sandbox Code Playgroud)
另一种选择是从训练数据中排除(但不删除)"y"
mod2 <- glm(z~., data=train[,!colnames(train) %in% c("y")], family="binomial")
predict(mod2, newdata=test, type="response")
# 5
#0.5546394
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
31575 次 |
| 最近记录: |