线性回归是机器学习中的基础算法之一,它旨在建立输入特征(X)和输出标签(y)之间的线性关系。在线性回归中,每个输出标签被表达为输入特征的线性函数,该函数使用权重和偏置。这些权重和偏置是模型参数,它们最初是随机初始化的,但随后会通过训练/学习过程中的每个周期更新。完成一次训练数据迭代的训练称为一个“周期”(epoch)。因此,需要训练模型多个周期,以便权重和偏置能够学习输入特征和输出标签之间的线性关系。
本教程将创建一个基于假设数据的模型,这些数据包括特定地区的平均气温、年降雨量和湿度对芒果和橙子产量的影响。训练数据如下表所示:
地区 | 温度(F) | 降雨量(mm) | 湿度(%) | 芒果(吨) | 橙子(吨) |
---|
在线性回归中,每个目标标签被表达为输入变量的加权和加上偏置,即:
芒果 = w11 * 温度 + w12 * 降雨量 + w13 * 湿度 + b1
橙子 = w21 * 温度 + w22 * 降雨量 + w23 * 湿度 + b2
最初,权重和偏置是随机初始化的,然后在训练过程中相应更新,以便这些权重和偏置能够预测任何地区在给定温度、降雨量和湿度条件下生产的芒果和橙子的数量,达到一定的准确度。这就是机器学习的核心。
现在,让开始使用PyTorch实现...
import torch
import numpy as np
上述表格中的训练数据可以使用NumPy表示为矩阵。因此,分别定义输入和目标:
inputs = np.array([...], dtype='float32')
targets = np.array([...], dtype='float32')
输入和目标矩阵都作为NumPy数组加载。这应该使用torch.from_numpy()方法转换为torch张量:
inputs = torch.from_numpy(inputs)
targets = torch.from_numpy(targets)
现在创建一个TensorDataset,它将输入和目标张量包装到一个数据集中。从torch.utils.data导入TensorDataset方法。可以使用索引像在Python中一样访问数据集中的行作为元组。
from torch.utils.data import TensorDataset
dataset = TensorDataset(inputs, targets)
使用Pytorch的DataLoader类,可以将数据集转换为预定义批量大小的批次,并随机从数据集中创建批次。
from torch.utils.data import DataLoader
batch_size = 3
train_loader = DataLoader(dataset, batch_size=batch_size, shuffle=True)
在线性回归中,需要找到最优的权重和偏置,以定义输入和输出之间的理想线性关系。因此,定义一组权重来建立输入特征和目标之间的线性关系。这里还设置超参数(即权重和偏置)的requires_grad属性为True。
w = torch.randn(2, 3, requires_grad=True)
b = torch.randn(2, requires_grad=True)
损失函数是衡量模型性能的指标。损失函数在更新超参数中起着重要作用,以便结果损失更小。回归中最广泛使用的损失函数之一是均方误差(MSE)或L2损失。MSE定义了实际值和预测值之间差异的平方的平均值。
def mse_loss(predictions, targets):
difference = predictions - targets
return torch.sum(difference * difference) / difference.numel()
epochs = 50
for i in range(epochs):
for x, y in train_loader:
preds = model(x)
loss = mse_loss(preds, y)
loss.backward()
with torch.no_grad():
w -= w.grad * 1e-6
b -= b.grad * 1e-6
w.grad.zero_()
b.grad.zero_()
print(f"Epoch {i}/{epochs}: Loss: {loss}")