本网站可以通过分类标签帮助你快速筛选出你想看的文章,记住地址:www.Facec.cc

PyTorch神经网络进行气温预测

一、数据格式

year,month,day,week,temp_2,temp_1,average,actual,friend
2016,1,1,Fri,45,45,45.6,45,29
2016,1,2,Sat,44,45,45.7,44,61
2016,1,3,Sun,45,44,45.8,41,56

二、损失函数

image.png

三、激活函数

image.png

二、代码

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import torch
import torch.optim as optim
import warnings
import datetime
from sklearn import preprocessing

# 1. 数据加载和预处理
# 加载数据
features = pd.read_csv('temps.csv')

# 查看数据结构
print(features.head())

# 提取年、月、日
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]
print(dates[:5])

# 独热编码
features = pd.get_dummies(features)  # 把星期几拆成0,1


# 真实值(标签)
labels = np.array(features['actual'])

# 从特征中移除标签列
features = features.drop('actual', axis=1)

# 保存特征列名称
feature_column_name = list(features.columns)

features = np.array(features)


input_features = preprocessing.StandardScaler().fit_transform(features) # 归一化特征

# 2. 将数据转换为Torch张量
x = torch.tensor(input_features, dtype=torch.float)
y = torch.tensor(labels, dtype=torch.float)

# 3. 初始化神经网络模型参数
input_size = input_features.shape[1]  # 特征数
hidden_size = 128  # 隐藏层神经元数
output_size = 1  # 输出层神经元数
batch_size = 16  # 批量大小

# 定义神经网络模型
my_nn = torch.nn.Sequential(
    torch.nn.Linear(input_size, hidden_size),
    torch.nn.Sigmoid(),
    torch.nn.Linear(hidden_size, output_size),
)

# 损失函数和优化器
cost = torch.nn.MSELoss(reduction='mean')
optimizer = torch.optim.Adam(my_nn.parameters(), lr=0.001)

# 4. 训练神经网络
losses = []
for epoch in range(1000):
    batch_loss = []
    # 使用MINI-Batch训练
    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的损失
        batch_loss.append(loss.data.numpy())

    # 每100轮输出一次平均损失
    if epoch % 100 == 0:
        losses.append(np.mean(batch_loss))
        print(f'Epoch {epoch}: Loss = {np.mean(batch_loss)}')

# 5. 进行预测
predict = my_nn(x).data.numpy()

# 6. 创建结果表格:日期与实际值
true_data = pd.DataFrame(data={'date': dates, 'actual': labels})

# 创建预测数据表格
months = features[:, feature_column_name.index('month')]
days = features[:, feature_column_name.index('day')]
years = features[:, feature_column_name.index('year')]

test_dates = [str(int(year)) + '-' + str(int(month)) + '-' + str(int(day)) for year, month, day in zip(years, months, days)]
test_dates = [datetime.datetime.strptime(date, '%Y-%m-%d') for date in test_dates]

predictions_data = pd.DataFrame(data={'date': test_dates, 'prediction': predict.reshape(-1)})

# 7. 绘制结果图
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)
plt.legend()

# 设置图表标签和标题
plt.xlabel('Date')
plt.ylabel('Maximum Temperature (F)')
plt.title('Actual and Predicted Values')

# 显示图表
plt.show()

# AI  

评论