逻辑回归(Logistic Regression)(一文讲透)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

前言

在机器学习领域,逻辑回归(Logistic Regression)是一个简单但强大的算法,常被用于解决二元分类问题。无论是预测用户是否会点击广告,还是判断一封邮件是否为垃圾邮件,逻辑回归都能以直观的方式提供解决方案。尽管名字中带有“回归”二字,但它实际上属于分类算法的范畴。本文将从基础概念出发,结合数学原理和代码示例,帮助读者逐步理解逻辑回归的实现逻辑与应用场景,同时避免常见的认知误区。


逻辑回归的核心思想:从线性回归到分类问题

与线性回归的区别

线性回归用于预测连续数值(如房价、温度),而逻辑回归则用于二元分类(如“是/否”“真/假”)。两者的区别可以通过一个比喻理解:

  • 线性回归:像一个温度计,输出的是连续的温度值(如25°C)。
  • 逻辑回归:像一个“是否需要开空调”的判断器,根据温度值输出二元结果(如“需要”或“不需要”)。

逻辑函数(Sigmoid 函数)

逻辑回归的核心是 Sigmoid 函数,其公式为:
$$ \sigma(z) = \frac{1}{1 + e^{-z}} $$
该函数将任意实数 $z$ 映射到 $(0, 1)$ 的区间,输出可被解释为概率。例如,当输入 $z = 0$ 时,输出概率为 0.5;当 $z$ 增大时,概率趋近于 1,反之趋近于 0。

分类决策阈值

逻辑回归通过设定一个阈值(通常为 0.5)将概率转化为类别标签。例如:

  • 若 $P(y=1|x) > 0.5$,则预测为正类(如“患病”)。
  • 若 $P(y=1|x) \leq 0.5$,则预测为负类(如“未患病”)。

数学原理:从假设函数到损失函数

假设函数的构建

逻辑回归的假设函数形式与线性回归类似,但通过 Sigmoid 函数进行非线性变换:
$$ h_\theta(x) = \sigma(\theta^T x) = \frac{1}{1 + e^{-\theta^T x}} $$
其中,$\theta$ 是模型参数,$x$ 是输入特征向量。

损失函数的设计

线性回归使用平方误差作为损失函数,但逻辑回归需要最大化似然函数。其对数损失(Log Loss)公式为:
$$ L(\theta) = -\frac{1}{m} \sum_{i=1}^m [y^{(i)} \log(h_\theta(x^{(i)})) + (1 - y^{(i)}) \log(1 - h_\theta(x^{(i)}))] $$
此损失函数在 $y=1$ 时,若预测概率 $h_\theta(x)$ 接近 1,则损失较小;反之,若预测错误则损失显著增大。

参数优化:梯度下降法

逻辑回归通过梯度下降法最小化损失函数。参数更新公式为:
$$ \theta_j := \theta_j - \alpha \frac{\partial L}{\partial \theta_j} $$
其中,$\alpha$ 是学习率,梯度计算可通过链式法则推导得到。


实际案例:用逻辑回归进行鸢尾花分类

数据准备与特征工程

以经典的鸢尾花(Iris)数据集为例,我们尝试用逻辑回归区分“山鸢尾”(Setosa)与其他两类。

import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

iris = load_iris()
X = iris.data[:, :2]  # 仅使用前两个特征:花萼长度和宽度
y = (iris.target != 0).astype(int)  # 将 Setosa 标记为 0,其他为 1

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

模型训练与预测

使用 scikit-learn 的 LogisticRegression 类实现:

from sklearn.linear_model import LogisticRegression

model = LogisticRegression(max_iter=200)
model.fit(X_train, y_train)

y_pred = model.predict(X_test)
accuracy = model.score(X_test, y_test)
print(f"模型准确率:{accuracy:.2f}")

可视化决策边界

通过等高线图观察模型的分类决策:

import matplotlib.pyplot as plt

x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1),
                     np.arange(y_min, y_max, 0.1))
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

plt.contourf(xx, yy, Z, alpha=0.4)
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, edgecolors='k')
plt.xlabel('花萼长度')
plt.ylabel('花萼宽度')
plt.title('逻辑回归决策边界')
plt.show()

逻辑回归的优缺点与适用场景

优势分析

  1. 计算效率高:参数通过闭式解或梯度下降快速收敛。
  2. 可解释性强:系数 $\theta$ 直接反映特征对结果的影响方向和强度。
  3. 适合小规模数据:在特征较少时表现稳定,无需复杂调参。

局限性

  1. 无法处理非线性关系:需依赖人工特征工程(如多项式扩展)增强表达能力。
  2. 对异常值敏感:极端值可能显著影响参数估计。
  3. 仅适用于线性可分问题:在复杂分类任务中,需结合其他算法(如支持向量机或决策树)。

进阶技巧:正则化与多分类扩展

正则化防止过拟合

逻辑回归可通过添加 L1 或 L2 正则化项控制模型复杂度。例如,L2 正则化后的损失函数为:
$$ L_{\text{reg}}(\theta) = L(\theta) + \frac{\lambda}{2} \sum_{j=1}^n \theta_j^2 $$
其中,$\lambda$ 控制正则化强度。

多分类任务的 One-vs-Rest(OvR)策略

逻辑回归默认支持多分类任务,通过将问题拆分为多个二元分类任务。例如,对于三分类问题,模型会训练三个逻辑回归模型,每个模型区分一个类别与其他所有类别。


总结与实践建议

逻辑回归作为机器学习的经典算法,其简洁性与高效性使其成为入门者的首选工具。通过本文的数学推导、代码示例与案例分析,读者可以掌握其核心逻辑与实现步骤。对于进阶开发者,建议尝试以下实践:

  1. 使用真实业务数据(如客户流失预测)验证逻辑回归的效果;
  2. 探索正则化参数对模型性能的影响;
  3. 结合其他算法(如随机森林)进行模型融合。

记住,逻辑回归不仅是分类工具,更是理解机器学习基础原理的重要跳板。通过不断实践与思考,你将逐步构建起更复杂的模型与思维框架。

最新发布