直接回答:时间序列预测从最简单的开始试:数据平稳、规律明显就用滑动平均或 ARIMA,有明显外部变量影响就用回归,只有数据量足够大、关系复杂时才值得上 LSTM 这类模型。
数据示例:
假设你有两个数组(时间序列数据):
容器外温度数据(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}, ... ]
|
容器内温度数据(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}, ... ]
|
步骤概述
- 数据预处理:将时间序列数据处理成LSTM可以接受的格式。
- 构造LSTM模型:创建和训练LSTM模型。
- 模型评估与预测:评估模型的性能,并用它来预测未来的容器内温度。
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
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))
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 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)
print(X_train.shape, y_train.shape)
|
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
model = Sequential()
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)
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 = [ {"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}, ... ]
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))
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)
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()
|
总结
- 数据准备:你需要将时间序列数据转换为LSTM所需的格式,使用滑动窗口技术构造特征,并进行标准化。
- LSTM模型构建:使用LSTM层来捕捉时间序列的时滞性,并输出容器内温度的预测值。
- 评估与预测:使用测试集评估模型的性能,并进行未来数据的预测。
LSTM适合处理复杂的时间序列数据,能够自动捕捉时间依赖和时滞效应,并且适合用于处理你的容器外温度和内温度之间的关系。如果模型表现良好,你可以根据新的外部温度数据进行容器内温度的预测。
这篇笔记整理自我自己的实践记录,如果做法有出入,或者你踩过别的坑,欢迎到留言板一起聊聊。