线性回归
回归分析 是一种统计方法,用于根据输入特征预测数值。常见的应用包括预测房价、股票价值、患者住院时间以及零售销售预测。
回归问题类型
- 回归问题:关注预测连续数值。
- 分类问题:侧重于预测分类结果。
线性回归
定义
线性回归 是回归分析中的一种基础算法,它假设输入特征与目标变量之间存在线性关系。
应用
- 根据面积和房龄预测房价。
- 利用历史数据估算股票价格。
- 预测患者住院时间。
概念
数据集术语
- 训练数据集:用于拟合模型的数据子集。
- 样本:数据集中的一个单独实例或一行。
- 标签(目标):模型旨在预测的结果变量。
- 特征:用于预测标签的输入变量。
线性回归模型
线性方程
线性回归模型使用以下方程表示特征与标签之间的关系:
- 和 :分配给每个特征的权重。
- :偏置项(截距)。
矩阵形式
对于具有多个特征和数据点的模型,线性回归可以使用向量和矩阵表示:
- :特征向量。
- :权重向量。
对于多个观测值,方程扩展为:
- :包含所有特征向量的设计矩阵。
- :预测值向量。
损失函数
定义
损失函数 量化了模型预测值与实际数据之间的差异。
均方误差 (MSE)
回归任务中常用的损失函数:
- :数据点的数量。
- :第 个样本的实际目标值。
优化
解析解
假设设计矩阵 具有满秩,通过矩阵运算直接计算最优权重。
梯度下降
一种迭代优化技术,通过沿梯度相反方向更新权重来最小化损失函数。
小批量随机梯度下降 (SGD)
- 小批量 SGD:利用小而随机的数据子集(小批量)进行更频繁的权重更新。
- 优点:平衡了计算效率和收敛质量。
实践示例
PyTorch 模块实现
此示例演示了如何使用面向对象的方法设置一个完整的 PyTorch 模块,集成了模型、数据模块和训练器。
模块定义
import torch
from torch import nn, optim
from torch.utils.data import DataLoader, TensorDataset
from torchvision import transforms
class Module(nn.Module):
"""模型的基类。"""
def __init__(self):
super().__init__()
# 定义模型的层
self.net = nn.Sequential(
nn.Linear(784, 256),
nn.ReLU(),
nn.Linear(256, 10)
)
def forward(self, X):
"""网络的前向传播。"""
return self.net(X)
def training_step(self, batch):
"""计算一批数据的损失。"""
inputs, targets = batch
outputs = self(inputs)
loss = nn.CrossEntropyLoss()(outputs, targets)
return loss
def configure_optimizers(self):
"""设置优化器。"""
return optim.SGD(self.parameters(), lr=0.1)
数据模块
class DataModule:
"""数据处理的基类。"""
def __init__(self, batch_size=64):
# 应用于每个数据项的转换
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1307,), (0.3081,)) # MNIST 均值和标准差
])
# 虚拟数据:1000 个样本,每个样本 784 个特征(28x28 扁平化图像)
features = torch.rand(1000, 784)
labels = torch.randint(0, 10, (1000,))
dataset = TensorDataset(features, labels)
self.dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=True)
def get_dataloader(self):
return self.dataloader
训练器
class Trainer:
"""模型训练的基类。"""
def __init__(self, model, data_module, max_epochs=10):
self.model = model
self.data_module = data_module
self.max_epochs = max_epochs
self.optimizer = model.configure_optimizers()
def fit(self):
"""执行训练循环。"""
for epoch in range(self.max_epochs):
for batch in self.data_module.get_dataloader():
loss = self.model.training_step(batch)
self.optimizer.zero_grad()
loss.backward()
self.optimizer.step()
print(f'Epoch {epoch}, Loss: {loss.item()}')
执行
# 创建模型、数据模块和训练器的实例
model = Module()
data_module = DataModule()
trainer = Trainer(model, data_module)
# 开始训练
trainer.fit()