自学内容网 自学内容网

时间序列问题解题(基于深度学习)(Datawhale AI 夏令营)

一,解题步骤

时间序列问题是指基于时间顺序的数据进行分析和预测的问题。在深度学习的背景下,常用的模型包括循环神经网络(RNN),长短期记忆网络(LSTM)和门控循环单元(GRU)等。这些模型在处理序列数据时具有较好的表现。以下是解题的一般步骤:

1. 数据预处理

数据收集

收集与问题相关的时间序列数据。例如,股票价格、天气数据、销售记录等。

数据清洗

处理缺失值和异常值,确保数据的一致性和完整性。可以使用插值、填补和过滤的方法来处理。

特征工程

根据具体问题的需求提取特征。例如,可以从时间戳中提取小时、星期、月份等时间特征,或计算移动平均值、标准差等统计特征。

数据标准化

将数据进行标准化或归一化处理,以加速模型的训练过程并提高模型的收敛速度。

2. 数据划分

将数据划分为训练集、验证集和测试集。训练集用于训练模型,验证集用于调整模型超参数,测试集用于评估模型的泛化能力。

3. 模型选择和搭建

选择适合的模型架构(RNN, LSTM, GRU等)并搭建模型。

RNN

RNN适用于处理序列数据,但存在梯度消失和梯度爆炸的问题,不适合长序列的预测。

import torch
import torch.nn as nn

class RNNModel(nn.Module):
    def __init__(self, input_size, hidden_size, output_size):
        super(RNNModel, self).__init__()
        self.rnn = nn.RNN(input_size, hidden_size, batch_first=True)
        self.fc = nn.Linear(hidden_size, output_size)

    def forward(self, x):
        out, _ = self.rnn(x)
        out = self.fc(out[:, -1, :])
        return out

LSTM

LSTM能够有效解决RNN的梯度消失问题,适合长序列的预测。

class LSTMModel(nn.Module):
    def __init__(self, input_size, hidden_size, output_size):
        super(LSTMModel, self).__init__()
        self.lstm = nn.LSTM(input_size, hidden_size, batch_first=True)
        self.fc = nn.Linear(hidden_size, output_size)

    def forward(self, x):
        out, _ = self.lstm(x)
        out = self.fc(out[:, -1, :])
        return out

GRU

GRU是LSTM的简化版本,训练速度更快,但性能稍逊于LSTM。

class GRUModel(nn.Module):
    def __init__(self, input_size, hidden_size, output_size):
        super(GRUModel, self).__init__()
        self.gru = nn.GRU(input_size, hidden_size, batch_first=True)
        self.fc = nn.Linear(hidden_size, output_size)

    def forward(self, x):
        out, _ = self.gru(x)
        out = self.fc(out[:, -1, :])
        return out

4. 模型训练

定义损失函数和优化器

选择适合的损失函数(如均方误差)和优化器(如Adam)。

criterion = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)

训练模型

通过反向传播算法训练模型,并在验证集上评估模型性能,调整超参数。

for epoch in range(num_epochs):
    outputs = model(train_data)
    optimizer.zero_grad()
    loss = criterion(outputs, train_labels)
    loss.backward()
    optimizer.step()
    
    if (epoch+1) % 100 == 0:
        print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')

5. 模型评估和预测

评估模型

在测试集上评估模型的性能,计算评价指标(如均方误差、平均绝对误差等)。

进行预测

使用训练好的模型进行未来数据的预测。

6. 模型保存和部署

保存训练好的模型,以便后续使用。可以将模型部署到云端或本地服务器,进行实时预测。

二,运用

1,导入库

import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from keras.models import Sequential
from keras.layers import LSTM, Dense, RepeatVector, TimeDistributed
from keras.optimizers import Adam

2,读取数据

train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')

3,数据预处理

def preprocess_data(df, look_back=100):
    grouped = df.groupby('id')
    datasets = {}
    for id, group in grouped:
        datasets[id] = group.values

    X, Y, OOT = [], [], []
    for id, data in datasets.items():
        for i in range(10, 15):
            a = data[i:(i + look_back), 3]
            a = np.append(a, np.array([0] * (100 - len(a))))
            X.append(a[::-1])
            Y.append(data[i - 10:i, 3][::-1])

        a = data[:100, 3]
        a = np.append(a, np.array([0] * (100 - len(a))))
        OOT.append(a[::-1])

    return np.array(X, dtype=np.float64), np.array(Y, dtype=np.float64), np.array(OOT, dtype=np.float64), list(
        datasets.keys())
  • groupby('id') 将数据按房屋ID分组。

  • datasets 用于存储每个房屋的数据。

  • 对每个房屋的数据进行处理:

    • X 是输入序列,每个序列长度为 look_back
    • Y 是输出目标,每个目标长度为10天。
    • OOT 是初始的100天数据,用于预测。
  • XOOT 中的数据反转([::-1]),可能是为了处理LSTM的输入序列。

  • 返回值包括 XYOOT 以及房屋ID列表。

4,定义模型

def build_model(look_back, n_features, n_output):
    model = Sequential()
    model.add(LSTM(50, input_shape=(look_back, n_features)))
    model.add(RepeatVector(n_output))
    model.add(LSTM(50, return_sequences=True))
    model.add(TimeDistributed(Dense(1)))
    model.compile(loss='mean_squared_error', optimizer=Adam(0.001))
    return model
  • Sequential 创建一个顺序模型。
  • 第一层 LSTM 具有50个单元,输入形状为 (look_back, n_features)
  • RepeatVector 将输入重复 n_output 次。
  • 第二层 LSTM 也有50个单元,return_sequences=True 表示返回整个序列。
  • TimeDistributed(Dense(1)) 对每个时间步应用一个全连接层。
  • 使用 Adam 优化器和均方误差损失函数编译模型。

5,预处理数据并且训练模型

look_back = 100
n_features = 1
n_output = 10

X, Y, OOT, house_ids = preprocess_data(train, look_back=look_back)

model = build_model(look_back, n_features, n_output)
model.fit(X, Y, epochs=10, batch_size=64, verbose=1)
# 保存模型到本地
model.save('trained_model.h5')

6,进行预测

# 加载保存的模型
loaded_model = load_model('trained_model.h5')

# 进行预测
predicted_values = loaded_model.predict(OOT)

参考文章:‍‌​‌‌‍‌‬‬​​⁠​⁠​​​‌​​⁠​​​‍‬‍⁠‌​‌​‌​​​​​​‍‌​​‌‌Task3:尝试使用深度学习方案 - 飞书云文档 (feishu.cn)


原文地址:https://blog.csdn.net/m0_72765822/article/details/140577456

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!