直接回答:时间序列预测从最简单的开始试:数据平稳、规律明显就用滑动平均或 ARIMA,有明显外部变量影响就用回归,只有数据量足够大、关系复杂时才值得上 LSTM 这类模型。

数据示例:

假设你有两个数组(时间序列数据):

  1. 容器外温度数据(external_temp_data)

    1
    2
    3
    4
    5
    6
    7

    external_temp_data = [
    {"time": "2023-01-01 00:00", "temp": 5.0},
    {"time": "2023-01-01 01:00", "temp": 6.1},
    {"time": "2023-01-01 02:00", "temp": 7.3},
    ...
    ]
  2. 容器内温度数据(internal_temp_data)

    1
    2
    3
    4
    5
    6
    7

    internal_temp_data = [
    {"time": "2023-01-01 00:00", "temp": 4.8},
    {"time": "2023-01-01 01:00", "temp": 5.1},
    {"time": "2023-01-01 02:00", "temp": 6.2},
    ...
    ]

步骤概述

  1. 数据预处理:将时间序列数据处理成LSTM可以接受的格式。
  2. 构造LSTM模型:创建和训练LSTM模型。
  3. 模型评估与预测:评估模型的性能,并用它来预测未来的容器内温度。

1. 数据预处理

首先,需要将时间序列数据转换为适合LSTM的格式。LSTM需要输入的形状是 (样本数, 时间步长, 特征数),而输出是 (样本数, 目标变量数)。因此,需要:

  • 按时间顺序对外温度数据进行对齐。
  • 构造滑动窗口特征(即将过去几个时间步的外温度作为特征)。
  • 标准化数据(LSTM对标准化数据表现较好)。

数据准备与处理

假设你将容器外温度的过去 n 个时间步作为输入特征,容器内温度作为目标变量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split

# 转换为DataFrame
external_df = pd.DataFrame(external_temp_data)
internal_df = pd.DataFrame(internal_temp_data)

# 将时间字段转换为日期格式
external_df['time'] = pd.to_datetime(external_df['time'])
internal_df['time'] = pd.to_datetime(internal_df['time'])

# 按时间对齐外温度和内温度数据
merged_df = pd.merge(external_df, internal_df, on='time', suffixes=('_ext', '_int'))

# 选择温度值列
external_temps = merged_df['temp_ext'].values
internal_temps = merged_df['temp_int'].values

# 标准化数据
scaler_ext = MinMaxScaler(feature_range=(0, 1))
scaler_int = MinMaxScaler(feature_range=(0, 1))

external_temps_scaled = scaler_ext.fit_transform(external_temps.reshape(-1, 1))
internal_temps_scaled = scaler_int.fit_transform(internal_temps.reshape(-1, 1))

# 创建滑动窗口特征:n_steps是滑动窗口大小,即输入LSTM的时间步长
def create_dataset(external_data, internal_data, n_steps):
X, y = [], []
for i in range(len(external_data) - n_steps):
X.append(external_data[i:i + n_steps])
y.append(internal_data[i + n_steps])
return np.array(X), np.array(y)

n_steps = 24 # 使用过去24个小时的外温度预测当前容器内温度
X, y = create_dataset(external_temps_scaled, internal_temps_scaled, n_steps)

# 拆分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=False)

# LSTM要求输入形状为 [样本数, 时间步数, 特征数]
print(X_train.shape, y_train.shape) # (样本数, 时间步数, 1)

2. 构建LSTM模型

LSTM模型的结构通常包括:

  • LSTM层:用于捕捉时间序列数据的时序特征。
  • Dense层:用于输出预测结果。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense

# 构建LSTM模型
model = Sequential()

# 添加LSTM层
model.add(LSTM(units=50, return_sequences=False, input_shape=(X_train.shape[1], 1)))

# 输出层:预测容器内温度
model.add(Dense(units=1))

# 编译模型
model.compile(optimizer='adam', loss='mean_squared_error')

# 训练模型
history = model.fit(X_train, y_train, epochs=20, batch_size=32, validation_data=(X_test, y_test))

# 模型概况
model.summary()

3. 模型评估与预测

训练好模型之后,接下来可以使用测试集评估模型,并进行未来温度的预测。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# 在测试集上进行预测
y_pred_scaled = model.predict(X_test)

# 反标准化预测结果
y_pred = scaler_int.inverse_transform(y_pred_scaled)
y_test_original = scaler_int.inverse_transform(y_test)

# 计算RMSE
from sklearn.metrics import mean_squared_error
import math

rmse = math.sqrt(mean_squared_error(y_test_original, y_pred))
print("Root Mean Squared Error (RMSE):", rmse)

# 可视化结果
import matplotlib.pyplot as plt

plt.plot(y_test_original, label='真实值')
plt.plot(y_pred, label='预测值')
plt.legend()
plt.show()

4. 未来预测

如果你想根据未来的外部温度预测容器内温度,你需要准备新的外部温度数据,并按照相同的方式对其进行预处理。你可以使用已经训练好的LSTM模型来进行预测。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

# 假设有新的外温度数据new_external_data
new_external_data = [
{"time": "2023-01-02 00:00", "temp": 8.5},
{"time": "2023-01-02 01:00", "temp": 9.0},
{"time": "2023-01-02 02:00", "temp": 9.2},
...
]

# 转换为DataFrame并进行标准化
new_external_df = pd.DataFrame(new_external_data)
new_external_df['time'] = pd.to_datetime(new_external_df['time'])

new_external_temps = new_external_df['temp'].values
new_external_temps_scaled = scaler_ext.transform(new_external_temps.reshape(-1, 1))

# 创建预测特征(需要过去n_steps的外温度数据)
X_new = []
for i in range(len(new_external_temps_scaled) - n_steps):
X_new.append(new_external_temps_scaled[i:i + n_steps])

X_new = np.array(X_new)

# 使用LSTM模型进行预测
y_new_scaled = model.predict(X_new)

# 反标准化预测结果
y_new = scaler_int.inverse_transform(y_new_scaled)

# 可视化新预测结果
plt.plot(y_new, label='预测容器内温度')
plt.legend()
plt.show()

总结

  1. 数据准备:你需要将时间序列数据转换为LSTM所需的格式,使用滑动窗口技术构造特征,并进行标准化。
  2. LSTM模型构建:使用LSTM层来捕捉时间序列的时滞性,并输出容器内温度的预测值。
  3. 评估与预测:使用测试集评估模型的性能,并进行未来数据的预测。

LSTM适合处理复杂的时间序列数据,能够自动捕捉时间依赖和时滞效应,并且适合用于处理你的容器外温度和内温度之间的关系。如果模型表现良好,你可以根据新的外部温度数据进行容器内温度的预测。

这篇笔记整理自我自己的实践记录,如果做法有出入,或者你踩过别的坑,欢迎到留言板一起聊聊。

站内搜索

没有找到内容!