1201.机器学习-算法-Logistic回归

你手上有一组特征(成绩、年龄、点击次数……),要回答的却是一个是/否问题:过没过、点没点、会不会违约。直接拿线性回归去拟合 $0/1$ 标签,预测值常会跑出 $[0,1]$ 区间,读起来也不像概率。

逻辑回归(Logistic Regression,常简称 Logistic 回归)就是为这类二分类(也可扩展到多分类)准备的:先算一个可正可负的「倾向分数」,再用一条 S 形曲线压成 $0\sim 1$ 的概率,最后按阈值做决策。

段末注释:Logistic 回归名字里有「回归」,输出却常当分类器用;它估的是条件概率 $P(y=1\mid x)$,不是连续数值本身。后文沿用「Logistic 回归」。

配图目录:./1201.机器学习-算法-Logistic回归/


1. 一句话定位

维度 一句话
学习范式 监督学习(需要带 $0/1$ 标签的样本)
输入 → 输出 特征 $\mathbf{x}$ → 概率 $p$,再可选阈值得到类别
在优化什么 让「观测到的标签在这套概率下出现」尽量顺口(极大似然)

出现背景:逻辑斯谛模型在统计与生物统计中沿用已久;将二分类与指数族/链接函数系统化的重要表述见 Cox(1958)等,后并入广义线性模型(GLM)传统(McCullagh & Nelder)。当时线性回归直接拟合 $0/1$ 会越出概率范围,该方法把线性预测接到 $(0,1)$ 概率尺度上,使「是/否」问题能在概率与对数赔率下估计。

它是广义线性模型(Generalized Linear Model,GLM)里最常用的一员:线性部分负责组合特征,非线性链接函数负责把结果落到概率尺度上。

段末注释:GLM = 线性预测子 + 链接函数 + 指数族噪声假设;Logistic 回归的链接是 Logit。后文用到时直接说 Logit / Sigmoid。


2. 直觉:三步流水线

图 1 特征加权 → 分数 → 概率 → 决策

可以按流水线记:

  1. 打分:把特征加权求和,得到分数 $z$(可正可负,像「有多倾向判为 1」)。
  2. 压成概率:用 Sigmoid 把 $z$ 压进 $(0,1)$,得到 $p$。
  3. 做决策(可选):例如 $p\ge 0.5$ 判为 1;阈值也可按业务成本改。

下面把每一步拆开。


3. 核心链路

3.1 线性打分

对特征 $x_1,\ldots,x_m$,模型先算:

$$
z = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \cdots + \beta_m x_m
$$

  • $\beta_0$:截距,所有特征为 0 时的基准倾向。
  • $\beta_j$:特征 $x_j$ 每增加 1 个单位,$z$ 变化多少。
  • $z$ 本身还不是概率,只是「打分」。

读参数时:$\beta_j>0$ 表示该特征增大时,判为 1 的倾向升高;符号与量级比「精确到小数点后很多位」更重要。

3.2 Sigmoid:把任意分数压成概率

Logistic 函数(也称 Sigmoid 函数)定义为:

$$
\sigma(z) = \frac{1}{1+e^{-z}}
$$

其中 $e\approx 2.718$ 是自然常数。无论 $z$ 多大或多小,$\sigma(z)$ 都落在 $(0,1)$ 内。

图 2 Sigmoid 像一道缓坡闸门

比喻:把 $z$ 想成水流压力,Sigmoid 是一道缓坡闸门——压力很负时几乎关死($p\to 0$),压力很正时几乎全开($p\to 1$),中间一段平滑过渡,不会像硬阈值那样「差一点点就整段翻转」。

于是二分类模型写成:

$$
P(y=1\mid x_1,\ldots,x_m) = \sigma(z) = \frac{1}{1+e^{-(\beta_0+\beta_1 x_1+\cdots+\beta_m x_m)}}
$$

段末注释:Sigmoid 这里专指把实数映到 $(0,1)$ 的 S 形函数;深度学习里同名激活函数形式相同,角色不同(这里直接解释为概率)。

3.3 Logit 与赔率:为什么还能「像线性回归那样」谈系数

概率 $p$ 不方便直接做线性模型(有上下界)。定义赔率(odds):

$$
\mathrm{odds} = \frac{p}{1-p}
$$

再取自然对数,得到 Logit

$$
\mathrm{logit}(p) = \ln\frac{p}{1-p} = z = \beta_0 + \beta_1 x_1 + \cdots + \beta_m x_m
$$

图 3 赔率与 Logit:把「弯的」概率拉直

比喻:把「会发生 / 不会发生」放在跷跷板两端,比值就是赔率;再取对数,跷跷板的倾斜就被拉成一条可以线性累加特征的数轴。所以系数 $\beta_j$ 解释的是:特征增加 1,对数赔率增加 $\beta_j$(等价于赔率乘以 $e^{\beta_j}$)。

3.4 参数从哪来:极大似然 + 迭代优化

训练集上,希望「标签为 1 的样本概率高、为 0 的样本概率低」。这正是极大似然估计(Maximum Likelihood Estimation,MLE)的思路:找一组 $\beta$,让整份数据在该模型下出现的可能性最大。

段末注释:MLE = 在模型假设下,挑出使观测数据似然最大的参数。Logistic 回归一般没有漂亮的闭式解,常用梯度下降、牛顿法、L-BFGS 等迭代求解;sklearn 已封装好。

实务里你很少手推梯度,但要知道两件事:

  1. 优化目标是似然(或等价的交叉熵损失),不是「最小二乘拟合 $0/1$」。
  2. 常加 L2/L1 正则,抑制系数膨胀、缓解共线性。

4. 手算完整实例:学时 → 是否及格

A. 问题与原始表

用每周有效学时 $x$ 预测是否及格 $y\in{0,1}$(示意,单位:小时)。

样本 $x$ $y$
1 0 0
2 1 0
3 2 1

B. 初始化

参数 $\beta_0=0$,$\beta_1=0$;学习率 $\eta=0.5$。用负对数似然的梯度下降更新(手算展示 2 步;实装会多步直至收敛)。

$$
p_i=\sigma(z_i),\quad z_i=\beta_0+\beta_1 x_i,\quad
\frac{\partial L}{\partial\beta_0}=\sum_i(p_i-y_i),\quad
\frac{\partial L}{\partial\beta_1}=\sum_i(p_i-y_i)x_i
$$

$$
\beta \leftarrow \beta - \eta,\nabla L
$$

C. 训练过程

第 1 步:$\beta=(0,0)$ ⇒ 各点 $p_i=0.5$。

样本 $z$ $p$ $p-y$ $(p-y)x$
1 0 0.5 0.5 0
2 0 0.5 0.5 0.5
3 0 0.5 −0.5 −1.0

$\nabla L=(0.5,,-0.5)$ ⇒ $\beta_0=0-0.5\times0.5=-0.25$,$\beta_1=0-0.5\times(-0.5)=0.25$。

第 2 步:$\beta=(-0.25,,0.25)$。

样本 $z$ $p=\sigma(z)$(约) $p-y$ $(p-y)x$
1 −0.25 0.438 0.438 0
2 0.00 0.500 0.500 0.500
3 0.25 0.562 −0.438 −0.876

$\nabla L\approx(0.500,,-0.376)$ ⇒ $\beta_0\approx-0.25-0.5\times0.500=-0.50$,$\beta_1\approx0.25-0.5\times(-0.376)=0.438$。

(实装会继续迭代;此处截断以展示逻辑。)

D. 可部署对象

手算截断后的参数:$\beta_0\approx-0.50$,$\beta_1\approx0.438$。推理只依赖 $(\beta_0,\beta_1)$,不再使用训练循环里的逐步梯度。

E. 预测 / 推断

阈值取 $p\ge0.5$ 判及格。

  • 训练内复核(样本 2,$x=1$):$z=-0.50+0.438\times1=-0.062$,$p=\sigma(z)\approx0.48$ → 判 $0$(未及格)。真值 $y=0$,两步后仍可能错,说明步数不够;逻辑上已走完「打分→概率→阈值」。
  • 新样本 $x=3$:$z=-0.50+0.438\times3\approx0.81$,$p\approx0.69$ → 判 $1$。

5. 适用 / 不适用

特征 / 训练目标 / 训练数据三维对照;每行带一个具体例子。

维度 判定 要求或边界 具体例子
特征 适用 数值或已编码的类别特征;与标签在对数赔率上近似线性可加;维数相对样本量别极端爆炸 信贷表:年龄、收入、负债率、是否有房贷(独热后)预测违约,$z=\beta^\top x$ 说得通
特征 不适用 原始像素 / 原始长文本等需深层表征,或特征间强非线性交互主导 用未卷积的原始 224×224 图像像素直接做是否「猫」的 Logistic,边界弯、交互多,线性 Logit 吃力
训练目标 适用 二分类(可扩多分类);需要 $P(y=1\mid x)$ 或可解释的系数方向;决策可用阈值消化代价不对称 邮件「垃圾 / 正常」:输出概率后,把阈值调到 0.8 以少误伤正常信
训练目标 不适用 要预测连续数值本身;或只要一条可读「如果…则…」规则树 预测下周销售额(元)应优先回归;合规审计要 if-then 规则时更适合树/规则学习
训练数据 适用 有标签、样本量中等即可起步;类别别极端悬殊,或已用权重/采样/阈值处理 某病筛查阴阳性各数千例,先做标准化与基线 Logistic,再谈阈值与校准
训练数据 不适用 正例极少却死守默认阈值 0.5、也不调权重;或标签噪声极大且无人清洗 欺诈率 0.1%,直接 predict 默认 0.5,模型几乎全判「正常」——问题在决策与采样,不只在算法名

6. 优缺点与常见坑

优点

  • 概率输出,便于设阈值、做排序与风险评估。
  • 系数可解释(方向 + 对对数赔率的贡献)。
  • 训练与推理都快,适合基线与线上轻量模型。
  • 与正则、特征工程搭配成熟(sklearn、statsmodels 等)。

缺点

  • 默认假设特征对 Logit 近似线性;复杂非线性要靠特征构造或换模型。
  • 对共线性、极端异常值仍敏感。
  • 默认阈值 $0.5$ 在类别不平衡时往往不是好决策点。

常见坑

  1. 尺度混乱:未标准化时,系数大小不能跨特征直接比「谁更重要」。
  2. 死守 0.5:召回/精确率成本不对称时,应按验证集或业务代价选阈值。
  3. 概率未校准:有的实现偏乐观/悲观,高风险场景要看校准曲线。
  4. 把多分类当多次「随便二分类」:更稳妥用 Softmax / 多项式 Logistic,或明确一对多策略。

7. 最小可运行示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
"""Logistic 回归最小示例:输入二维特征,输出类别与概率。"""
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline

# 输入:X 形状 (n_samples, n_features);y 为 0/1
X = np.array([[2.0], [4.0], [6.0], [8.0], [10.0], [12.0]])
y = np.array([0, 0, 0, 1, 1, 1])

# 处理逻辑:标准化后拟合 Logistic;predict 给类别,predict_proba 给概率
clf = Pipeline([
("scaler", StandardScaler()),
("logit", LogisticRegression()),
])
clf.fit(X, y)

x_new = np.array([[7.0]])
print("预测类别:", clf.predict(x_new)[0])
print("P(y=1):", clf.predict_proba(x_new)[0, 1])

预期:学习时长靠近「及格簇」时,$P(y=1)$ 明显高于 0.5;具体数值随求解器与正则略有浮动。本代码为演示 API,与上文 3 点手算表无关。

重要配置参数(sklearn LogisticRegression

参数(库内常用名) 训练中的作用与影响 参考起点 / 常用范围 配置指导
C 正则强度的倒数:越大越贴训练、越易过拟合;越小越压系数、越偏欠拟合 常先试 1.0;网格常见 0.01~100(对数间隔) 验证集过拟合 → 减小 C;欠拟合 → 增大 C
penalty l2 默认;l1 更易把部分系数压到 0(特征稀疏) 默认 l2;需特征选择感时再试 l1 l1 需配兼容 solver(如 liblinear / saga
solver 优化器选择;小数据 liblinear 稳,大数据/elasticnet 常用 saga 二分类默认常够用;维数大优先 saga 不收敛先换 solver 或加大 max_iter,不要只盲加轮数
max_iter 迭代上限;太小可能未收敛 起点 100~1000 出现收敛警告再加大;已收敛后继续加大收益小
class_weight 类别不平衡时抬高少数类损失权重 不平衡先试 balanced 先看混淆矩阵/召回,再调权重或阈值,不要只看准确率

8. 和近邻算法怎么挑

需求 更优先考虑
预测连续数值,且关系近似直线 线性回归
要概率 + 系数解释,二分类基线 Logistic 回归
间隔最大化、核技巧、中小样本复杂边界 支持向量机(SVM)
强非线性、特征交互多、可接受较弱系数解释 树模型 / Boosting

选型按条件,不存在绝对「更强」。


9. 小结

  • Logistic 回归 = 线性打分 + Sigmoid 成概率 +(可选)阈值决策
  • Logit 把概率拉到可线性累加的尺度,所以系数读的是「对对数赔率的贡献」。
  • 参数通常用极大似然迭代求得;工程上优先用现成库,把精力放在特征、阈值与校准。
  • 做基线、要解释、要概率时很合适;边界弯、交互狂、类别极端不平衡时,要改特征或换模型,并重设决策阈值。

参考文献

  1. Cox D.R. The regression analysis of binary sequences. J. R. Stat. Soc. B 1958.
  2. Hosmer D.W., Lemeshow S., Sturdivant R.X. Applied Logistic Regression. Wiley.
  3. scikit-learn: Logistic Regression
  4. Bishop C.M. Pattern Recognition and Machine Learning, 相关分类与概率判别章节。
-------------本文结束感谢您的阅读-------------