回归任务学习笔记

天气预测回归任务学习笔记

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 轴的标签。

总结

  • 本部分涵盖了数据的读取、处理、可视化以及模型构建和训练所用到的函数,提供了一个完整的天气预测回归任务的流程。

如果需要更深入的讨论或者对某个函数的具体用法有疑问,欢迎随时提问!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值