天气预测回归任务学习笔记
1. 导入必要的库
import numpy as np # 导入NumPy库,主要用于数值计算和数组处理
import pandas as pd # 导入Pandas库,用于数据处理和分析
import matplotlib.pyplot as plt # 导入Matplotlib库,主要用于数据可视化
import torch # 导入PyTorch库,用于构建和训练深度学习模型
import torch.optim as optim # 从PyTorch中导入优化器模块,用于设置模型的优化算法
import warnings # 导入warnings库,用于处理警告信息
warnings.filterwarnings("ignore") # 忽略所有警告信息
%matplotlib inline # 在Jupyter Notebook中显示Matplotlib绘制的图像
2. 读取数据
features = pd.read_csv('temps.csv') # 从 'temps.csv' 文件中读取数据
print('数据维度:', features.shape) # 显示数据维度
- pd.read_csv() 函数用于从CSV文件中读取数据并存储为DataFrame,方便数据分析和处理。
3. 处理日期数据
import datetime # 导入 datetime 模块,用于处理日期和时间# 提取年、月、日并组合成日期
years = features['year']
months = features['month']
days = features['day'] dates = [str(int(year)) + '-' + str(int(month)) + '-' + str(int(day)) for year, month, day in zip(years, months, days)]
dates = [datetime.datetime.strptime(date, '%Y-%m-%d') for date in dates]
4. 可视化数据
plt.style.use('fivethirtyeight') # 设置Matplotlib的绘图风格
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2, figsize=(10, 10)) # 创建子图布局
fig.autofmt_xdate(rotation=45) # 自动调整x轴日期标签的格式# 绘制不同的温度曲线
ax1.plot(dates, features['actual'])
ax2.plot(dates, features['temp_1'])
ax3.plot(dates, features['temp_2'])
ax4.plot(dates, features['friend'])plt.tight_layout(pad=2) # 自动调整子图之间的间距
5. 独热编码处理分类变量
features = pd.get_dummies(features) # 将分类变量进行独热编码
features.head(5) # 显示独热编码后的数据集的前5行
- pd.get_dummies() 是处理分类变量的常用方法,将其转换为适合机器学习模型的数值数据。
6. 准备标签和特征
labels = np.array(features['actual']) # 提取标签
features = features.drop('actual', axis=1) # 去掉标签列
feature_list = list(features.columns) # 保存特征列名
features = np.array(features) # 转换特征为NumPy数组
- drop() 函数用于删除DataFrame中的指定行或列。
总结
- 本次学习内容涵盖数据的读取、预处理、可视化以及特征和标签的准备。
- 使用Pandas和Matplotlib库进行数据操作和可视化,使用PyTorch进行模型构建与训练。
- 通过独热编码将分类变量转换为数值数据,以便用于机器学习模型。
7. 数据标准化
在训练神经网络之前,首先对输入特征进行标准化,以确保它们具有均值为0和方差为1的分布。这有助于提高模型的训练效率和收敛速度。
from sklearn import preprocessing # 导入预处理模块
input_features = preprocessing.StandardScaler().fit_transform(features) # 标准化数据
- StandardScaler: 计算每列的均值和标准差,并将数据转换为标准正态分布。
8. 构建神经网络模型
方法1: 手动构建模型
import torch# 将输入特征和标签转换为 PyTorch 张量
x = torch.tensor(input_features, dtype=float)
y = torch.tensor(labels, dtype=float)# 权重和偏置初始化
weights = torch.randn((14, 128), dtype=float, requires_grad=True) # 隐藏层权重
biases = torch.randn(128, dtype=float, requires_grad=True) # 隐藏层偏置
weights2 = torch.randn((128, 1), dtype=float, requires_grad=True) # 输出层权重
biases2 = torch.randn(1, dtype=float, requires_grad=True) # 输出层偏置# 学习率和损失记录
learning_rate = 0.001
losses = []for i in range(1000): # 训练迭代次数hidden = x.mm(weights) + biases # 隐层输出hidden = torch.relu(hidden) # ReLU 激活函数predictions = hidden.mm(weights2) + biases2 # 输出层预测值loss = torch.mean((predictions - y) ** 2) # 均方误差损失losses.append(loss.data.numpy()) # 记录损失if i % 100 == 0:print('loss:', loss)loss.backward() # 反向传播# 更新参数weights.data.add_(-learning_rate * weights.grad.data)biases.data.add_(-learning_rate * biases.grad.data)weights2.data.add_(-learning_rate * weights2.grad.data)biases2.data.add_(-learning_rate * biases2.grad.data)# 清空梯度weights.grad.data.zero_()biases.grad.data.zero_()weights2.grad.data.zero_()biases2.grad.data.zero_()
方法2: 使用 torch.nn.Sequential
构建模型
input_size = input_features.shape[1]
hidden_size1 = 128
hidden_size2 = 64
hidden_size3 = 32
output_size = 1
batch_size = 16 # 小批量大小# 定义神经网络模型
my_nn = torch.nn.Sequential(torch.nn.Linear(input_size, hidden_size1),torch.nn.Sigmoid(),torch.nn.Linear(hidden_size1, hidden_size2),torch.nn.Sigmoid(),torch.nn.Linear(hidden_size2, hidden_size3),torch.nn.Sigmoid(),torch.nn.Linear(hidden_size3, output_size)
)# 定义损失函数和优化器
cost = torch.nn.MSELoss(reduction='mean')
optimizer = torch.optim.Adam(my_nn.parameters(), lr=0.001)
9. 训练网络
使用小批量(Mini-Batch)方法进行训练,并记录每次迭代的平均损失。
losses = []
for i in range(1000):batch_loss = [] # 初始化每次迭代的损失记录for start in range(0, len(input_features), batch_size):end = start + batch_size if start + batch_size < len(input_features) else len(input_features)xx = torch.tensor(input_features[start:end], dtype=torch.float, requires_grad=True)yy = torch.tensor(labels[start:end], dtype=torch.float, requires_grad=True)prediction = my_nn(xx)loss = cost(prediction, yy)optimizer.zero_grad()loss.backward(retain_graph=True)optimizer.step()batch_loss.append(loss.data.numpy())if i % 100 == 0:losses.append(np.mean(batch_loss))print(i, np.mean(batch_loss))
10. 进行预测
将输入特征传入训练好的模型,获取预测结果。
predict = my_nn(x).data.numpy() # 获取模型预测值
11. 可视化结果
将真实值和预测值进行对比,以可视化模型性能。
# 转换日期格式
dates = [str(int(year)) + '-' + str(int(month)) + '-' + str(int(day)) for year, month, day in zip(years, months, days)]
dates = [datetime.datetime.strptime(date, '%Y-%m-%d') for date in dates]# 创建 DataFrame 存储真实值和预测值
true_data = pd.DataFrame(data={'date': dates, 'actual': labels})
predictions_data = pd.DataFrame(data={'date': test_dates, 'prediction': predict.reshape(-1)})# 绘图
plt.plot(true_data['date'], true_data['actual'], 'b-', label='actual') # 真实值
plt.plot(predictions_data['date'], predictions_data['prediction'], 'ro', label='prediction') # 预测值
plt.xticks(rotation=60) # x轴标签旋转
plt.legend() # 显示图例
plt.xlabel('Date') # x轴标签
plt.ylabel('Maximum Temperature (F)') # y轴标签
plt.title('Actual and Predicted Values') # 图表标题
总结
- 通过数据标准化、神经网络模型构建、训练及结果可视化,完成了天气预测的回归任务。
- 使用了多层感知器(MLP)模型,并对比了手动构建模型和使用
torch.nn.Sequential
的方法。 - 训练过程中采用了小批量梯度下降法,记录并分析了模型的损失值变化。
涉及函数
好的,以下是你学习笔记中每部分涉及到的主要函数总结:
1. 导入必要的库
import
: 用于导入所需的库和模块。
2. 读取数据
pd.read_csv('temps.csv')
: 从 CSV 文件中读取数据并存储为 DataFrame。features.shape
: 获取 DataFrame 的维度。
3. 处理日期数据
zip()
: 将多个可迭代对象聚合成元组。datetime.datetime.strptime(date, '%Y-%m-%d')
: 将字符串转换为日期对象。
4. 可视化数据
plt.style.use('fivethirtyeight')
: 设置绘图风格。plt.subplots(nrows=2, ncols=2, figsize=(10, 10))
: 创建子图布局。ax.plot(x, y)
: 绘制数据曲线。plt.tight_layout(pad=2)
: 自动调整子图间距。
5. 独热编码处理分类变量
pd.get_dummies(features)
: 将分类变量进行独热编码。
6. 准备标签和特征
np.array()
: 将数据转换为 NumPy 数组。features.drop('actual', axis=1)
: 去掉标签列。
7. 数据标准化
preprocessing.StandardScaler()
: 创建标准化对象。fit_transform(features)
: 计算均值和标准差并标准化数据。
8. 构建神经网络模型
torch.tensor(data, dtype=float)
: 将数据转换为 PyTorch 张量。torch.randn(size, dtype=float, requires_grad=True)
: 随机初始化权重和偏置。torch.relu()
: 应用 ReLU 激活函数。
9. 训练网络
loss.backward()
: 反向传播计算梯度。optimizer.zero_grad()
: 清空梯度。optimizer.step()
: 更新模型参数。
10. 进行预测
my_nn(x)
: 将输入特征传入模型以获取预测值。
11. 可视化结果
pd.DataFrame(data={...})
: 创建 DataFrame 存储数据。plt.plot(x, y)
: 绘制真实值和预测值的对比图。plt.legend()
: 显示图例。plt.xlabel()
和plt.ylabel()
: 设置 x 轴和 y 轴的标签。
总结
- 本部分涵盖了数据的读取、处理、可视化以及模型构建和训练所用到的函数,提供了一个完整的天气预测回归任务的流程。
如果需要更深入的讨论或者对某个函数的具体用法有疑问,欢迎随时提问!