PyTorch 线性回归(超详细)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 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+ 小伙伴加入学习 ,欢迎点击围观
线性回归的核心概念与数学原理
线性回归是机器学习中最基础的模型之一,其核心思想是通过一条直线(或超平面)来拟合数据点之间的关系。在数学上,线性回归的目标是找到一个函数 $y = \theta_0 + \theta_1 x$,使得预测值与真实值之间的误差最小。这里的 $\theta_0$ 和 $\theta_1$ 分别代表截距和斜率,是需要通过数据学习的参数。
为了形象化理解,可以将线性回归比作“画一条最贴近所有数据点的直线”。例如,假设我们有一组房屋面积(x轴)和房价(y轴)的数据点,线性回归的目标就是找到一条直线,让这条直线尽可能接近所有点,从而能根据面积预测房价。
在 PyTorch 中实现线性回归时,我们需要将这一数学过程转化为代码逻辑。PyTorch 提供了张量(Tensor)和自动求导(Autograd)功能,能够高效地完成参数优化和梯度计算。
数据准备与预处理:构建实验的基石
1. 合成数据集的生成
为了便于演示,我们首先生成一个简单的合成数据集。假设真实关系为 $y = 2x + 1$,并添加随机噪声:
import torch
import numpy as np
torch.manual_seed(42)
x = torch.linspace(0, 10, 100).unsqueeze(1) # 形状为 (100, 1)
noise = torch.randn(100, 1) * 1.5 # 添加噪声
y = 2 * x + 1 + noise
这里,unsqueeze(1)
将一维张量转换为二维,方便后续与权重矩阵相乘。噪声的加入模拟了现实数据中的不确定性。
2. 数据集划分与标准化
将数据分为训练集和测试集,并进行标准化(Mean Normalization)以加速收敛:
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
mean, std = x_train.mean(), x_train.std()
x_train = (x_train - mean) / std
x_test = (x_test - mean) / std
标准化的作用类似于“调整数据的单位”,使不同特征处于相似的量级,避免因数值差异过大导致优化困难。
模型构建:PyTorch 中的线性回归实现
1. 定义模型结构
在 PyTorch 中,模型通常通过继承 torch.nn.Module
类来构建。线性回归模型的结构非常简单,仅包含一个全连接层(Linear Layer):
class LinearRegression(torch.nn.Module):
def __init__(self):
super(LinearRegression, self).__init__()
self.linear = torch.nn.Linear(1, 1) # 输入维度 1,输出维度 1
def forward(self, x):
return self.linear(x)
这里,torch.nn.Linear(1, 1)
表示输入特征数为 1,输出也是一维的结果。该层会自动初始化权重($\theta_1$)和偏置($\theta_0$)。
2. 损失函数与优化器的选择
损失函数用于衡量模型预测值与真实值之间的差异。在线性回归中,均方误差(MSE)是最常用的损失函数:
criterion = torch.nn.MSELoss()
优化器负责根据损失函数的梯度调整模型参数。这里选择最基础的随机梯度下降(SGD):
model = LinearRegression()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
学习率(lr
)决定了参数更新的步长,过大会导致震荡,过小则收敛缓慢。
训练过程:参数优化与梯度下降
1. 训练循环的实现
训练过程的核心是一个循环,包含以下步骤:
- 前向传播(Forward Pass):计算预测值。
- 计算损失(Loss Calculation):评估预测值与真实值的误差。
- 反向传播(Backward Pass):计算梯度。
- 参数更新(Parameter Update):根据梯度调整参数。
num_epochs = 1000
for epoch in range(num_epochs):
# 前向传播
y_pred = model(x_train)
# 计算损失
loss = criterion(y_pred, y_train)
# 清空梯度
optimizer.zero_grad()
# 反向传播
loss.backward()
# 参数更新
optimizer.step()
# 打印损失
if (epoch+1) % 100 == 0:
print(f"Epoch {epoch+1}/{num_epochs}, Loss: {loss.item():.4f}")
2. 梯度下降的直观理解
可以将梯度下降想象为“下山过程”:
- 损失函数是山的高度,目标是找到最低点(最小损失)。
- 梯度是当前点的斜率方向,指引“下山”的方向。
- 学习率决定了每一步的步长。
PyTorch 的 backward()
方法自动计算梯度,而 optimizer.step()
则根据梯度和学习率调整参数。
模型评估与预测:验证学习效果
1. 测试集上的表现
训练完成后,需在测试集上评估模型性能:
with torch.no_grad():
y_test_pred = model(x_test)
test_loss = criterion(y_test_pred, y_test)
print(f"Test Loss: {test_loss.item():.4f}")
2. 参数可视化与对比
提取模型的参数,并与真实参数对比:
theta_0 = model.linear.bias.item()
theta_1 = model.linear.weight.item()
print(f"Learned Parameters: theta_0 = {theta_0:.2f}, theta_1 = {theta_1:.2f}")
print("True Parameters: theta_0 = 1.00, theta_1 = 2.00")
通过对比,可以看到模型是否成功学习到了接近真实值的参数。
进阶技巧:扩展与优化
1. 多变量线性回归
如果输入特征不止一个,只需调整模型的输入维度即可:
class MultipleLinearRegression(torch.nn.Module):
def __init__(self):
super().__init__()
self.linear = torch.nn.Linear(2, 1) # 输入维度为 2,输出维度为 1
2. 自动化流程与数据加载器
对于大规模数据,可使用 DataLoader
实现批处理:
from torch.utils.data import TensorDataset, DataLoader
train_dataset = TensorDataset(x_train, y_train)
train_loader = DataLoader(train_dataset, batch_size=16, shuffle=True)
for epoch in range(num_epochs):
for batch_x, batch_y in train_loader:
y_pred = model(batch_x)
loss = criterion(y_pred, batch_y)
# 后续步骤与之前相同
3. 正则化与过拟合防范
通过添加 L2 正则化(权重衰减)防止过拟合:
optimizer = torch.optim.SGD(model.parameters(), lr=0.01, weight_decay=1e-5)
总结:从线性回归到深度学习的桥梁
通过本教程,我们系统地学习了如何用 PyTorch 实现线性回归模型。这一过程不仅涵盖了数据准备、模型定义、训练优化等核心环节,还通过代码示例和直观比喻帮助读者理解抽象概念。
线性回归作为机器学习的基础,其背后的原理和实现方法为理解更复杂的模型(如神经网络)提供了重要基础。掌握 PyTorch 的线性回归实现后,开发者可以进一步探索逻辑回归、决策树,乃至深度学习中的卷积神经网络(CNN)和循环神经网络(RNN)。
实践建议:尝试将本教程的代码应用于真实数据集(如房价预测或销售额分析),并尝试调整学习率、批量大小等超参数,观察模型性能的变化。通过实践,您将更深入地理解 PyTorch 线性回归的原理与应用价值。