跳到主要内容

线性回归

回归分析 是一种统计方法,用于根据输入特征预测数值。常见的应用包括预测房价、股票价值、患者住院时间以及零售销售预测。

回归问题类型

  • 回归问题:关注预测连续数值。
  • 分类问题:侧重于预测分类结果。

线性回归

定义

线性回归 是回归分析中的一种基础算法,它假设输入特征与目标变量之间存在线性关系。

应用

  • 根据面积和房龄预测房价。
  • 利用历史数据估算股票价格。
  • 预测患者住院时间。

概念

数据集术语

  • 训练数据集:用于拟合模型的数据子集。
  • 样本:数据集中的一个单独实例或一行。
  • 标签(目标):模型旨在预测的结果变量。
  • 特征:用于预测标签的输入变量。

线性回归模型

线性方程

线性回归模型使用以下方程表示特征与标签之间的关系:

price=wareaarea+wageage+b\text{price} = w_{\text{area}} \cdot \text{area} + w_{\text{age}} \cdot \text{age} + b
  • wareaw_{\text{area}}wagew_{\text{age}}:分配给每个特征的权重。
  • bb:偏置项(截距)。

矩阵形式

对于具有多个特征和数据点的模型,线性回归可以使用向量和矩阵表示:

y^=wx+b\hat{y} = \mathbf{w}^\top \mathbf{x} + b
  • x\mathbf{x}:特征向量。
  • w\mathbf{w}:权重向量。

对于多个观测值,方程扩展为:

y^=Xw+b\hat{\mathbf{y}} = \mathbf{X} \mathbf{w} + b
  • X\mathbf{X}:包含所有特征向量的设计矩阵。
  • y^\hat{\mathbf{y}}:预测值向量。

损失函数

定义

损失函数 量化了模型预测值与实际数据之间的差异。

均方误差 (MSE)

回归任务中常用的损失函数:

L(w,b)=1ni=1n(wx(i)+by(i))2L(\mathbf{w}, b) = \frac{1}{n} \sum_{i=1}^n \left(\mathbf{w}^\top \mathbf{x}^{(i)} + b - y^{(i)}\right)^2
  • nn:数据点的数量。
  • y(i)y^{(i)}:第 ii 个样本的实际目标值。

优化

解析解

假设设计矩阵 X\mathbf{X} 具有满秩,通过矩阵运算直接计算最优权重。

梯度下降

一种迭代优化技术,通过沿梯度相反方向更新权重来最小化损失函数。

小批量随机梯度下降 (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()

参考资料和有用链接