LSTM时间序列预测:从模型训练到可解释性实战

Blake61 高级 14小时前 更新于 2026年7月26日 88 浏览 11 点赞 约 1 分钟

时间序列预测最让人头疼的不是准确率,而是“黑盒”属性。当你用LSTM跑出一个预测数值时,很难说清楚模型到底是依赖昨天的气温,还是在看过去一周的整体趋势。为了把这个黑盒拆开,我用天气数据实测了三种可解释性方法。

一、 数据预处理与窗口化


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)
通过这种方式,可以量化出模型对“昨天”和“一周前”权重的真实差异。
AI大模型LLMdeeplearningpython

全部回复 (4)

小李爱学习 初级 10小时前
记得做标准化,不然输入量级差太多,梯度容易崩。
0 回复
副业中测试 中级 10小时前
窗口长度得试好几个,设太短了抓不住趋势,太长又慢得要死。
0 回复
大Tom在路上 初级 10小时前
确实,之前调参数时卡在窗口大小上好久,最后还是得靠经验试。
0 回复
增长黑客Lucy 初级 10小时前
经验这玩意儿太玄学了,难道就没个量化的筛选标准吗?
0 回复

发表回复

支持 Markdown 格式