LSTM时间序列预测:从模型训练到可解释性实战
时间序列预测最让人头疼的不是准确率,而是“黑盒”属性。当你用LSTM跑出一个预测数值时,很难说清楚模型到底是依赖昨天的气温,还是在看过去一周的整体趋势。为了把这个黑盒拆开,我用天气数据实测了三种可解释性方法。
LSTM要求输入必须是三维张量
这里采用了双层LSTM堆叠,并加入了Dropout防止过拟合。
模型训练完后,我尝试用“排列重要性(Permutation Importance)”来验证模型对不同时间步的依赖程度。逻辑很简单:随机打乱其中一天的温度数据,看预测误差增加了多少。如果误差暴增,说明模型极度依赖这一天。
下一篇
从Q-learning切换到REINFORCE,最直观的冲击就是 →
一、 数据预处理与窗口化
LSTM要求输入必须是三维张量
(samples, timesteps, features)。要把单一的气温列转换成模型能认的格式,得用滑动窗口把数据切成7天一组的序列。import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
# 1. 加载数据
df = pd.read_csv("weather_data.csv")
data = df['Temperature'].values.reshape(-1, 1)
# 2. 归一化(这步极其关键,否则容易出现梯度爆炸)
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_data = scaler.fit_transform(data)
# 3. 构建序列:用前7天预测第8天
X, y = [], []
for i in range(7, len(scaled_data)):
X.append(scaled_data[i-7:i])
y.append(scaled_data[i])
X, y = np.array(X), np.array(y)二、 模型构建
这里采用了双层LSTM堆叠,并加入了Dropout防止过拟合。
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout, Input
from tensorflow.keras.callbacks import EarlyStopping
model = Sequential([
Input(shape=(7, 1)),
LSTM(units=100, activation='relu', return_sequences=True),
Dropout(0.2),
LSTM(units=100, activation='relu'),
Dropout(0.2),
Dense(units=1)
])
model.compile(optimizer='adam', loss='mse')
# 配置早停机制,避免死磕epoch数
early_stopping = EarlyStopping(
monitor='val_loss',
patience=10,
restore_best_weights=True
)
history = model.fit(
X, y,
epochs=50,
batch_size=32,
validation_split=0.2,
callbacks=[early_stopping]
)注意一个细节:第一层LSTM必须设置 return_sequences=True 才能接第二层,否则传给下一层的是单个向量而不是序列。三、 拆解模型:它到底在看什么?
模型训练完后,我尝试用“排列重要性(Permutation Importance)”来验证模型对不同时间步的依赖程度。逻辑很简单:随机打乱其中一天的温度数据,看预测误差增加了多少。如果误差暴增,说明模型极度依赖这一天。
from sklearn.metrics import mean_squared_error
base_preds = model.predict(X, verbose=0)
base_error = mean_squared_error(y, base_preds)
feature_importance = []
for i in range(7):
X_permuted = X.copy()
np.random.shuffle(X_permuted[:, i, 0]) # 随机打乱特定滞后天数的数据
permuted_preds = model.predict(X_permuted, verbose=0)
permuted_error = mean_squared_error(y, permuted_preds)
feature_importance.append(permuted_error - base_error)通过这种方式,可以量化出模型对“昨天”和“一周前”权重的真实差异。