
1. 气温预测项目概述气温预测是机器学习中一个典型的回归问题通过历史气象数据来预测未来某天的最高温度。这个项目非常适合初学者练手因为它涵盖了数据科学项目的完整流程从数据探索、预处理到模型构建、训练和评估。使用PyTorch框架可以让我们更灵活地控制模型结构同时也能体验到深度学习框架带来的便利。我最初接触这个项目时发现它有几个特别适合新手的优点数据集规模适中348条记录、特征数量合理8个自变量而且预测目标明确最高气温。这种小而美的项目能让你快速看到成果不会在复杂数据处理上消耗太多精力。2. 数据探索与预处理2.1 理解数据集结构我们使用的temps.csv数据集包含以下字段时间相关特征year(年)、month(月)、day(日)、week(星期)温度相关特征temp_1(昨天最高温)、temp_2(前天最高温)、average(历史同期平均温度)其他特征friend(朋友预测值)目标变量actual(当日实际最高温)第一次加载数据时我习惯先用head()查看前几行再用shape确认数据维度。这个数据集有348行×9列足够训练一个基础模型。import pandas as pd dataset pd.read_csv(temps.csv) print(dataset.shape) # 输出(348, 9) print(dataset.head())2.2 数据可视化分析在建模前我强烈建议先做可视化分析。用matplotlib绘制时间序列图能直观发现数据规律import matplotlib.pyplot as plt plt.style.use(fivethirtyeight) fig, ((ax1, ax2), (ax3, ax4)) plt.subplots(2, 2, figsize(15,10)) ax1.plot(dates, dataset[actual], labelActual) ax2.plot(dates, dataset[temp_1], labelYesterday) ax3.plot(dates, dataset[temp_2], labelTwo Days Ago) ax4.plot(dates, dataset[friend], labelFriend Estimate)通过对比四个子图我发现实际温度与前两天温度高度相关而朋友的预测偏差较大。这个观察提示我们temp_1和temp_2应该是重要特征。2.3 数据预处理实战独热编码week字段是字符串类型如Mon需要转换为数值。我推荐使用pandas的get_dummies()dataset pd.get_dummies(dataset, columns[week])标准化处理不同特征的数值范围差异很大月份1-12温度可能到40使用StandardScaler进行标准化from sklearn.preprocessing import StandardScaler scaler StandardScaler() features scaler.fit_transform(dataset.drop(actual, axis1)) labels dataset[actual].values这里有个小技巧记得先把目标变量actual单独保存再从特征中删除它避免数据泄露。3. PyTorch模型构建3.1 基础版手动实现网络我们先尝试手动实现一个双层神经网络理解底层原理import torch # 转换数据为Tensor inputs torch.tensor(features, dtypetorch.float32) targets torch.tensor(labels, dtypetorch.float32) # 初始化参数 weights1 torch.randn(14, 128, requires_gradTrue) # 输入层到隐藏层 bias1 torch.zeros(128, requires_gradTrue) weights2 torch.randn(128, 1, requires_gradTrue) # 隐藏层到输出层 bias2 torch.zeros(1, requires_gradTrue) # 训练循环 for epoch in range(1000): # 前向传播 hidden torch.relu(inputs weights1 bias1) predictions hidden weights2 bias2 # 计算损失 loss torch.mean((predictions - targets)**2) # 反向传播 loss.backward() # 更新参数 with torch.no_grad(): weights1 - 0.001 * weights1.grad bias1 - 0.001 * bias1.grad weights2 - 0.001 * weights2.grad bias2 - 0.001 * bias2.grad # 清零梯度 weights1.grad.zero_() bias1.grad.zero_() weights2.grad.zero_() bias2.grad.zero_()手动实现虽然繁琐但能让你真正理解神经网络的工作原理。我在第一次实现时忘了清零梯度导致训练完全失败——这也是新手常踩的坑。3.2 进阶版使用nn.ModulePyTorch提供了更高层的API可以简化代码import torch.nn as nn class TemperatureModel(nn.Module): def __init__(self): super().__init__() self.layer1 nn.Linear(14, 128) self.layer2 nn.Linear(128, 1) def forward(self, x): x torch.relu(self.layer1(x)) return self.layer2(x) model TemperatureModel() criterion nn.MSELoss() optimizer torch.optim.Adam(model.parameters(), lr0.001)这个版本代码更简洁而且支持GPU加速。我建议在熟悉基础原理后优先采用这种方式。4. 模型训练与优化4.1 训练过程实现使用小批量训练可以提高训练效率batch_size 32 for epoch in range(1000): for i in range(0, len(features), batch_size): # 获取小批量 batch_X inputs[i:ibatch_size] batch_y targets[i:ibatch_size] # 前向传播 outputs model(batch_X) loss criterion(outputs, batch_y) # 反向传播 optimizer.zero_grad() loss.backward() optimizer.step()我习惯每100个epoch打印一次损失值观察训练进度。如果损失下降不明显可能需要调整学习率或模型结构。4.2 模型评估技巧训练完成后我们可以可视化预测效果with torch.no_grad(): predictions model(inputs).numpy() plt.figure(figsize(10,6)) plt.plot(dates, labels, b-, labelActual) plt.plot(dates, predictions, r--, labelPredicted) plt.legend() plt.show()从我的经验看好的预测结果应该与实际值趋势一致允许有小幅偏差。如果出现明显滞后或超前可能需要增加时序特征。5. 模型部署与应用5.1 保存与加载模型训练好的模型可以保存供后续使用torch.save(model.state_dict(), temp_model.pth) # 加载模型 loaded_model TemperatureModel() loaded_model.load_state_dict(torch.load(temp_model.pth))5.2 构建预测函数封装一个端到端的预测函数def predict_temperature(new_data): # 预处理输入数据 new_df pd.DataFrame([new_data]) new_df pd.get_dummies(new_df) # 确保特征顺序一致 missing_cols set(dataset.columns) - set(new_df.columns) for col in missing_cols: new_df[col] 0 new_df new_df[dataset.columns] # 标准化并预测 inputs scaler.transform(new_df.drop(actual, axis1)) inputs torch.tensor(inputs, dtypetorch.float32) with torch.no_grad(): return model(inputs).item()这个函数可以处理新的输入数据比如预测明天的温度pred predict_temperature({ year: 2023, month: 7, day: 15, week: Fri, temp_1: 32, temp_2: 30, average: 31.5, friend: 33 }) print(f预测温度: {pred:.1f}°C)6. 项目优化方向完成基础版本后我有几个优化建议增加特征工程尝试添加季节特征、温度变化趋势等尝试不同模型结构LSTM可能更适合时序预测超参数调优使用Optuna等工具自动搜索最佳参数部署为Web服务用Flask/FastAPI构建API接口记得在优化时保留基准模型方便对比改进效果。我在实际项目中通过增加移动平均特征将预测准确率提升了12%。7. 常见问题解决在指导学员时我发现以下几个高频问题问题1预测结果全是同一个值可能原因模型没有学到有效特征解决方案检查数据预处理是否正确尝试增加网络深度问题2损失值震荡严重可能原因学习率设置过高解决方案降低学习率或使用学习率调度器问题3GPU利用率低可能原因批量大小太小解决方案增加batch_size但不要超过显存容量遇到问题时我建议先简化模型如减少层数确认基础流程能跑通再逐步增加复杂度。