第 2 课
← 返回系列列表

Course 1:逻辑回归与分类

Machine Learning Specialization (2022) — 新版机器学习

逻辑回归、决策边界、过拟合与正则化。

Course 1:逻辑回归与分类

课程简介

逻辑回归、决策边界、过拟合与正则化。

🎬 本课程视频:Machine Learning Specialization (2022) — 新版机器学习


一、逻辑回归:从线性回归到分类

1.1 为什么不能用线性回归做分类

线性回归输出的是连续值(-∞ 到 +∞),而分类任务需要输出离散的类别标签(如 0 或 1)。如果直接用线性回归做二分类,有两个问题:

  1. 线性回归对离群点敏感——一个极端样本会显著改变决策边界
  2. 线性回归的预测值可能远小于 0 或远大于 1,无法解释为概率

1.2 逻辑回归的模型

逻辑回归在线性回归的输出上应用 Sigmoid 函数,将输出压缩到 (0, 1) 区间:

$$z = w^T x + b$$
$$\hat{y} = \sigma(z) = \frac{1}{1 + e^{-z}}$$

当 z → +∞ 时,σ(z) → 1;当 z → -∞ 时,σ(z) → 0;当 z = 0 时,σ(0) = 0.5。

预测规则:如果 ŷ ≥ 0.5,预测为正类(1);否则为负类(0)。

1.3 决策边界

分类的决策边界是模型预测概率等于 0.5 的点的集合。对于逻辑回归,决策边界是线性的:

$$w^T x + b = 0$$

通过引入多项式特征(如 x₁², x₁x₂ 等),逻辑回归可以表示非线性决策边界。

二、对数损失函数

2.1 为什么不用均方误差

如果把均方误差用于逻辑回归,损失函数关于参数 w 是非凸函数——存在多个局部极小值,梯度下降难以找到全局最优。

2.2 对数损失(交叉熵)

单样本的损失函数:

$$L(\hat{y}, y) = -[y \log(\hat{y}) + (1-y) \log(1-\hat{y})]$$

当 y=1 时,L = -log(ŷ),如果 ŷ 接近 1,损失接近 0;ŷ 接近 0 时损失趋向无穷大。
当 y=0 时,L = -log(1-ŷ),如果 ŷ 接近 0,损失接近 0;ŷ 接近 1 时损失趋向无穷大。

这个损失函数的解释:它源于最大似然估计。假设 y 服从伯努利分布,最大化对数似然等价于最小化交叉熵损失。

2.3 成本函数

所有训练样本的平均损失:

$$J(w,b) = -\frac{1}{m} \sum_{i=1}^{m} [y^{(i)} \log(\hat{y}^{(i)}) + (1-y^{(i)}) \log(1-\hat{y}^{(i)})]$$

这是一个凸函数,梯度下降可以可靠地收敛到全局最优。

三、梯度下降

逻辑回归的梯度计算与线性回归有相同的形式:

$$ rac{\partial J}{\partial w_j} = \frac{1}{m} \sum_{i=1}^{m} (\hat{y}^{(i)} - y^{(i)}) x_j^{(i)}$$

$$ rac{\partial J}{\partial b} = \frac{1}{m} \sum_{i=1}^{m} (\hat{y}^{(i)} - y^{(i)})$$

这个简洁的形式不是巧合——这是因为交叉熵损失和 Sigmoid 函数的导数结合后发生了约简。

def sigmoid(z):
    return 1 / (1 + np.exp(-z))

def logistic_regression(X, y, alpha=0.01, num_iters=1000):
    m, n = X.shape
    w = np.zeros((n, 1))
    b = 0.0

    for i in range(num_iters):
        z = np.dot(X, w) + b
        y_pred = sigmoid(z)

        dw = (1/m) * np.dot(X.T, (y_pred - y))
        db = (1/m) * np.sum(y_pred - y)

        w = w - alpha * dw
        b = b - alpha * db

        if i % 100 == 0:
            cost = -1/m * np.sum(y * np.log(y_pred) + (1-y) * np.log(1-y_pred))
            print(f"Iter {i}, cost: {cost:.4f}")

    return w, b

四、正则化

4.1 过拟合问题

当模型过于复杂(如使用高阶多项式特征)时,它可能完美拟合训练数据但泛化能力差——这就是过拟合。

正则化通过在损失函数中加入参数惩罚来限制模型的复杂度。

4.2 L2 正则化

损失函数变为:

$$J(w,b) = -\frac{1}{m} \sum_{i=1}^{m} [y^{(i)} \log(\hat{y}^{(i)}) + (1-y^{(i)}) \log(1-\hat{y}^{(i)})] + \frac{\lambda}{2m} \sum_{j=1}^{n} w_j^2$$

梯度更新变为:

$$w_j := w_j - \alpha \left[\frac{1}{m} \sum_{i=1}^{m} (\hat{y}^{(i)} - y^{(i)}) x_j^{(i)} + \frac{\lambda}{m} w_j\right]$$

可以看到,每次更新前权重先乘以 (1 - αλ/m) 这一衰减系数——所以正则化也称为权重衰减。

4.3 正则化强度 λ

λ 控制正则化的强度:
- λ = 0:无正则化,可能过拟合
- λ 过大:所有权重被推向 0,模型欠拟合
- λ 适中:在拟合数据和限制复杂度之间取得平衡

# sklearn 中的逻辑回归
from sklearn.linear_model import LogisticRegression

model = LogisticRegression(C=1.0, penalty='l2')  # C = 1/λ
model.fit(X_train, y_train)
y_pred = model.predict(X_test)

五、多分类与 Softmax

5.1 一对多策略

对于 K 类分类任务,可以训练 K 个二分类逻辑回归模型,每个模型区分"是/不是"某个类别。预测时选择置信度最高的类别。

5.2 Softmax 回归

Softmax 是逻辑回归在多分类上的直接推广。对于 K 个类别,模型输出每个类别的概率:

$$P(y = k | x) = \frac{e^{z_k}}{\sum_{j=1}^{K} e^{z_j}}$$

其中 z_k = w_k^T x + b_k。预测类别为概率最大的类别。

损失函数使用交叉熵:

$$J = -\frac{1}{m} \sum_{i=1}^{m} \log(P(y^{(i)} | x^{(i)}))$$

from sklearn.linear_model import LogisticRegression
# multi_class='multinomial' 使用 Softmax
model = LogisticRegression(multi_class='multinomial', solver='lbfgs')
model.fit(X_train, y_train)

延伸阅读

← Course 1:线性回归与梯度下降 Course 2:神经网络与 TensorFlow →