PyTorch 线性回归(超详细)

更新时间:

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

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

截止目前, 星球 内专栏累计输出 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. 训练循环的实现

训练过程的核心是一个循环,包含以下步骤:

  1. 前向传播(Forward Pass):计算预测值。
  2. 计算损失(Loss Calculation):评估预测值与真实值的误差。
  3. 反向传播(Backward Pass):计算梯度。
  4. 参数更新(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 线性回归的原理与应用价值。

最新发布