机器学习系列三【逻辑回归(Sigmoid函数、交叉熵损失)】

机器学习系列三:逻辑回归(分类的利器,Sigmoid 与交叉熵)

欢迎回到“机器学习系列”!在上一篇文章中,我们学习了如何用线性回归来预测连续的数值(比如房价、销售额)。但是,如果我们要解决的问题不是预测具体的数值,而是做选择题呢?

比如:这封邮件是“垃圾邮件”还是“正常邮件”?这个肿瘤是“恶性”还是“良性”?图片里的是“猫”还是“狗”?

这类问题在机器学习中被称为分类(Classification)问题。今天,我们将介绍分类领域中最基础、最经典的算法——逻辑回归(Logistic Regression)

💡 避坑指南: 虽然它的名字里带有“回归”二字,但逻辑回归是一个彻头彻尾的分类算法,最常用于解决二分类问题(是或否)。


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

你可能会想:既然是二分类(0 或 1),我能不能直接用线性回归拟合一条直线,然后设定一个阈值(比如 0.5)?大于 0.5 的预测为 1,小于 0.5 的预测为 0?

在某些极其理想的情况下,这似乎可行。但线性回归在分类任务上有两个致命缺陷:

  1. 对异常值极其敏感:如果数据集中突然出现一个极端的样本点,线性回归的直线会被严重拉扯,导致原本分类正确的点被错误划分。
  2. 输出范围不受限:线性回归的预测输出值可以远大于 1,也可以是负数。但分类问题的概率结果应该被严格限制在 0 到 1 之间。

为了解决这些问题,我们需要请出逻辑回归的核心武器——Sigmoid 函数


2. 核心魔法:Sigmoid 函数

为了让线性回归的输出老老实实地待在 0 到 1 之间,我们给线性模型的输出 $\theta^T x$ 套上了一个“转换器”,这个转换器就是 Sigmoid 函数(也叫逻辑函数)。

Sigmoid 函数的数学公式如下:

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

这个函数有一个非常优美的 S 型曲线。它具有以下神奇的特性:

  • 当 $z=0$ 时,$g(z)=0.5$。
  • 当 $z$ 趋近于正无穷大时,$g(z)$ 无限趋近于 1。
  • 当 $z$ 趋近于负无穷大时,$g(z)$ 无限趋近于 0。

通过将线性回归的输出代入 Sigmoid 函数,我们就得到了逻辑回归的预测模型:

$$h_\theta(x)=\frac{1}{1+e^{-\theta^T x}}$$

现在,$h_\theta(x)$ 的输出有了明确的物理意义:它代表了在给定特征 $x$ 和参数 $\theta$ 的情况下,样本属于正类(标签为 1)的概率。


3. 告别 MSE:为什么我们需要交叉熵损失?

在上一篇线性回归中,我们使用了均方误差(MSE)作为代价函数。那在逻辑回归中还能继续用 MSE 吗?

答案是:强烈不建议

如果我们把逻辑回归的模型 $h_\theta(x)$ 代入到 MSE 的公式中,由于 Sigmoid 函数中存在非线性的指数项,整个代价函数会变成一个“非凸函数”(Non-convex function)。这意味着函数图像会有非常多的局部最低点,如果我们使用梯度下降法去寻找最优解,极其容易被困在某个坑里出不来,找不到真正的全局最优解。

为了保证代价函数是一个平滑的“碗状”凸函数,逻辑回归引入了全新的代价函数——交叉熵损失(Cross-Entropy Loss,也叫对数损失 Log Loss)

3.1 交叉熵的直观理解

对于单个样本,交叉熵代价函数的定义是分段的:

  • 当真实标签 $y=1$ 时: 误差为 $-\log(h_\theta(x))$。如果模型预测的概率接近 1,误差几乎为 0;如果预测概率接近 0,误差将趋近于无穷大(给予极其严厉的惩罚)。
  • 当真实标签 $y=0$ 时: 误差为 $-\log(1-h_\theta(x))$。逻辑同上,预测越偏离 0,惩罚越重。

3.2 优雅的合并公式

为了方便计算机求导和优化,聪明的数学家们巧妙地利用 $y$ 只能取 0 或 1 的特性,将上述分段函数合并成了一个极其优雅的方程式。

对于包含 $m$ 个样本的整个训练集,逻辑回归的总体代价函数 $J(\theta)$ 如下:

$$J(\theta)=-\frac{1}{m}\sum_{i=1}^{m}[y^{(i)}\log(h_\theta(x^{(i)}))+(1-y^{(i)})\log(1-h_\theta(x^{(i)}))]$$

一旦我们定义好了这个凸的代价函数,剩下的工作就和线性回归一样了——使用梯度下降法(Gradient Descent)来不断更新参数 $\theta$,直到找到让 $J(\theta)$ 最小的最优解。


4. 总结

逻辑回归虽然基础,但它是现代深度学习的基石(神经网络中的神经元本质上就是执行类似逻辑回归的操作)。

  • 我们用 Sigmoid 函数 将连续的线性输出映射成了 $(0, 1)$ 之间的概率。
  • 我们用 交叉熵损失 替换了均方误差,不仅保证了函数的凸性,还完美契合了概率预测的惩罚逻辑。

掌握了线性回归和逻辑回归,你就已经拿下了机器学习中“连续预测”和“离散分类”的两大开山之作。


这是一份为你补充的实战演练部分。你可以直接将这部分内容无缝衔接到《机器学习系列三:逻辑回归》博客的末尾,让读者在理解理论后立刻获得动手成就感。


5. 实战演练:Python (Scikit-Learn) 代码与决策边界可视化

光说不练假把式。接下来,我们将使用 Python 中最强大的机器学习库 Scikit-Learn,用短短十几行代码实现一个逻辑回归模型,并把它如何“切分”数据的决策边界(Decision Boundary)直观地画出来。

5.1 实战代码

在这个例子中,我们首先生成一个包含两个特征(方便在二维平面上画图)的二分类数据集,然后训练模型并进行可视化。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_blobs

# 1. 生成模拟数据:200个样本,2个特征,2个类别(中心)
# random_state 保证每次运行结果一致,cluster_std 控制数据点的离散程度
X, y = make_blobs(n_samples=200, centers=2, n_features=2, random_state=42, cluster_std=2.0)

# 2. 初始化并训练逻辑回归模型
model = LogisticRegression()
model.fit(X, y)

# 3. 绘制决策边界的准备工作:生成网格点
# 获取数据在两个特征维度上的最大最小值,并各向外扩展一点作为画图边界
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1

# 使用 meshgrid 生成密集的网格点坐标矩阵 (步长为 0.02)
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02),
np.arange(y_min, y_max, 0.02))

# 4. 预测网格中每一个点的类别
# np.c_ 将 xx 和 yy 展平并组合成模型需要的二维特征矩阵格式
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape) # 将预测结果变回网格的形状

# 5. 可视化绘制
plt.figure(figsize=(8, 6))

# 绘制决策边界:用不同颜色填充网格 (contourf)
plt.contourf(xx, yy, Z, alpha=0.3, cmap=plt.cm.RdYlBu)

# 绘制原始的真实数据点:根据标签 y 涂上不同颜色
plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', cmap=plt.cm.RdYlBu)

plt.title("Logistic Regression Decision Boundary")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.show()

5.2 运行结果解析

当你运行这段代码后,你会看到一张带有两类数据点(比如红色和蓝色)的散点图,并且整个背景被划分成了两种颜色。

  • 背景颜色的交界线:这就是逻辑回归模型学到的决策边界
  • 线性本质:你会清晰地发现,这条边界是一条笔直的直线!这直观地证明了逻辑回归虽然用了非线性的 Sigmoid 函数将输出映射为概率,但它在特征空间中划分数据的边界依然是线性的。因此,逻辑回归本质上仍然是一个线性分类器

💡 进阶思考: 如果两类数据像太极图一样互相缠绕,一条直线根本切不开怎么办?这时候我们可以在逻辑回归中引入多项式特征(把特征进行平方、相乘等操作),或者直接拥抱更强大的非线性模型(如支持向量机 SVM、决策树或神经网络)。