### 使用Transformer模型处理ETT时间序列数据集
#### 数据预处理
对于 ETT 时间序列数据集,在应用 Transformer 模型之前,需先进行适当的数据预处理。这通常涉及标准化输入特征以及创建滑动窗口来构建训练样本。由于 ETT 数据集具有多个变量的时间序列特性,可以借鉴 iTransformer 的方法将每个时间序列嵌入为变量令牌并使用前馈网络进行编码以捕捉多元相关性[^1]。
```python
import pandas as pd
from sklearn.preprocessing import StandardScaler
# 加载 ETT 数据集
data = pd.read_csv('ETTh1.csv')
# 对数值列进行标准化
scaler = StandardScaler()
scaled_data = scaler.fit_transform(data[['OT', 'HUFL', 'HULL', ...]])
# 创建滑动窗口函数用于生成 X 和 y
def create_sequences(data, seq_length):
xs, ys = [], []
for i in range(len(data) - seq_length):
x = data[i:i+seq_length]
y = data[i+seq_length][0] # 假设预测目标是第一个变量 (例如 OT)
xs.append(x), ys.append(y)
return np.array(xs), np.array(ys)
X_train, y_train = create_sequences(scaled_data[:train_size], window_size=96)
```
#### 构建Transformer模型架构
接下来定义一个基于 PyTorch 或 TensorFlow 实现的 Transformer 编码器结构。此部分会利用自注意力机制来自适应地加权不同位置的信息,并通过多层感知机进一步提取特征模式。
```python
import torch.nn as nn
import torch
class TimeSeriesTransformer(nn.Module):
def __init__(self, input_dim, model_dim, num_heads, num_layers, output_dim, dropout=0.1):
super().__init__()
self.embedding_layer = nn.Linear(input_dim, model_dim)
encoder_layer = nn.TransformerEncoderLayer(d_model=model_dim, nhead=num_heads, dim_feedforward=model_dim*4, dropout=dropout)
self.transformer_encoder = nn.TransformerEncoder(encoder_layer, num_layers=num_layers)
self.fc_out = nn.Linear(model_dim, output_dim)
def forward(self, src):
embedded_src = self.embedding_layer(src).permute(1, 0, 2) # 调整维度顺序适合Transformer
transformer_output = self.transformer_encoder(embedded_src)
prediction = self.fc_out(transformer_output[-1]) # 只取最后一个时间步的结果作为预测值
return prediction
model = TimeSeriesTransformer(
input_dim=X_train.shape[-1],
model_dim=512,
num_heads=8,
num_layers=3,
output_dim=1
)
```
#### 训练过程与评估指标设定
完成上述准备工作之后就可以配置优化算法、损失函数来进行模型参数的学习;同时为了衡量模型表现还需要选定合适的评价标准如均方误差(MSE),平均绝对百分比误差(MAPE)等。
```python
criterion = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
for epoch in range(num_epochs):
optimizer.zero_grad()
outputs = model(torch.tensor(X_train, dtype=torch.float))
loss = criterion(outputs.squeeze(-1), torch.tensor(y_train, dtype=torch.float))
loss.backward()
optimizer.step()
print(f'Final Loss: {loss.item()}')
```
在测试阶段,则应采用相同方式准备验证/测试集上的输入向量并通过已训练好的模型得到对未来时刻观测值的估计结果。最后对比实际发生情况计算各项统计学度量得分以便全面了解所建立系统的准确性及可靠性。