1. 为什么线性模型是机器学习入门的“第一性原理”很多人学机器学习一上来就被各种深度网络、注意力机制、Transformer 架构唬住了觉得线性模型太简单、太基础不值得花时间。但我带了这么多届学生、看了这么多份简历和项目一个非常真实的感受是真正能把线性模型讲清楚的人后面学什么都快讲不清楚的人后面基本都在调包。线性模型这一章表面上是讲几个公式实际上是在给你搭建整个监督学习的思维骨架——假设空间怎么定、损失函数怎么来、优化目标怎么解、正则化为什么能防过拟合这些东西在后面每一个模型里都会反复出现。这一章的核心内容围绕线性回归、对数几率回归逻辑回归、线性判别分析、多分类学习、类别不平衡这几块展开。它解决的是一个最朴素但也最本质的问题给定一堆输入特征怎么用一个线性组合去预测输出如果输出是连续的就是回归如果输出是离散的类别就是分类。听起来简单但里面的门道非常多比如为什么最小二乘能推出闭式解、为什么逻辑回归要用极大似然而不是最小二乘、为什么 LDA 被称为“降维分类一体机”、为什么多分类要用 OvO 或 OvR 而不是直接硬上。这篇文章适合三类人看第一类是在校学生正在啃这本书需要一份能串起全章逻辑的复习笔记第二类是转行做算法的朋友想补一补最底层的数学直觉第三类是做工程的同学平时调包调得多但面试一问“逻辑回归的损失函数怎么推的”就卡壳。我会尽量用大白话把每个公式背后的“人话解释”讲透同时给出可以直接复现的代码和参数计算过程让你不只是“看懂了”而是“能讲出来、能写出来、能用起来”。2. 线性回归从最小二乘到闭式解的完整推导2.1 线性回归到底在拟合什么线性回归的假设非常直接输出是输入的线性组合。用数学写出来就是$$ f(\boldsymbol{x}) \boldsymbol{w}^\top \boldsymbol{x} b $$其中 $\boldsymbol{w}$ 是权重向量$b$ 是偏置。为了方便推导通常把 $b$ 吸收进 $\boldsymbol{w}$写成 $\hat{\boldsymbol{w}} (\boldsymbol{w}; b)$同时给 $\boldsymbol{x}$ 补一列 1变成 $\hat{\boldsymbol{x}} (\boldsymbol{x}; 1)$。这样模型就简化为 $f(\hat{\boldsymbol{x}}) \hat{\boldsymbol{w}}^\top \hat{\boldsymbol{x}}$。那怎么衡量这个模型好不好最自然的想法是看预测值和真实值差多少。均方误差MSE就是最常用的度量$$ E(\hat{\boldsymbol{w}}) \sum_{i1}^{m} (y_i - \hat{\boldsymbol{w}}^\top \hat{\boldsymbol{x}}_i)^2 $$写成矩阵形式就是$$ E(\hat{\boldsymbol{w}}) (\boldsymbol{y} - \boldsymbol{X}\hat{\boldsymbol{w}})^\top (\boldsymbol{y} - \boldsymbol{X}\hat{\boldsymbol{w}}) $$这里 $\boldsymbol{X}$ 是 $m \times (d1)$ 的设计矩阵每一行是一个样本。这个损失函数是凸的所以最小值点可以通过求导得到。2.2 闭式解的推导与几何直觉对 $\hat{\boldsymbol{w}}$ 求导$$ \frac{\partial E}{\partial \hat{\boldsymbol{w}}} 2\boldsymbol{X}^\top(\boldsymbol{X}\hat{\boldsymbol{w}} - \boldsymbol{y}) $$令导数为零得到$$ \boldsymbol{X}^\top\boldsymbol{X}\hat{\boldsymbol{w}} \boldsymbol{X}^\top\boldsymbol{y} $$如果 $\boldsymbol{X}^\top\boldsymbol{X}$ 可逆那么$$ \hat{\boldsymbol{w}}^* (\boldsymbol{X}^\top\boldsymbol{X})^{-1}\boldsymbol{X}^\top\boldsymbol{y} $$这就是著名的最小二乘闭式解。几何上$\boldsymbol{X}\hat{\boldsymbol{w}}$ 是 $\boldsymbol{X}$ 列空间中的一个向量我们要找的是 $\boldsymbol{y}$ 在这个列空间上的正交投影。残差 $\boldsymbol{y} - \boldsymbol{X}\hat{\boldsymbol{w}}$ 垂直于列空间所以内积为零这正是 $\boldsymbol{X}^\top(\boldsymbol{y} - \boldsymbol{X}\hat{\boldsymbol{w}}) 0$ 的含义。注意当特征数 $d$ 大于样本数 $m$ 时$\boldsymbol{X}^\top\boldsymbol{X}$ 不可逆会有无穷多解。这时候需要引入正则化也就是岭回归。2.3 岭回归给矩阵“加点料”让解稳定现实数据里特征之间经常高度相关导致 $\boldsymbol{X}^\top\boldsymbol{X}$ 接近奇异闭式解数值不稳定。岭回归的做法是在损失函数里加一个 L2 正则项$$ E(\hat{\boldsymbol{w}}) (\boldsymbol{y} - \boldsymbol{X}\hat{\boldsymbol{w}})^\top (\boldsymbol{y} - \boldsymbol{X}\hat{\boldsymbol{w}}) \lambda |\hat{\boldsymbol{w}}|_2^2 $$求导后得到$$ \hat{\boldsymbol{w}}^* (\boldsymbol{X}^\top\boldsymbol{X} \lambda \boldsymbol{I})^{-1}\boldsymbol{X}^\top\boldsymbol{y} $$加 $\lambda \boldsymbol{I}$ 之后矩阵一定可逆这就是它最直接的好处。$\lambda$ 越大权重被压得越小模型越简单偏差增大但方差减小。下面是一段可以直接跑的 Python 代码对比普通最小二乘和岭回归import numpy as np np.random.seed(42) m, d 50, 10 X np.random.randn(m, d) X np.hstack([X, np.ones((m, 1))]) # 补一列1 true_w np.random.randn(d 1) y X true_w 0.1 * np.random.randn(m) # 普通最小二乘 w_ols np.linalg.inv(X.T X) X.T y # 岭回归 lam 1.0 I np.eye(d 1) I[-1, -1] 0 # 通常不正则化偏置项 w_ridge np.linalg.inv(X.T X lam * I) X.T y print(OLS 权重范数:, np.linalg.norm(w_ols)) print(Ridge 权重范数:, np.linalg.norm(w_ridge))实测下来当特征相关性强时OLS 的权重范数会非常大而 Ridge 明显更稳。这也是为什么工业界做线性模型时几乎默认都会加正则。3. 对数几率回归为什么分类要用极大似然3.1 从线性回归到分类的鸿沟线性回归输出的是实数但分类任务要的是概率或者类别。最直接的想法是把线性输出通过一个函数映射到 $(0,1)$ 区间这个函数就是Sigmoid 函数$$ \sigma(z) \frac{1}{1 e^{-z}} $$于是模型变成$$ P(y1|\boldsymbol{x}) \sigma(\boldsymbol{w}^\top \boldsymbol{x} b) $$这里有一个非常关键的细节为什么不用最小二乘去优化这个模型因为如果把 $\sigma(\boldsymbol{w}^\top \boldsymbol{x})$ 代入 MSE损失函数会变成非凸的有多个局部极小值梯度下降很容易卡住。而用极大似然估计损失函数是凸的优化起来稳定得多。3.2 极大似然推导与对数损失对于二分类问题样本的似然函数是$$ L(\boldsymbol{w}) \prod_{i1}^{m} P(y_i|\boldsymbol{x}_i) $$取对数后变成$$ \ell(\boldsymbol{w}) \sum_{i1}^{m} \left[ y_i \ln \sigma(\boldsymbol{w}^\top \boldsymbol{x}_i) (1-y_i) \ln (1 - \sigma(\boldsymbol{w}^\top \boldsymbol{x}_i)) \right] $$我们要最大化这个对数似然等价于最小化它的相反数也就是对数损失Log Loss$$ E(\boldsymbol{w}) -\sum_{i1}^{m} \left[ y_i \ln \sigma(\boldsymbol{w}^\top \boldsymbol{x}_i) (1-y_i) \ln (1 - \sigma(\boldsymbol{w}^\top \boldsymbol{x}_i)) \right] $$这个损失函数是凸的可以用梯度下降、牛顿法等方法求解。梯度形式非常漂亮$$ \frac{\partial E}{\partial \boldsymbol{w}} \sum_{i1}^{m} (\sigma(\boldsymbol{w}^\top \boldsymbol{x}_i) - y_i) \boldsymbol{x}_i $$你会发现它和线性回归的梯度形式几乎一样只是把预测值换成了 Sigmoid 输出。这也是为什么逻辑回归在工程上这么好用——梯度计算简单易于并行。3.3 牛顿法为什么它比梯度下降收敛快逻辑回归的损失函数二阶可导所以可以用牛顿法$$ \boldsymbol{w}_{t1} \boldsymbol{w}_t - \boldsymbol{H}^{-1} \nabla E(\boldsymbol{w}_t) $$其中 $\boldsymbol{H}$ 是 Hessian 矩阵。牛顿法利用了二阶曲率信息通常迭代几次就能收敛比梯度下降快得多。但代价是每次迭代要计算 $d \times d$ 的 Hessian 矩阵及其逆当特征维度很高时开销很大。所以实际工程中维度低时用牛顿法维度高时用 L-BFGS 或者随机梯度下降。实操心得逻辑回归在特征维度几千以内、样本量几十万以内时用 L-BFGS 基本是“秒级”收敛。如果维度上百万那就老老实实上 SGD 或者 FTRL。4. 线性判别分析降维和分类如何一箭双雕4.1 LDA 的核心思想投影后类内紧凑、类间分散线性判别分析LDA的思路和前面两个模型不太一样。它不直接拟合概率而是想找一个投影方向 $\boldsymbol{w}$让数据投影到这条直线上之后同类样本尽量聚在一起不同类样本尽量分开。用数学语言描述就是最大化$$ J(\boldsymbol{w}) \frac{\boldsymbol{w}^\top \boldsymbol{S}_b \boldsymbol{w}}{\boldsymbol{w}^\top \boldsymbol{S}_w \boldsymbol{w}} $$其中 $\boldsymbol{S}_b$ 是类间散度矩阵$\boldsymbol{S}_w$ 是类内散度矩阵。这个比值越大说明投影后类间距离相对于类内距离越大分类效果越好。4.2 广义瑞利商与闭式解这个优化问题是一个广义瑞利商问题可以通过拉格朗日乘子法求解。最终得到$$ \boldsymbol{S}_w^{-1} \boldsymbol{S}_b \boldsymbol{w} \lambda \boldsymbol{w} $$也就是说$\boldsymbol{w}$ 是 $\boldsymbol{S}_w^{-1} \boldsymbol{S}_b$ 的特征向量。对于二分类问题$\boldsymbol{S}_b$ 的秩最多为 1所以 $\boldsymbol{w}$ 的方向就是$$ \boldsymbol{w} \boldsymbol{S}_w^{-1} (\boldsymbol{\mu}_0 - \boldsymbol{\mu}_1) $$这个结果非常直观先把两类均值差的方向找出来再用类内散度矩阵的逆去“白化”它让类内分布更均匀。4.3 LDA 与 PCA 的区别很多人会把 LDA 和 PCA 搞混因为它们都是降维方法。但两者的目标完全不同对比项PCALDA是否有监督无监督有监督优化目标最大化投影方差最大化类间/类内散度比适用场景数据压缩、可视化分类前的降维降维后维度可指定最多为类别数减一PCA 只关心保留信息量不关心类别标签LDA 则充分利用标签信息让降维后的数据更容易分类。所以如果你做的是分类任务LDA 通常比 PCA 更合适。5. 多分类学习与类别不平衡从二分类到真实场景5.1 OvO、OvR 与 MvM 的取舍现实中大部分分类问题都不是二分类而是多分类。把二分类器扩展到多分类常见有三种策略OvO一对一每两个类别训练一个分类器共 $N(N-1)/2$ 个。预测时投票决定。优点是每个分类器只用到两类数据训练快缺点是分类器数量随类别数平方增长。OvR一对其余每个类别训练一个分类器共 $N$ 个。预测时取置信度最大的类别。优点是分类器数量少缺点是每个分类器都用了全部数据且正负样本不平衡。MvM多对多每次选一部分类作为正类一部分作为负类需要设计纠错输出码ECOC。理论上更优雅但实现复杂实际用得少。实操建议类别数少于 10 时OvO 和 OvR 差别不大类别数很多时优先考虑 OvR 或者直接上 Softmax 回归。5.2 类别不平衡的三大处理策略类别不平衡是工业界最常见的问题之一。比如风控场景坏样本可能只占千分之一。处理方法主要有三类欠采样从多数类中随机丢弃一些样本让正负样本接近。优点是训练快缺点是丢失信息。改进版是 EasyEnsemble做多次欠采样然后集成。过采样复制少数类样本或者用 SMOTE 生成新的少数类样本。优点是保留信息缺点是容易过拟合。SMOTE 通过在近邻之间插值生成新样本效果通常比简单复制好。阈值移动不改变训练数据而是在预测时调整决策阈值。如果正类先验概率是 $\pi^$负类是 $\pi^-$那么最优决策阈值是 $\frac{\pi^}{\pi^-}$ 的某种缩放。实际中常用的是根据业务需求调整阈值比如风控场景宁可错杀不可放过就把阈值调低。下面是一个用imbalanced-learn做 SMOTE 的示例from imblearn.over_sampling import SMOTE from sklearn.datasets import make_classification from collections import Counter X, y make_classification(n_samples1000, n_features20, weights[0.95, 0.05], random_state42) print(原始分布:, Counter(y)) smote SMOTE(random_state42) X_res, y_res smote.fit_resample(X, y) print(SMOTE 后分布:, Counter(y_res))实测下来SMOTE 在中小规模数据上效果稳定但样本量特别大时计算开销会明显上升这时候可以考虑先用欠采样再上 SMOTE 的混合策略。6. 常见问题与排查技巧实录6.1 线性模型常见问题速查表问题现象可能原因排查思路解决方案训练损失不下降学习率太小或特征未归一化检查梯度范数、特征尺度归一化特征调大学习率权重范数爆炸特征共线性严重计算特征相关系数矩阵加 L2 正则或做 PCA 降维逻辑回归预测全为同一类类别极度不平衡查看标签分布调整阈值或用 SMOTELDA 降维后效果差类内散度矩阵奇异检查特征维度与样本量先做 PCA 降维再 LDA闭式解报错矩阵不可逆特征数大于样本数检查 $d$ 与 $m$ 的关系改用岭回归或梯度下降6.2 独家避坑技巧第一个坑是忘记补偏置列。很多人写线性回归代码时直接把 $\boldsymbol{X}$ 丢进去算结果模型没有截距拟合效果差一大截。记住只要模型有 $b$就要在 $\boldsymbol{X}$ 后面补一列 1。第二个坑是正则化时把偏置项也正则了。偏置项控制的是模型的整体偏移正则化它会导致模型欠拟合。标准做法是在正则化矩阵 $\boldsymbol{I}$ 中把最后一行最后一列设为 0。第三个坑是逻辑回归用 MSE 当损失。前面说过MSE 加 Sigmoid 是非凸的梯度下降容易卡在局部极小值。一定要用对数损失这是从极大似然推出来的凸性有保证。第四个坑是多分类时 OvR 的正负样本比例失衡。比如 10 分类每个分类器正样本占 10%负样本占 90%。这时候要么用类别权重要么直接用 Softmax 回归。6.3 参数计算实例岭回归的 $\lambda$ 怎么选$\lambda$ 的选择没有解析解通常用交叉验证。下面是一个 5 折交叉验证选 $\lambda$ 的代码from sklearn.linear_model import RidgeCV from sklearn.datasets import make_regression X, y make_regression(n_samples200, n_features20, noise0.1, random_state42) alphas [0.01, 0.1, 1.0, 10.0, 100.0] model RidgeCV(alphasalphas, cv5) model.fit(X, y) print(最优 alpha:, model.alpha_)实测下来$\lambda$ 在 $[0.01, 100]$ 之间按对数刻度取 5 到 10 个值基本能覆盖大多数场景。如果最优值落在边界上说明搜索范围需要扩大。7. 从公式到代码线性模型的工程落地要点7.1 特征工程比模型本身更重要线性模型对特征尺度非常敏感。如果某个特征取值范围是 $[0, 1]$另一个是 $[0, 10000]$那么梯度下降会走“之”字形收敛极慢。标准做法是做Z-score 标准化$$ x \frac{x - \mu}{\sigma} $$或者Min-Max 归一化$$ x \frac{x - x_{min}}{x_{max} - x_{min}} $$注意标准化参数必须只在训练集上计算然后应用到验证集和测试集。如果在全量数据上计算会造成信息泄露。7.2 稀疏特征与 FTRL工业界很多场景比如广告点击率预测的特征维度是千万甚至上亿级别的而且非常稀疏。这时候用 L-BFGS 就不合适了因为 Hessian 矩阵根本存不下。FTRLFollow The Regularized Leader是这类场景的标配它结合了 L1 和 L2 正则能在线学习而且对稀疏特征非常友好。FTRL 的核心更新公式是$$ w_{t1,i} -\frac{z_{t,i} - \text{sign}(z_{t,i}) \lambda_1}{(\beta \sqrt{n_{t,i}})/\alpha \lambda_2} $$其中 $z$ 和 $n$ 是累积的梯度和梯度平方。这个公式看起来复杂但实现起来并不难而且工程上非常稳定。7.3 模型评估不要只看准确率线性模型做分类时如果类别不平衡准确率会严重误导。比如 99% 的样本是负类模型全预测负类也有 99% 准确率但毫无意义。这时候要看AUC、F1、召回率、精确率。AUC 衡量的是模型对正负样本的排序能力不受阈值影响是分类任务最常用的指标之一。8. 线性模型的边界与延伸线性模型最大的局限是它只能拟合线性关系。如果数据本身是非线性的线性模型就会欠拟合。解决办法有两个一是做特征交叉手动构造多项式特征二是用核方法把线性模型扩展到高维空间这就是核线性回归和核逻辑回归。另一个延伸方向是广义线性模型GLM。线性回归假设输出服从高斯分布逻辑回归假设输出服从伯努利分布它们都是 GLM 的特例。GLM 的统一框架是输出变量服从指数族分布均值通过链接函数与线性组合相连。理解了 GLM你就理解了线性模型的“终极形态”。我个人在实际项目中的体会是线性模型不是“简单模型”而是“基础模型”。它训练快、可解释性强、易于部署在很多业务场景下比如风控评分卡、推荐粗排依然是首选。真正把线性模型吃透的人再去学树模型、神经网络会发现很多概念都是相通的——正则化、损失函数、梯度下降、偏差方差权衡这些东西在哪个模型里都跑不掉。所以别急着跳过这一章多花点时间把公式推一遍、代码写一遍后面会省很多力气。