外贸企业网站红色风格,成都公司网站开发,网站问卷调查怎么做,网站照片如何处理哈喽#xff0c;我不是小upper#xff0c;今天和大家聊聊基于Transformer与随机森林的多变量时间序列预测。
不懂Transformer的小伙伴可以看我上篇文章:一文带你彻底搞懂#xff01;Transformer #xff01;#xff01;https://blog.csdn.net/qq_70350287/article/detail…哈喽我不是小upper今天和大家聊聊基于Transformer与随机森林的多变量时间序列预测。
不懂Transformer的小伙伴可以看我上篇文章:一文带你彻底搞懂Transformer https://blog.csdn.net/qq_70350287/article/details/147404686?spm1001.2014.3001.5501
在多变量时间序列预测领域我们常常需要依据历史数据来预估多个变量在未来的取值。打个比方在分析城市交通流量时就涉及到多个变量像不同路段的车流量、车速等我们要预测这些变量未来的变化情况。
以往常用的时间序列预测方法比如 ARIMA 和 SARIMA 存在一定的局限性。它们一般假定数据之间呈现线性关系可在实际的复杂系统中数据间的关系往往并非如此简单。现实中的数据不仅存在非线性关系还具有长期依赖特征就好比今天的交通流量情况可能会受到一周前特殊事件的影响而这些传统方法很难有效捕捉到这些复杂的关系所以在面对复杂的多变量时间序列预测任务时效果可能不太理想 。 在当下的技术发展进程中基于深度学习的 Transformer 和基于机器学习的随机森林Random Forest简称 RF在众多任务领域得到了极为广泛的应用。这两种技术各有所长若将它们有机结合便能够充分发挥各自的优势实现更出色的效果。 Transformer 模型的核心亮点在于其独特的自注意力机制。这一机制赋予了 Transformer 强大的能力使其能够精准且高效地捕捉时间序列中的长期依赖关系。在处理如自然语言文本、金融时间序列数据这类包含复杂时间依赖信息的任务时Transformer 可以轻松关注到序列中不同位置之间的关联从而理解整体的语义或趋势。例如在机器翻译中它能理解句子中相隔较远词汇之间的语法和语义联系提升翻译的准确性。 而随机森林RF模型则是通过构建多棵决策树的方式来进行工作。在面对高维特征空间时它能够进行有效的回归操作。并且RF 模型具有很强的鲁棒性这使得它在处理包含噪声的数据时表现出色。即使数据中存在一些干扰信息它也能凭借自身的结构和算法尽量减少噪声对结果的影响给出相对可靠的预测。比如在预测房屋价格时面对包含测量误差等噪声的数据随机森林模型依然能较好地捕捉到房价与其他因素之间的关系。 接下来让我们一起深入了解这两种技术结合的细节内容。 多变量时间序列预测的问题建模
滑动窗口与样本构造在多变量时间序列预测中我们从给定的观测序列出发通过设定窗口长度来构建样本。这一操作的目标是为后续的模型训练提供合适的数据形式使模型能够学习到时间序列中的规律和特征。归一化与去趋势为了让数据更适合模型训练我们对每个变量进行 Z-score 标准化处理。这种标准化方法能够将数据转化为均值为 0、标准差为 1 的标准形式有助于提升模型的训练效果和稳定性。变量相关性分析计算皮尔逊相关系数矩阵是分析变量之间相关性的重要手段。通过这个矩阵我们可以判断哪些变量之间关系紧密进而选择对预测结果有重要影响的输入变量去除那些相关性较低的变量提高模型的效率和预测准确性。 模型融合策略
加权平均Weighted Averaging这是一种直观且简单的模型融合方法它的优点是所需的参数较少。在融合多个模型的预测结果时为每个模型分配一个权重然后根据这些权重对各模型的预测值进行加权求和得到最终的预测结果。权重的选择可以通过交叉验证等方式进行调优以达到最佳的融合效果。堆叠泛化Stacking该方法分为两层进行模型融合。在第一层使用 Transformer、随机森林RF等不同模型分别对数据进行处理并输出预测结果。然后在第二层使用元学习器例如线性回归模型或小型多层感知机MLP。具体操作是先通过交叉验证的方式获得第一层各个模型对验证集的预测结果再利用这些结果来训练元学习器使元学习器能够学习到不同模型预测结果之间的关系从而更好地融合这些结果提升整体的预测性能。误差协方差分析误差协方差分析用于评估不同模型之间的互补性。如果两个模型的误差相关性较低说明它们在预测过程中犯错误的情况有所不同这种情况下将它们融合往往能获得更好的预测效果。因为不同模型可以在不同方面发挥优势相互补充减少整体的预测误差。 小结
模块关键组件细节要点序列预处理滑动窗口、归一化、相关性分析利用滑动窗口构造样本通过 Z-score 进行标准化借助皮尔逊相关矩阵筛选特征Transformer 编码器位置编码PosEnc、多头注意力、前馈神经网络FFN、层归一化LayerNorm采用正余弦位置编码利用防未来信息掩码避免信息泄露结合残差连接和归一化多头注意力并行捕捉多尺度依赖关系逐位置前馈网络增强模型的非线性表达能力随机森林回归自助采样Bootstrap、分类与回归树CART分裂、子特征随机选择树间差异源于有放回采样和特征随机子集回归树依据最小化节点内均方误差MSE进行分裂通过平均化减少预测方差融合策略加权平均、堆叠泛化、误差协方差分析加权平均的系数可通过交叉验证调优堆叠泛化借助元学习器捕获二级特征误差协方差分析揭示模型间的互补性评估指标均方误差MSE、均方根误差RMSE、平均绝对误差MAE、平均绝对百分比误差MAPE、多变量加权评估MSE 对大误差较为敏感MAE 更稳健MAPE 以百分比形式呈现便于解读多变量加权评估可综合考虑不同变量的重要性进行全面评估 在这里我们将基于 Transformer 与随机森林的集成方法开展多变量时间序列的预测任务。为了更便捷地展示整个过程我们使用虚拟数据集来完成数据生成、模型训练、预测、评估等环节同时还会生成多种可视化图形以此深入分析模型的表现最后给出算法的优化要点和调参流程。 1. 数据集 预处理
为构建一个多变量时间序列数据集我们生成包含三个变量的虚拟时间序列数据。其中一个变量是呈周期性变化的正弦波一个是余弦波还有一个是添加了噪声的随机信号。具体代码如下
# 生成虚拟多变量时间序列数据3个变量长度为T
import numpy as np
T 1200 # 时间步数
t np.arange(T)
x1 np.sin(0.02 * t) # 正弦波
x2 np.cos(0.02 * t) # 余弦波
x3 0.1 * np.random.randn(T) # 高斯噪声# 数据合并形状为(T, 3)
data np.stack([x1, x2, x3], axis1)
接下来对生成的数据进行标准化处理Z-score使数据具有统一的尺度便于后续模型训练。
from sklearn.preprocessing import StandardScaler
# 标准化处理Z-score
scaler StandardScaler()
data_norm scaler.fit_transform(data) # 标准化后的数据 数据集拆分与窗口化
我们把时间序列数据拆分成滑动窗口样本进而生成训练集和测试集。在这个过程中我们构建特征数据X和目标数据Y
window_size 30 # 假设窗口大小为30
horizon 1 # 预测步长为1
X, Y [], []
for i in range(T - window_size - horizon 1):X.append(data_norm[i:i window_size]) # 选择窗口内的数据Y.append(data_norm[i window_size:i window_size horizon]) # 预测窗口后的数据
X np.array(X) # shape: (samples, window_size, features)
Y np.array(Y).squeeze(axis1) # shape: (samples, features)# 划分训练集与测试集
train_ratio 0.8
n_train int(len(X) * train_ratio)
X_train, X_test X[:n_train], X[n_train:]
Y_train, Y_test Y[:n_train], Y[n_train:]# 转换为PyTorch Tensor
import torch
from torch.utils.data import TensorDataset, DataLoader
X_train_t torch.tensor(X_train, dtypetorch.float32)
Y_train_t torch.tensor(Y_train, dtypetorch.float32)
X_test_t torch.tensor(X_test, dtypetorch.float32)
Y_test_t torch.tensor(Y_test, dtypetorch.float32)train_dataset TensorDataset(X_train_t, Y_train_t)
train_loader DataLoader(train_dataset, batch_size32, shuffleTrue)
可视化数据
我们先绘制数据集的原始图形以此清晰展示三个变量的时间序列变化情况。
import matplotlib.pyplot as plt
# 可视化原始数据
plt.figure(figsize(12, 6))
plt.plot(t, data_norm[:, 0], labelVar1, colormagenta)
plt.plot(t, data_norm[:, 1], labelVar2, colorcyan)
plt.plot(t, data_norm[:, 2], labelVar3, colorlime)
plt.title(Raw Multivariate Time Series)
plt.xlabel(Time)
plt.ylabel(Normalized Value)
plt.legend()
plt.show() 可视化展示的横坐标是时间Time从 0 到 1200代表时间步数纵坐标是标准化后的值Normalized Value 范围从 - 3 到 2 。图中有三条线紫色线代表 Var1是一条正弦波曲线呈现周期性波动蓝色线代表 Var2是余弦波曲线也呈周期性波动但和正弦波有相位差绿色线代表 Var3是加了高斯噪声的随机信号波动非常剧烈且杂乱无章不像前两条线那样有明显规律 。 2. Transformer 模型实现
Transformer 回归模型
Transformer 模型借助自注意力机制能有效捕捉序列中的长期依赖关系。我们使用 PyTorch 搭建一个简洁的 Transformer Encoder 架构。代码如下
# Transformer回归模型
import torch
import torch.nn as nn
import mathclass TransformerRegressor(nn.Module):def __init__(self, input_dim, d_model, nhead, num_layers, dim_feedforward):super().__init__()# 输入映射层self.input_linear nn.Linear(input_dim, d_model)# Transformer编码器层encoder_layer nn.TransformerEncoderLayer(d_modeld_model, nheadnhead, dim_feedforwarddim_feedforward)self.transformer nn.TransformerEncoder(encoder_layer, num_layersnum_layers)# 输出映射层self.output_linear nn.Linear(d_model, input_dim)def forward(self, src):x self.input_linear(src) * math.sqrt(self.input_linear.out_features) # 线性变换x x.permute(1, 0, 2) # 转置为 (seq_len, batch, d_model)x self.transformer(x) # Transformer编码x x.mean(dim0) # 平均池化 (batch, d_model)return self.output_linear(x) # 预测输出 (batch, input_dim)
在这个模型中input_linear负责将输入数据映射到指定维度transformer进行核心的编码操作output_linear则输出预测结果。 模型训练
接下来定义训练所需参数并开始训练模型
# 定义训练参数
input_dim 3
model TransformerRegressor(input_dim, d_model64, nhead4, num_layers2, dim_feedforward128)
optimizer torch.optim.Adam(model.parameters(), lr0.001)
criterion nn.MSELoss()# 训练模型
num_epochs 50
loss_list []model.train()
for epoch in range(1, num_epochs1):epoch_loss 0.0for xb, yb in train_loader:optimizer.zero_grad()pred model(xb)loss criterion(pred, yb)loss.backward()optimizer.step()epoch_loss loss.item() * xb.size(0)epoch_loss / len(train_loader.dataset)loss_list.append(epoch_loss)if epoch % 10 0:print(fEpoch {epoch}/{num_epochs}, Loss: {epoch_loss:.4f}) 这里我们设置了模型的具体参数选用 Adam 优化器和均方误差损失函数MSELoss 。在训练循环中每个 epoch 都会计算平均损失并记录下来方便后续观察模型训练情况。 3. 随机森林模型实现
随机森林回归器
对于随机森林模型我们先对数据进行预处理然后训练和预测
# 随机森林训练与预测
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, mean_absolute_error
import numpy as npX_rf_train X_train.reshape(n_train, -1)
X_rf_test X_test.reshape(len(X_test), -1)rf RandomForestRegressor(n_estimators200, max_depth12, random_state42)
rf.fit(X_rf_train, Y_train)
rf_pred rf.predict(X_rf_test)
这里将训练数据和测试数据调整为适合随机森林模型输入的形状然后使用指定参数训练随机森林回归器并得到测试集上的预测结果。 评估模型性能
通过计算均方误差MSE和平均绝对误差MAE来衡量 Transformer 模型和随机森林模型在测试集上的表现
# model是已经训练好的TransformerRegressor模型X_test_t是测试集数据
model.eval() # 将模型设置为评估模式
with torch.no_grad(): # 不计算梯度节省内存并加快计算tf_pred_test model(X_test_t).cpu().numpy() # 对测试集进行预测并转换为numpy数组mse_tf mean_squared_error(Y_test, tf_pred_test)
mae_tf mean_absolute_error(Y_test, tf_pred_test)
mse_rf mean_squared_error(Y_test, rf_pred)
mae_rf mean_absolute_error(Y_test, rf_pred)print(fTransformer - MSE: {mse_tf:.4f}, MAE: {mae_tf:.4f})
print(fRandom Forest - MSE: {mse_rf:.4f}, MAE: {mae_rf:.4f})
通过调整加权系数alpha综合两个模型的优势得到集成模型的预测结果并再次计算评估指标判断融合效果。 从输出结果看Transformer 模型的均方误差MSE为 0.3988 平均绝对误差MAE为 0.3221 随机森林模型的 MSE 是 0.3889 MAE 是 0.3071 。这表明在这个多变量时间序列预测任务中随机森林模型在衡量预测值与真实值偏离程度的 MSE 和 MAE 指标上表现略优于 Transformer 模型 即随机森林模型的预测值相对更接近真实值 。 5. 可视化分析
原始数据可视化
为了更好地理解数据的变化趋势我们再次展示标准化后的多变量时间序列
import matplotlib.pyplot as pltplt.figure(figsize(12, 6))
plt.plot(t, data_norm[:, 0], labelVar1, colormagenta)
plt.plot(t, data_norm[:, 1], labelVar2, colorcyan)
plt.plot(t, data_norm[:, 2], labelVar3, colorlime)
plt.title(Raw Multivariate Time Series)
plt.xlabel(Time)
plt.ylabel(Normalized Value)
plt.legend()
plt.show() 这张图展示了标准化后的多变量时间序列横坐标为时间从 0 到 1200纵坐标是标准化值。紫色线代表 Var1是正弦波呈现周期性起伏蓝色线是 Var2为余弦波同样周期性波动和正弦波有相位差异绿色线的 Var3 是加了高斯噪声的随机信号波动剧烈且无明显规律。通过该图能直观看到各变量的变化特征Var1 和 Var2 的周期性可帮助预测而 Var3 的随机性增加了预测难度 。 Transformer 训练损失曲线
为了观察 Transformer 模型的收敛情况我们绘制其训练损失曲线。具体代码如下
import matplotlib.pyplot as pltplt.figure(figsize(8, 4))
plt.plot(range(1, num_epochs1), loss_list, colororange, labelTrain Loss)
plt.title(Transformer Training Loss)
plt.xlabel(Epoch)
plt.ylabel(MSE Loss)
plt.legend()
plt.show()
运行后得到一张直方图横坐标是预测误差纵坐标是误差出现的频率。通过观察直方图的形状和分布我们可以了解融合模型预测误差的集中程度和离散情况。比如如果直方图呈现近似正态分布说明误差分布相对稳定若存在长尾或异常值可能表示模型在某些情况下预测效果不佳需要进一步分析和改进。 图中输出的是 Transformer 模型的训练损失曲线。横坐标是训练轮次Epoch从 0 到 50 纵坐标是均方误差损失MSE Loss 。可以看到在训练初期损失值从接近 0.5 迅速下降随后在不同轮次间有小幅度波动。整体趋势是逐渐降低并趋于平稳说明 Transformer 模型在训练过程中不断学习尽管过程中有起伏但最终损失稳定在一定范围内模型在朝着收敛方向发展。 真实与预测值对比融合模型
我们来展示融合模型Transformer 和随机森林融合的预测结果与真实值的对比情况。代码如下
plt.figure(figsize(12, 6))
plt.plot(np.arange(n_trainwindow_size, T-horizon1), Y_test[:, 0], colorblue, labelTrue Var1)
plt.plot(np.arange(n_trainwindow_size, T-horizon1), ensemble_pred[:, 0], colorred, linestyle--, labelPred Var1)
plt.title(True vs Predicted (Ensemble Model))
plt.xlabel(Time)
plt.ylabel(Value)
plt.legend()
plt.show()
执行后得到一张折线图横坐标是时间纵坐标是变量的值。蓝色实线代表真实值True Var1红色虚线代表融合模型的预测值Pred Var1 。通过对比这两条线我们可以直观地看出融合模型的预测效果。如果两条线贴合度高说明模型预测准确若偏差较大则表明模型在预测该变量时存在一定误差。 随机森林特征重要性
为了了解随机森林模型中各个特征的贡献情况也就是哪些历史数据对预测最重要我们绘制特征重要性图代码如下
importances rf.feature_importances_
indices np.argsort(importances)[-10:]
plt.figure(figsize(8, 6))
plt.barh(range(len(indices)), importances[indices], colorteal)
plt.yticks(range(len(indices)), [fFeature {i} for i in indices])
plt.title(Random Forest Feature Importances)
plt.xlabel(Importance)
plt.ylabel(Feature)
plt.show()
这会生成下图的横向条形图横坐标是特征的重要性程度纵坐标是特征编号。条形的长度代表对应特征的重要性越长说明该特征对随机森林模型的预测越关键。通过这张图我们可以清晰地看到不同特征在模型中的重要程度有助于进一步优化模型和理解数据。
可以看出上图展示了不同特征对模型预测的贡献。横坐标是重要性数值纵坐标是特征编号。可见Feature 0 和 Feature 88 重要性较高对预测影响大其余特征重要性相对较低。 融合模型误差分布
我们通过绘制误差的直方图来分析融合模型预测误差的分布情况代码如下
errors ensemble_pred.flatten() - Y_test.flatten()
plt.figure(figsize(8, 6))
plt.hist(errors, bins30, colorviolet, edgecolorblack)
plt.title(Error Distribution (Ensemble))
plt.xlabel(Prediction Error)
plt.ylabel(Frequency)
plt.show()
本代码运行后输出一张直方图横坐标是预测误差纵坐标是误差出现的频率。通过观察直方图的形状和分布我们可以了解融合模型预测误差的集中程度和离散情况。比如如果直方图呈现近似正态分布说明误差分布相对稳定若存在长尾或异常值可能表示模型在某些情况下预测效果不佳需要进一步分析和改进。 横坐标为预测误差纵坐标是误差出现的频率。图中显示大部分误差集中在 0 附近说明融合模型的预测值与真实值较为接近模型预测效果较好 仅有少量误差分布在远离 0 的两侧表明模型在少数情况下会出现较大偏差 。 6. 算法优化点与调参流程
融合策略优化
加权系数调优可运用网格搜索或交叉验证等方法对加权系数alpha进行精细调节以找出能使融合模型性能最优的取值。堆叠Stacking在融合模型中尝试采用更复杂的回归器如 XGBoost、Lasso 等取代简单的线性回归或小型 MLP从而更精准地学习不同模型间的最优组合方式。
调参流程
基线评估率先针对单独的 Transformer 模型和随机森林RF模型进行调参确定它们各自的基础性能表现为后续融合模型的优化提供参照。组合调参在明确基线模型性能的前提下对加权系数alpha进行调节优化加权平均融合效果或者引入堆叠模型进一步挖掘提升模型整体性能的潜力。交叉验证在模型训练阶段采用 k 折交叉验证法全面评估模型的泛化能力确保模型在不同数据子集上都能有稳定的表现。模型监控与调整密切关注训练过程中损失值的变化情况依据变化趋势及时、适当地调整模型结构或超参数使模型始终保持良好的训练状态。 本案例完整呈现了基于 Transformer 与随机森林的多变量时间序列预测过程涵盖数据生成、模型训练、评估以及优化等各个环节。通过数据可视化和模型分析我们能够深入理解模型的实际表现并据此对模型进行针对性的调整与优化。