用逻辑回归预测概率

R 中的监督学习:回归

Nina Zumel and John Mount

Win-Vector LLC

预测概率

  • 预测事件"是否"发生(是/否):分类
  • 预测事件发生的"概率":回归
  • 线性回归:预测范围 [$-\infty$, $\infty$]
  • 概率:限制在 [0,1]
    • 因此属于非线性
R 中的监督学习:回归

示例:预测杜氏肌营养不良(DMD)

  • 结果:has_dmd;输入:CKH
R 中的监督学习:回归

线性回归模型

model <- lm(has_dmd ~ CK + H, 
            data = train)

test$pred <- predict(
    model, 
    newdata = test
)

结果:has_dmd $\in$ {0,1}

  • 0:FALSE
  • 1:TRUE

模型会预测出超出 [0:1] 的值

R 中的监督学习:回归

逻辑回归

$$ log(\frac{p}{1-p}) = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + ... $$

glm(formula, data, family = binomial)
  • 广义线性模型
  • 假设自变量在"对数几率"上加性线性:$log( p/(1-p) )$
  • family:描述误差分布
    • 逻辑回归:family = binomial
R 中的监督学习:回归

DMD 模型

model <- glm(has_dmd ~ CK + H, data = train, family = binomial)
  • 结果:两类,如 $a$ 与 $b$
  • 模型返回 $Prob(b)$
    • 建议:用 0/1 或 FALSE/TRUE
R 中的监督学习:回归

解释逻辑回归模型

model
Call:  glm(formula = has_dmd ~ CK + H, family = binomial, data = train)

Coefficients:
(Intercept)           CK            H  
  -16.22046      0.07128      0.12552  

Degrees of Freedom: 86 Total (i.e. Null);  84 Residual
Null Deviance:       110.8 
Residual Deviance: 45.16     AIC: 51.16
R 中的监督学习:回归

用 glm() 预测

predict(model, newdata, type = "response")
  • newdata:默认用训练数据
  • 获取概率:使用 type = "response"
    • 默认:返回对数几率
R 中的监督学习:回归

DMD 模型

model <- glm(has_dmd ~ CK + H, data = train, family = binomial)
test$pred <- predict(model, newdata = test, type = "response")

R 中的监督学习:回归

评估逻辑回归:伪 $R^2$

$$ R^2 = 1 - \frac{RSS}{SS_{Tot}} $$

$$ 伪 R^2 = 1 - \frac{deviance}{null.deviance} $$

  • 偏差(Deviance):类似方差(RSS)
  • 零偏差(Null deviance):类似 $SS_{Tot}$
  • 伪 R^2:解释的偏差比例
R 中的监督学习:回归

训练集上的伪 $R^2$

使用 broom::glance()

glance(model) %>% 
  summarize(pR2 = 1 - deviance/null.deviance)
   pseudoR2
1 0.5922402

使用 sigr::wrapChiSqTest()

wrapChiSqTest(model)
"... pseudo-R2=0.59 ..."
R 中的监督学习:回归

测试集上的伪 $R^2$

# 测试集
test %>% 
  mutate(pred = predict(model, newdata = test, type = "response")) %>%
  wrapChiSqTest("pred", "has_dmd", TRUE)

参数:

  • 数据框
  • 预测列名
  • 结果列名
  • 目标取值(目标事件)
R 中的监督学习:回归

增益曲线图(Gain Curve)

GainCurvePlot(test, "pred","has_dmd", "DMD model on test")

R 中的监督学习:回归

Passons à la pratique !

R 中的监督学习:回归

Preparing Video For Download...