【问题标题】:Difference in output between predict.rpart and predict.glmpredict.rpart 和 predict.glm 之间的输出差异
【发布时间】:2021-01-29 09:32:03
【问题描述】:

我将数据集拆分为训练和测试样本。然后我在训练数据上拟合一个 logit 模型来预测测试样本的结果。我可以通过两种方式做到这一点:

使用 Tidyverse:

logit_mod <- logistic_reg() %>% 
 set_mode("classification") %>% 
 set_engine("glm") %>%
 fit(y ~ x + z, data=train)
res <- predict(logit_mod, new_data = test, type="prob")

或者使用 GLM 类:

logit_mod <- glm(y ~ x + z, data=train, family='logit')
res <- predict(logit_mod, newdata=test, type="response")

两种方法都给我不同的输出(y 的概率)。虽然模型应该是一样的。提取 logit_mod[["fit"]] 得到的系数与使用 GLM 提取 logit_mod 的系数相同。

为什么第二种方法会给我不同的预测概率?

【问题讨论】:

  • 你可以试试把family = 'logit'改成family = 'binomail'

标签: r glm predict tidymodels


【解决方案1】:

如果您对glm 二项式回归执行predict,您会得到正类的概率,而来自tidymodels 的概率会向上取整。

例如,一个简单的回归,响应为 0/1,1 为正类:

library(tidymodels)
set.seed(111)
df = data.frame(y = factor(rbinom(50,1,0.5)),x=runif(50),z=runif(50))
train = df[1:40,]
test = df[41:50,]

logit_mod <- logistic_reg() %>% 
 set_mode("classification") %>% 
 set_engine("glm") %>%
 fit(y ~ x + z, data=train)
res <- predict(logit_mod, new_data = test, type="prob")

这是第 1 类的预测:

res$.pred_1
       41        42        43        44        45        46        47        48 
0.3186626 0.3931925 0.4259043 0.3651420 0.6670263 0.6732433 0.5844562 0.5584770 
       49        50 
0.6791727 0.7567285

执行glm,你可以看到它完全一样:

fit <- glm(y ~ x + z, data=train, family=binomial)
res2 <- predict(fit, newdata=test, type="response")

res2
       41        42        43        44        45        46        47        48 
0.3186626 0.3931925 0.4259043 0.3651420 0.6670263 0.6732433 0.5844562 0.5584770 
       49        50 
0.6791727 0.7567285 

【讨论】:

    猜你喜欢
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-05
    • 2017-07-15
    • 1970-01-01
    相关资源
    最近更新 更多