逻辑回归(Logistic Regression)(一文讲透)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 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()
逻辑回归的优缺点与适用场景
优势分析
- 计算效率高:参数通过闭式解或梯度下降快速收敛。
- 可解释性强:系数 $\theta$ 直接反映特征对结果的影响方向和强度。
- 适合小规模数据:在特征较少时表现稳定,无需复杂调参。
局限性
- 无法处理非线性关系:需依赖人工特征工程(如多项式扩展)增强表达能力。
- 对异常值敏感:极端值可能显著影响参数估计。
- 仅适用于线性可分问题:在复杂分类任务中,需结合其他算法(如支持向量机或决策树)。
进阶技巧:正则化与多分类扩展
正则化防止过拟合
逻辑回归可通过添加 L1 或 L2 正则化项控制模型复杂度。例如,L2 正则化后的损失函数为:
$$ L_{\text{reg}}(\theta) = L(\theta) + \frac{\lambda}{2} \sum_{j=1}^n \theta_j^2 $$
其中,$\lambda$ 控制正则化强度。
多分类任务的 One-vs-Rest(OvR)策略
逻辑回归默认支持多分类任务,通过将问题拆分为多个二元分类任务。例如,对于三分类问题,模型会训练三个逻辑回归模型,每个模型区分一个类别与其他所有类别。
总结与实践建议
逻辑回归作为机器学习的经典算法,其简洁性与高效性使其成为入门者的首选工具。通过本文的数学推导、代码示例与案例分析,读者可以掌握其核心逻辑与实现步骤。对于进阶开发者,建议尝试以下实践:
- 使用真实业务数据(如客户流失预测)验证逻辑回归的效果;
- 探索正则化参数对模型性能的影响;
- 结合其他算法(如随机森林)进行模型融合。
记住,逻辑回归不仅是分类工具,更是理解机器学习基础原理的重要跳板。通过不断实践与思考,你将逐步构建起更复杂的模型与思维框架。