外观
线性模型与逻辑回归
一句话定义:线性模型假设目标 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 个 | 每步最准,但大数据的每步太贵 |
| 随机梯度下降 SGD | 1 个样本 | 每步噪声大但极快,能跳出局部坑 |
| 小批量梯度下降 | 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² 的三个误读
- R² 高 ≠ 因果:垃圾特征也能撑高 R²,预测好不代表"x 导致 y"。
- R² 是样本内的:训练集 R² 虚高是常态,永远用测试集(或交叉验证)报告。
- 与相关性混淆:一元回归时 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 → 深度学习。每一步都对比基线,确认增益值得复杂度。这条"基线驱动"的方法论在树模型与集成学习和模型评估与验证里有更完整的展开。
延伸阅读
- 什么是机器学习——线性模型在机器学习全景中的位置
- 监督学习——分类/回归问题的形式化框架,本文两视角的上下文
- 模型评估与验证——准确率、混淆矩阵、AUC 与偏差-方差权衡
- 过拟合与正则化——岭回归/Lasso 的完整原理,本文第四节的理论底座
- 特征工程——线性模型的非线性与交互靠特征工程补足
- 优化与梯度下降——闭式解之外,梯度下降是线性模型与深度学习的共同引擎
- 树模型与集成学习——表格数据的下一个升级台阶
- 深度学习基础——逻辑回归如何演进为神经网络
- 无监督学习——线性家族之外的聚类视角
- ML vs AI 边界辨析——线性模型与"AI"的边界关系
- 常见陷阱——标准化泄露、数据泄露等高频翻车点
- 框架对比——sklearn 与其他库的生态定位
- 数学基础速查——矩阵、概率、优化的速查
- 术语表——sigmoid、MSE、AUC 等术语速查
参考资料
- James, Witten, Hastie, Tibshirani. An Introduction to Statistical Learning(ISLR, Springer, 2nd ed. 2021) —— 线性回归(第 3 章)、分类/逻辑回归(第 4 章)、正则化(第 6 章)的标准教材
- Hastie, Tibshirani, Friedman. The Elements of Statistical Learning(ESL, 2nd ed. 2009) —— 线性模型与 GLM 的数学推导(第 3、4 章),本文闭式解与梯度公式的出处
- scikit-learn 用户指南:线性模型 —— 岭回归、Lasso、逻辑回归与 GLM 的官方文档
- scikit-learn API 文档:LogisticRegression —— 本文实战用到的
C、max_iter、predict_proba参数说明 - scikit-learn API 文档:威斯康星乳腺癌数据集 —— 第七节实战数据集的官方说明
- Andrew Ng. CS229 机器学习课程笔记(Stanford) —— 线性回归与逻辑回归的极大似然推导(第 1-2 章)
- Goodfellow, Bengio, Courville. Deep Learning(花书) —— softmax 与交叉熵的深入讨论(第 6 章)