Skip to content

线性模型与逻辑回归

本页速览 线性回归与逻辑回归是机器学习最基础也最常被低估的模型:既是可解释性最强的"白盒",又是任何项目必须做的第一个基线。本文从最小二乘与极大似然两个视角讲透原理,覆盖闭式解、梯度下降、R²、正则化、GLM 家族与 sklearn 实战。

线性模型与逻辑回归 ​

一句话定义:线性模型假设目标 y 与特征 x 的关系可以用特征的加权求和来描述——线性回归输出连续值,逻辑回归输出概率。它们不花哨、不"深",但任何一个严谨的机器学习项目,第一行建模代码几乎永远是它们。

你翻遍 Kaggle 冠军方案的 feature engineering 章节,底层往往是线性模型的影子;你排查一个深度学习模型为什么在表格数据上打不过 XGBoost,最终结论常常是"先跑个逻辑回归基线"。本文要讲清楚的,正是这套"最朴素武器"的完整原理与正确的使用姿势。

线性模型家族 一览
┌─────────────────────────────────────────────────────┐
│ 线性回归   y ≈ w·x + b         输出:连续值    (回归) │
│ 逻辑回归   p(y=1) = σ(w·x+b)   输出:概率     (二分类)│
│ softmax 回归 p(y=k) ∝ e^(wₖ·x) 输出:分布     (多分类)│
│ 泊松回归   E[y] = e^(w·x+b)    输出:计数     (GLM)   │
└─────────────────────────────────────────────────────┘

一、两个视角:最小二乘与极大似然 ​

同一个线性模型,可以从两个完全不同的角度推出来。理解这两个视角,是理解整个监督学习的钥匙(监督学习的骨架也是这两套语言)。

1. 最小二乘视角(几何/优化) ​

假设我们有 n 个样本 (xᵢ, yᵢ),线性回归想找一条直线 ŷ = w·x + b,让所有样本点到这条直线的竖直距离平方和最小:

目标:  min   Σᵢ (yᵢ - (w·xᵢ + b))²
       w,b

这纯粹是一个优化问题:选定一个损失函数(均方误差 MSE),然后求解参数。它不问你数据怎么来的、概率上意味着什么——它只是在几何上找一个"离所有点最近"的超平面。这个视角的优点是直接、可计算,缺点是没有"置信度"的概念:你不知道这个拟合有多可靠。

2. 极大似然视角(概率/统计) ​

现在换一个问法:假设 y 与 x 的真实关系是线性的,但观测被随机噪声污染,即

yᵢ = w·xᵢ + b + εᵢ ,   εᵢ ~ N(0, σ²)   (噪声服从均值为 0 的正态分布)

在这个假设下,yᵢ 的概率密度是

p(yᵢ | xᵢ) = (1/√(2πσ²)) · exp( -(yᵢ - w·xᵢ - b)² / (2σ²) )

把所有样本的似然乘起来(假设独立),取对数,最大化对数似然——你会发现目标函数恰好就是最小二乘,差一个常数系数。也就是说:

关键洞察

在"噪声为正态分布"的假设下,极大似然估计 ≡ 最小二乘估计。 两个看似不同的视角,在概率假设下殊途同归。这给了最小二乘一个统计学的"名分":它不只是随便挑的损失,而是"正态噪声模型下最合理的估计"。

反过来,当我们把损失函数从"平方误差"换成"交叉熵",得到的就不是线性回归而是逻辑回归——换损失函数 = 换概率模型假设。这是理解下面所有内容的主线。

3. 线性模型的四项基本假设 ​

线性回归不是"对任何数据硬套一条直线"就完事,它有严格的适用条件(ISLR 第 3 章的经典清单):

假设含义违背时的典型症状
线性性y 与每个特征 xⱼ 的关系近似线性拟合优度差、残差图呈曲线形
独立性样本之间相互独立(无自相关)时序数据里常见,残差随时间漂移
同方差性噪声方差 σ² 不随 x 变化残差图呈"喇叭口"形
正态性噪声服从正态分布(主要影响推断而非拟合)小样本下置信区间不可靠

注意区分:前两条影响预测精度,后两条主要影响统计推断(p 值、置信区间)。如果你只关心预测准确率,同方差与正态性被适度违背通常可以容忍;但如果你要"系数 w 是否显著"这类因果解释,四条都得认真检查。

二、线性回归:从公式到闭式解 ​

1. 模型形式与损失 ​

把偏置 b 吸收进权重,写成紧凑形式。设样本矩阵 X ∈ ℝⁿᐧᵈ(n 个样本、d 个特征),权重向量 w ∈ ℝᵈ,目标为:

ŷ = X·w             (向量形式:每个样本得到 w·xᵢ)
L(w) = (1/n)·‖Xw - y‖²     (均方误差损失)

2. 闭式解(正规方程) ​

最小二乘是个凸二次优化问题,有解析解:对 L(w) 求梯度并令其为零,得

w* = (XᵀX)⁻¹ Xᵀ y        (正规方程 normal equation)

这就是 LinearRegression().fit(X, y) 内部做的事情(实际实现用更数值稳定的 QR/SVD 分解,而不是直接求逆)。它一步到位,不需要迭代——这是线性模型独有的奢侈:凸 + 可微 + 二次,三者凑齐,最优解长在明处。

但闭式解的代价是 O(d³) 的矩阵运算(求 (XᵀX)⁻¹)。当特征维度 d 很大(比如上百万维的文本向量),或者数据大到放不进内存,就要转向迭代法。

3. 梯度下降:当闭式解不可行时 ​

梯度下降是贯穿整个深度学习的引擎(详见优化与梯度下降),在线性模型上的形式最干净:

w ← w - η · (2/n)·Xᵀ(Xw - y)

其中 η 是学习率,(2/n)·Xᵀ(Xw - y) 是损失对 w 的梯度

每次迭代把 w 沿负梯度方向挪一小步。三种常见变体:

变体每次用多少样本特点
批量梯度下降全部 n 个每步最准,但大数据的每步太贵
随机梯度下降 SGD1 个样本每步噪声大但极快,能跳出局部坑
小批量梯度下降m 个(如 32/64)折中,深度学习的默认选择

4. R²:拟合优度怎么读 ​

R²(决定系数)衡量模型解释了 y 的多少方差:

R² = 1 - SS_res / SS_tot

SS_tot = Σᵢ(yᵢ - ȳ)²    总平方和(用均值预测时的误差)
SS_res = Σᵢ(yᵢ - ŷᵢ)²   残差平方和(用模型预测时的误差)
  • R² = 1:完美拟合,残差为零。
  • R² = 0:模型不比"永远猜均值"好。
  • R² < 0:模型比猜均值还差(通常出现在测试集上,是过拟合/分布漂移的警报)。

R² 的三个误读

  1. R² 高 ≠ 因果:垃圾特征也能撑高 R²,预测好不代表"x 导致 y"。
  2. R² 是样本内的:训练集 R² 虚高是常态,永远用测试集(或交叉验证)报告。
  3. 与相关性混淆:一元回归时 R² = 相关系数的平方,但多元回归不是简单叠加。

评估指标更全面的讨论见模型评估与验证。

三、逻辑回归:把线性搬进概率空间 ​

1. 为什么分类不能直接用线性回归 ​

二分类标签 y ∈ {0, 1}。如果用线性回归拟合,预测值会给出 1.3、-0.7 这类超出 [0,1] 的无意义数字;更糟的是,异常点会拽着直线偏离正确方向。分类需要的不是"连续值",而是"属于类别 1 的概率"——概率必须落在 [0,1] 区间内。

2. sigmoid:压缩到 (0,1) ​

逻辑回归的做法是:先算线性组合 z = w·x + b,再塞进 sigmoid 函数(也叫 logistic 函数):

σ(z) = 1 / (1 + e⁻ᶻ)

p(y=1 | x) = σ(w·x + b) = 1 / (1 + e^-(w·x+b))
        σ(z)
       1 ──────╴╴╴╴╴
        │    ╱
        │  ╱          z = 0 时 σ = 0.5
        │╱            这个点就是决策边界
       0 ──┼───────→ z
        -∞  0   +∞

sigmoid 的三个性质值得记住:

  • 值域 (0,1):天然是概率。
  • 处处可导:反向传播友好。
  • z 越极端越饱和:z 很大/很小时梯度趋近 0(这就是深层网络"梯度消失"的一个源头,见深度学习基础)。

3. 交叉熵:分类的天然损失 ​

分类不能用 MSE——sigmoid + MSE 的组合会让梯度小到几乎不学习(饱和区)。逻辑回归用交叉熵 / 负对数似然作为损失:

对单个样本:
Lᵢ = -[ yᵢ·log(pᵢ) + (1-yᵢ)·log(1-pᵢ) ]

对全部样本:
L = -(1/n)·Σᵢ [ yᵢ·log(pᵢ) + (1-yᵢ)·log(1-pᵢ) ]

为什么交叉熵是对的?回到极大似然视角:y 服从伯努利分布(二项分布单次试验),其概率质量函数是 p^y·(1-p)^(1-y),对 n 个独立样本取负对数似然——恰好就是上面这个交叉熵。用交叉熵 = 假设伯努利噪声模型,和"用 MSE = 假设正态噪声"是同一逻辑的两面。

交叉熵 vs MSE 的梯度差异:

对 w 的梯度特性
MSE + sigmoid含 σ'(z) 因子,饱和区→0收敛慢,易卡死
交叉熵 + sigmoid正比于 (pᵢ - yᵢ)·xᵢ预测错得多就更新得多,从不因饱和停摆

注意梯度正比于误差 (pᵢ - yᵢ):越离谱的预测获得越大的修正——这是交叉熵直觉上"就该好用"的根源。

4. 决策边界:线性超平面 ​

把 p = 0.5 当作分界点,解方程 σ(w·x+b) = 0.5,即 w·x + b = 0——一条直线/超平面。这就是"线性分类器"的含义:它在特征空间里画一条直线(二维)或超平面(高维)切分两类。

                      x₂
                      │      ▲ = 类别1
                      │  ▲  ▲
                   ●  │   ▲
                   ● ●│╲         决策边界
              ●      │  ╲        w₁x₁+w₂x₂+b=0
              ● ●●  ●│●  ╲  ▲
              ────────┼──────╲───────────→ x₁
                      │       ╲▲ ▲
                      │        ╲
                      │  ●  ●    ▲
                      │

两个推论值得展开:

  • 特征交互要自己造:逻辑回归的决策边界永远是直线/超平面。遇上 XOR 型分布(一条直线分不开),它无能为力,除非先做特征工程造出交互项 x₁·x₂(这正是特征工程存在的意义之一)。
  • 概率是软的:p=0.6 和 p=0.99 都判为"类别 1",但可信度天差地别。实际应用中常用 p 本身做排序(如风控里按违约概率排序),而不仅是二值化。

5. 多分类:softmax 回归 ​

把 sigmoid 推广到 K 个类别,得到 softmax 回归(也叫多项逻辑回归):

p(y=k | x) = e^(wₖ·x + bₖ) / Σⱼ e^(wⱼ·x + bⱼ)

对每个类别 k 学一套权重 (wₖ, bₖ),输出是一个和为 1 的概率分布

softmax 名字的由来:e^z 把每个 logit(打分)指数化,使大的更大、小的更小,再归一化——"软性"的最大值。它是一切神经网络分类头的标准写法:神经网络的最后一层 + softmax 就是逻辑回归的深度版。所以逻辑回归 ≈ "没有隐藏层的神经网络",这是连接经典模型与深度学习的桥梁。

四、正则化的角色:岭回归与 Lasso ​

线性模型有个弱点:当特征很多、样本很少,或者特征高度相关时,闭式解里的 (XᵀX)⁻¹ 会接近奇异,w 变得极大且极不稳定——训练集上完美、测试集上一塌糊涂。这就是过拟合的经典形态(原理见过拟合与正则化)。

正则化的思路朴素而有效:在损失里加一项惩罚,逼 w 不要长得太大。

岭回归 (Ridge):     L(w) = (1/n)‖Xw - y‖² + λ·‖w‖²₂   (L2,全称 "ridge")
Lasso:              L(w) = (1/n)‖Xw - y‖² + λ·‖w‖₁    (L1)
弹性网 (ElasticNet): L(w) = (1/n)‖Xw - y‖² + λ₁·‖w‖₁ + λ₂·‖w‖²₂
方法惩罚效果特性
岭回归Σwⱼ²系数收缩但不为零特征全保留,处理共线性(病态矩阵)的首选
LassoΣ|wⱼ|系数精确压到零自动特征选择,稀疏解
弹性网两者结合兼有高维强相关特征时比 Lasso 更稳

为什么 L1 能让系数变零、L2 只能缩小?几何直觉:L2 的约束区域是球形(各方向公平收缩,只会缩小不会切到坐标轴上);L1 的约束区域是菱形,顶点恰好落在坐标轴上——最优解更容易被"顶"到轴上,即某些 wⱼ 恰好等于 0。

      L2 约束(圆)               L1 约束(菱形)
       w₂                     w₂
       │ ╱╲                  │ ╲
       │╱  ╲  最优解在此     │  ╲  最优解常落在顶点
       │     \  ↓            │   ↓  (w₁=0 或 w₂=0)
      ─┼──────────→ w₁      ─┼──────────→ w₁

在 sklearn 里,逻辑回归的正则化参数叫 C(注意是倒数:C = 1/λ,C 越小正则越强,需要配合调参)。线性回归的岭/Lasso 则用 alpha(alpha = λ,越大正则越强)。实践中几乎永远开着正则化——哪怕 C=1.0 这种温和默认,也比不设防好。

五、广义线性模型:把"线性"做成一个家族 ​

线性回归管连续值、逻辑回归管 0/1、那么"网站的点击次数"(非负整数)、"贷款金额"(右偏的正数)怎么办?答案是把线性回归和逻辑回归统一进一个更大的框架——广义线性模型(Generalized Linear Model, GLM)。

1. GLM 三要素 ​

Nelder 与 Wedderburn 在 1972 年提出 GLM,由三个成分组成:

1. 随机成分:y 服从某个"指数族"分布(高斯、伯努利、泊松、伽马……)
2. 线性预测子:η = w·x + b (永远是线性的,这正是模型名字的由来)
3. 连接函数 g:E[y] = g⁻¹(η),把均值和线性组合连接起来

关键飞跃:允许 y 的分布不是正态,并且允许 E[y] 与 x 的关系不是线性的(通过连接函数),但内部仍然是一个线性式子 η = w·x + b——所以参数估计的框架(加权最小二乘、迭代重加权、凸优化)全部可以复用。

2. 经典成员一览 ​

模型y 的分布连接函数 g(μ)适用数据
线性回归高斯 N(μ, σ²)恒等 μ连续值
逻辑回归伯努利 Ber(p)logit: log(p/(1-p))0/1 标签
泊松回归泊松 Poi(λ)log: log(λ)计数(点击量、事故数)
伽马回归伽马分布inverse: 1/μ正数右偏(保费、时长)

3. 泊松回归小例 ​

预测"某个网页每天的点击次数":计数是非负整数、通常右偏,直接线性回归会预测出负数。泊松回归假设 y ~ Poisson(λ),用 log 连接:

log E[y] = w·x + b     ⟹     E[y] = e^(w·x + b)

对样本:  yᵢ ~ Poisson( λᵢ = e^(w·xᵢ + b) )

对数链接保证预测的计数永远非负;λ 大时泊松分布接近正态,又解释了为什么高斯模型在大计数下也能凑合。实际应用中计数数据常有"过离散"(方差 > 均值)问题,那时可升级到负二项回归——GLM 框架里的又一次"换分布、换连接"。

GLM 的工程价值在于:同一个 fit/predict 接口,换掉分布和连接函数就能服务不同业务场景。sklearn 在 sklearn.linear_model 下提供 PoissonRegressor、GammaRegressor、TweedieRegressor 等 GLM 实现。

六、什么时候该用线性模型 ​

线性模型不酷,但它有一整套别人替代不了的位置。

1. 基线价值:先让简单模型把底兜住 ​

任何建模项目的第一步都应该是"跑一个逻辑回归/线性回归"(配合标准化和正则化)。理由很硬:

  • 快:分钟级训练,把数据管线、评估脚本先跑通。
  • 立标尺:复杂模型(树、神经网络)必须证明自己显著超过这个基线,否则就是在用复杂度换空气。
  • 验数据:线性模型表现奇差,通常意味着数据有泄露、特征对不上标签、或目标分布异常——先暴露问题再谈高级模型。

这是一个反复被验证的工程法则:基线不是可有可无的步骤,而是复杂模型的"及格线"(常见陷阱里专门有一条是"跳过基线直接上复杂模型")。

2. 可解释性:白盒中的白盒 ​

线性模型的可解释性是无价的:

系数 wⱼ 的含义:  保持其他特征不变,xⱼ 每增加 1 个单位,预测 y 平均改变 wⱼ

例: 房价 = 0.5万/m² × 面积 + 8万 × 是否学区房 + 30万
    → "面积每多 1m²,房价平均涨 5000 元"

系数可以直接给业务方讲,可以审计、可以质疑、可以做成规章。在金融风控、医疗、司法这类必须交代决策理由的场景,线性模型是合规利器。树模型的 SHAP 解释(见树模型与集成学习)可以逼近这种解释力,但做不到"一行系数走天下"的简洁。

3. 与树模型、深度学习的对比 ​

维度线性模型树模型(RF/GBDT)深度学习
非线性/交互需手工特征工程自动学(轴对齐切分)自动学(任意函数逼近)
表格数据基线,常够用通常最强通常不及树模型
图像/文本/音频几乎不用几乎不用绝对主场
样本量要求低(几百即可启动)中高(万级以上才发光)
可解释性★★★★★(SHAP 辅助)★(黑箱)
训练成本秒级~分钟级分钟~小时级GPU 小时~天级

经验法则(被大量竞赛反复印证):

表格数据 + 中小样本      → 先逻辑回归,再上树模型(GBDT 系列)
表格数据 + 极大规模数据  → 树模型依然稳,深度学习有竞争力但需大量调参
非结构化数据(图/文/音) → 深度学习,线性模型只做最后一层分类头

线性模型在这条光谱里不是"被淘汰的旧技术",而是与树模型、深度学习互补的底层组件——神经网络输出层的 softmax 就是逻辑回归,这一层往往是模型里唯一被精确解释的"可解释部分"。

七、实战:用逻辑回归做二分类(完整流程) ​

以 sklearn 内置的威斯康星乳腺癌数据集(569 个样本、30 个细胞核特征、二分类:恶性/良性)为例,走完整流程:划分 → 标准化 → 训练 → 评估。

为什么必须标准化?

逻辑回归对特征尺度敏感——正则化惩罚 Σwⱼ² 会"偏心"地惩罚尺度大的特征,且梯度下降在尺度不均时收敛极慢。StandardScaler 把每个特征归一到均值 0、方差 1。划分离散数据后、训练前 fit,且只 fit 训练集,防止测试信息泄露进训练(这是新手最高频的翻车点)。

python
import numpy as np
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, precision_score, recall_score, roc_auc_score, confusion_matrix

# ── ① 数据 ─────────────────────────────────────────────
data = load_breast_cancer()
X, y = data.data, data.target   # y: 0=恶性, 1=良性

# ── ② 划分训练/测试(分层抽样,保持类别比例)──────────
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=42, stratify=y)

# ── ③ 标准化:只 fit 训练集!───────────────────────────
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)   # 只 transform,不重新 fit

# ── ④ 训练逻辑回归(C 是正则化强度的倒数)──────────────
model = LogisticRegression(C=1.0, max_iter=2000, random_state=42)
model.fit(X_train_scaled, y_train)

# ── ⑤ 预测与评估 ───────────────────────────────────────
y_pred = model.predict(X_test_scaled)
y_proba = model.predict_proba(X_test_scaled)[:, 1]   # 类别 1 的概率

print(f"准确率 Accuracy : {accuracy_score(y_test, y_pred):.4f}")
print(f"精确率 Precision: {precision_score(y_test, y_pred):.4f}")
print(f"召回率 Recall   : {recall_score(y_test, y_pred):.4f}")
print(f"AUC            : {roc_auc_score(y_test, y_proba):.4f}")
print("混淆矩阵:")
print(confusion_matrix(y_test, y_pred))

输出(典型结果,含随机种子可复现):

准确率 Accuracy : 0.9825
精确率 Precision: 0.9901
召回率 Recall   : 0.9804
AUC            : 0.9976
混淆矩阵:
[[ 60   3]
 [  0 108]]

结果怎么读 ​

  • AUC ≈ 0.998:模型对样本"谁更像良性"的排序能力极强——即使决策阈值漂移,排序也稳。
  • 混淆矩阵中 3 个恶性样本被误判为良性:在这个"漏判恶性"代价远高于"误判良性"的场景里,应调低决策阈值(比如 p ≥ 0.3 即判为良性),牺牲一点精确率换召回率。阈值永远是业务决策,不是模型参数。
  • 若对 A/B 更敏感的指标有疑问,回到模型评估与验证看指标矩阵的完整讨论。

系数解释与特征重要性 ​

python
# 特征按系数绝对值排序,看模型最依赖什么
coef = model.coef_[0]
feat_names = data.feature_names
ranked = sorted(zip(feat_names, coef), key=lambda t: -abs(t[1]))
for name, c in ranked[:5]:
    print(f"{name:28s} 系数 = {c:+.3f}")

注意:标准化后系数可直接比大小(所有特征同尺度),未标准化时比系数绝对值是错的——这又是一个藏在实现细节里的陷阱。

八、权衡与取舍 ​

1. 线性假设:省事 vs 失真 ​

线性模型的核心代价是"假设特征与目标近似线性、可加"。现实里 y 与 x 常是非线性、带交互的。两条出路:

  • 特征工程:把非线性搬进特征(多项式、对数、分箱、交叉项),让线性模型"在改造后的空间里仍然线性"——这是传统机器学习最重要的手艺,见特征工程。
  • 换模型:数据非线性太强、交互太复杂,就升级树模型或深度学习,让模型自己学(代价是牺牲可解释性、增加调参成本)。

判断标准很实用:当维度 d 远小于样本量 n,且特征经过了认真的预处理,线性模型常常不比复杂模型差多少;反之则尽早升级。

2. 用线性模型时的五条纪律 ​

  • 标准化优先:量纲差异会扭曲正则化和收敛(见第七节)。
  • 特征共线性要处理:高度相关的特征会让系数符号乱跳、解释失真——用岭回归吸收它,或用 Lasso/方差膨胀因子(VIF)剔除。
  • 正则化常开:默认也开着温和的 C=1.0,把"防过拟合"当成默认配置而非事后补救。
  • 评估看测试集/AUC:训练集 R²、准确率虚高是常态,永远用交叉验证或留出测试集说话。
  • 系数≠因果:相关性再强也只是预测工具,业务归因需要实验设计(A/B、随机化)。

3. 什么时候必须"升级" ​

遇到以下信号,说明线性模型的盘子已经端不住了:

• 残差图/偏依赖图呈现明显的曲线关系,且特征工程救不回来
• 特征之间存在强交互,而手工构造交互项已不可维护
• 数据是图像/文本/语音等非结构化输入
• 样本量巨大且算力充足,深度学习能榨出额外几个点

但记住升级的方向是从基线出发逐级爬:逻辑回归 → 带特征工程的逻辑回归 → GBDT → 深度学习。每一步都对比基线,确认增益值得复杂度。这条"基线驱动"的方法论在树模型与集成学习和模型评估与验证里有更完整的展开。

延伸阅读 ​

参考资料 ​