# 逻辑回归:从线性直觉得到硬核推导 在机器学习的世界里,**逻辑回归 (Logistic Regression, LR)** 就像是那个扫地僧——你看它简单,只有几行代码,但它内功深厚。它是很多复杂算法(比如神经网络)的基石。 很多人对它的理解停留在“输出 0 到 1 之间概率的分类器”。这没错,但不够深。今天我们把它拆解开,先聊聊它的**设计直觉**,再硬核推导它的**求解过程**,最后手把手算一遍**ROC**。 --- ## 一、设计直觉:它是怎么“变”成线性的? 首先要澄清一个误区:逻辑回归虽然叫“回归”,但它干的是**分类**的活儿。不过,它骨子里流的确实是线性回归的血。 ### 1. 线性回归的尴尬 想象一下,线性回归的公式是: $z = \mathbf{w}^T\mathbf{x} + b$ 这个 $z$ 的范围非常狂野,从 $-\infty$ 到 $+\infty$。 但在二分类问题里,我们需要的是一个概率 $p$,它必须老老实实待在 $[0, 1]$ 之间。 > [!QUESTION] 核心难题 > 怎么把一个无限范围的线性结果,优雅地压缩到 $[0, 1]$ 之间? ### 2. 广义线性模型 (GLM) 的魔法 这时候,**广义线性模型 (GLM)** 的思想进场了。它的核心逻辑是:**如果你不能让线性方程直接等于目标 $y$,那就在中间加一个转换函数(链接函数)。** 逻辑回归的转换过程非常精妙,它不是强行压缩,而是换了个视角: 1. **几率 (Odds)**:先不看概率 $p$,看“发生概率与不发生概率的比值” $\frac{p}{1-p}$。范围变成了 $[0, +\infty)$。 2. **对数几率 (Log-Odds)**:对几率取对数 $\ln(\frac{p}{1-p})$。神奇的事情发生了,范围变成了 $(-\infty, +\infty)$。 这时候,我们就可以理直气壮地划等号了: $ \ln\left(\frac{p}{1-p}\right) = \mathbf{w}^T\mathbf{x} + b $ > [!NOTE] 物理含义 > 逻辑回归并没有改变线性的本质,它只是在**对数几率**这个空间里做线性回归。这也是为什么它的**决策边界 (Decision Boundary)** 依然是一条直线(或超平面)。 如果我们反解出 $p$,就得到了大家熟悉的 **Sigmoid 函数**: $ p = \frac{1}{1 + e^{-(\mathbf{w}^T\mathbf{x} + b)}} $ --- ## 二、硬核求解:为什么没有“一步到位”的解? 模型设计好了,下一步是求参数 $\mathbf{w}$ 和 $b$。 ### 1. 什么是“闭式解” (Closed-form Solution)? 在学[[线性回归]]时,最爽的一刻是推导出**正规方程**: $ \mathbf{w} = (\mathbf{X}^T\mathbf{X})^{-1}\mathbf{X}^T\mathbf{y} $ 只要把数据矩阵 $\mathbf{X}$ 和标签 $\mathbf{y}$ 往里一丢,经过有限次矩阵运算,直接算出最优解。这就叫**闭式解**(也叫解析解)。 > [!FAILURE] 逻辑回归没有闭式解 > 为什么?因为逻辑回归的损失函数里混入了非线性的 Sigmoid 函数 $\frac{1}{1+e^{-z}}$。 > 当你试图对它的梯度求导并令其为 0 时,你会得到一个**超越方程**——方程里既有线性项 $\mathbf{w}^T\mathbf{x}$,又有指数项 $e^{-\mathbf{w}^T\mathbf{x}}$。在代数上,你无法把 $\mathbf{w}$ 单独分离到等号一边。 所以,我们被迫放弃“一步到位”,只能采用**迭代法**(如梯度下降、牛顿法),像下山一样一步步逼近最优解。 ### 2. 极大似然估计 (MLE) 的推导 既然要迭代,目标函数 (Loss Function) 是什么? 逻辑回归最标准的解法是**极大似然估计 (MLE)**。 #### Step 1: 把分类概率合并成一个公式 对于二分类,样本 $y \in \{0, 1\}$: * 如果是 1 类:$P(y=1|x) = h_\theta(x)$ * 如果是 0 类:$P(y=0|x) = 1 - h_\theta(x)$ 利用数学技巧,把这两个式子合并: $ P(y|x) = h_\theta(x)^y (1 - h_\theta(x))^{1-y} $ #### Step 2: 写出似然函数 对于 $m$ 个样本,我们希望所有样本被“猜对”的联合概率最大: $ L(\theta) = \prod_{i=1}^m P(y^{(i)}|x^{(i)}) = \prod_{i=1}^m h_\theta(x^{(i)})^{y^{(i)}} (1 - h_\theta(x^{(i)}))^{1-y^{(i)}} $ #### Step 3: 对数似然 (Log-Likelihood) 连乘很难求导,取对数变成连加: $ l(\theta) = \log L(\theta) = \sum_{i=1}^m [y^{(i)}\log h_\theta(x^{(i)}) + (1-y^{(i)})\log (1 - h_\theta(x^{(i)}))] $ 这就是我们的优化目标。通常我们会加个负号变成 **Log-Loss (对数损失)**,然后去最小化它。 #### Step 4: 梯度的推导 (求导) 我们要用梯度下降更新参数,需要计算 $\frac{\partial l(\theta)}{\partial \theta_j}$。 利用链式法则,以及 Sigmoid 的导数性质 $h' = h(1-h)$,经过化简,你会得到一个极其优美的结果: $ \frac{\partial l(\theta)}{\partial \theta_j} = \sum_{i=1}^m (y^{(i)} - h_\theta(x^{(i)})) x_j^{(i)} $ > [!tip] 观察 > 这一项的意思是 `(真实值 - 预测值) * 输入特征`。 > 如果你眼熟的话,你会发现它**和线性回归的梯度公式长得一模一样**!这不是巧合,这是 GLM 家族的特性。 --- ## 三、模型评估:手算一遍 ROC 逻辑回归输出了概率,但怎么评估好坏?准确率 (Accuracy) 在样本不平衡时会骗人,所以我们看 **ROC 曲线** 和 **AUC**。 ### 1. ROC 的物理意义 ROC 曲线不是画出来的,是**扫描**出来的。它本质上是在考察模型的**排序能力**。 > [!info] AUC 的概率解释 > 如果你随机挑一个**正样本**和一个**负样本**,模型给**正样本打分 > 负样本打分**的概率,就是 AUC。 ### 2. 手算实例 假设我们有 5 个样本,**第一步必须按模型预测的概率从高到低排序**: | 样本 | 真实标签 (GT) | 预测概率 (Score) | 备注 | | :-- | :-------- | :----------- | :------------ | | **A** | **正 (P)** | **0.9** | | | **B** | **正 (P)** | **0.8** | | | **C** | **负 (N)** | **0.7** | **坏了,负样本排高了** | | **D** | **正 (P)** | **0.6** | | | **E** | **负 (N)** | **0.4** | | * 总正样本 $P_{all} = 3$ (A, B, D) * 总负样本 $N_{all} = 2$ (C, E) ROC 的绘制过程就是拿一把尺子(阈值),从上往下扫: 1. **阈值=1.0**:起点 $(0,0)$。 2. **阈值=0.9 (扫入 A)**: * A 是正样本(抓对了)。$TP=1$。 * $TPR = 1/3 \approx 0.33$ * $FPR = 0/2 = 0$ * **坐标点 (0, 0.33)** $\rightarrow$ *曲线向上走,好!* 3. **阈值=0.8 (扫入 B)**: * B 是正样本。$TP=2$。 * $TPR = 2/3 \approx 0.66$ * **坐标点 (0, 0.66)** $\rightarrow$ *继续向上* 4. **阈值=0.7 (扫入 C)**: * C 是负样本(抓错了!)。$TP=2$ (没变)。 * $FP=1$。 * $FPR = 1/2 = 0.5$ * **坐标点 (0.5, 0.66)** $\rightarrow$ *曲线向右平移,这就是模型能力的损失* 5. **阈值=0.6 (扫入 D)**: * D 是正样本。$TP=3$ (全抓到了)。 * $TPR = 1.0, FPR = 0.5$ * **坐标点 (0.5, 1.0)** $\rightarrow$ *向上到顶了* 6. **阈值=0.4 (扫入 E)**: * E 是负样本。 * **坐标点 (1.0, 1.0)** $\rightarrow$ *终点* ### 3. 结论 把这些点连起来,就是 ROC 曲线。 在这个例子中,因为样本 C(负)“插队”到了样本 D(正)的前面,导致曲线出现了一个**向右的折角**,AUC 面积就不如完美的 1.0 那么大。 --- ## 总结 逻辑回归之所以经典,是因为它完美平衡了**统计学的严谨**和**机器学习的实用**。 1. **直觉上**:它是用线性的尺子去丈量对数几率。 2. **求解上**:因为它没有闭式解,所以它教会了我们什么是梯度下降和极大似然估计。 3. **评估上**:ROC 曲线告诉我们要关注模型的排序能力,而不仅仅是硬切一个阈值。 理解了这些,你再看代码里的 `LogisticRegression()`,看到的就不再是一个黑盒,而是一个精致的概率机器。 [[Math Foundation - Rational Root Theorem]]