实现一个基于Mamba模型的时间序列预测系统。Mamba是一种新型的序列模型架构,结合了状态空间模型(SSM)和注意力机制的优点,在处理长序列数据方面表现出色。该系统主要用于时间序列数据的预测,支持多步预测,并包含完整的数据预处理、特征工程、模型训练和评估流程。
系统由两个主要文件组成:
main1.py
:主程序文件,包含数据预处理、特征工程、模型训练和评估的完整流程mambaModel.py
:模型定义文件,实现了基于Mamba架构的时间序列预测模型系统的数据处理流程如下:
main1.py
)使用隔离森林(Isolation Forest)算法检测异常值,并用局部平均值替换异常值:
iso_forest = IsolationForest(contamination=contamination, random_state=42, n_estimators=100)
outlier_mask = iso_forest.fit_predict(data) == -1
使用滑动窗口平均对数据进行平滑处理:
window_size = 3
data_smooth = np.zeros_like(data_clean)
for i in range(data_clean.shape[0]):
start = max(0, i - window_size // 2)
end = min(data_clean.shape[0], i + window_size // 2 + 1)
data_smooth[i] = np.mean(data_clean[start:end], axis=0)
使用标准化(StandardScaler)对特征进行归一化:
scaler = StandardScaler()
data_transformed = scaler.fit_transform(data_smooth)
添加滞后特征和滚动统计特征:
# 添加滞后特征
lag_steps = [1, 3, 5]
# 添加滚动统计特征
window_sizes = [10]
使用PCA降维减少特征数量:
n_components = min(100, data_with_lags.shape[1])
pca = PCA(n_components=n_components)
data_pca = pca.fit_transform(data_with_lags)
main1.py
)添加时间相关的特征,如日周期、周周期等:
def add_time_features(X):
batch_size, seq_len, features = X.shape
# 创建时间特征
time_features = np.zeros((batch_size, seq_len, 8))
for i in range(batch_size):
for j in range(seq_len):
# 时间特征计算...
main1.py
)创建带有数据增强的时间序列数据集:
def create_dataset_with_augmentation(dataset, look_back=10, forecast_horizon=1, augment=True):
X, y = [], []
for i in range(len(dataset) - look_back - forecast_horizon + 1):
# 创建样本...
# 数据增强...
mambaModel.py
)位置编码(PositionalEncoding):
为序列数据添加位置信息
多头注意力(MultiHeadAttention):
实现自注意力机制,捕捉序列内部的依赖关系
前馈网络(FeedForward):
使用GLU激活函数的前馈网络
MambaBlock:
Mamba模型的基本构建块,包含Mamba层、多头自注意力和前馈网络
class MambaBlock(nn.Module):
def __init__(self, d_model, d_state=16, d_conv=4, expand=2, num_heads=8, d_ff=2048, dropout=0.1):
# 初始化Mamba块...
MambaSequenceModel:
由多个MambaBlock组成的序列模型
class MambaSequenceModel(nn.Module):
def __init__(self, d_model, seq_len, output_dim, d_state=16, d_conv=4, expand=2, num_layers=4, num_heads=8, d_ff=2048, dropout=0.1):
# 初始化序列模型...
HuberLoss:
结合了MSE和MAE的优点,对异常值更加鲁棒
FocalLoss:
关注难以预测的样本,提高模型对困难样本的学习能力
封装了模型的构建、训练、评估和预测等功能:
class MambaModel:
def __init__(self, input_shape, predict_units, num_layers=4, d_state=16, d_conv=4, expand=2,
dropout=0.1, weight_decay=1e-4, learning_rate=1e-3, use_focal_loss=False,
gamma=2.0, delta=0.1):
# 初始化模型...
main1.py
)根据预测窗口大小配置模型参数:
trainModel = mambaModel.MambaModel(
input_shape=[look_back, input_dim],
predict_units=output_dim,
num_layers=6,
d_state=128,
d_conv=4,
expand=2,
num_heads=8,
d_ff=512,
dropout=0.2,
weight_decay=1e-5,
learning_rate=0.0005,
use_focal_loss=True,
gamma=2.0,
delta=0.1
)
组合多种损失函数以提高预测精度:
class CombinedLoss:
def __init__(self):
super(CombinedLoss, self).__init__()
self.huber = torch.nn.SmoothL1Loss(beta=0.1)
self.mse = torch.nn.MSELoss()
self.mae = torch.nn.L1Loss()
def forward(self, pred, target):
# 计算组合损失...
使用训练集训练模型,并在验证集上评估:
history = trainModel.fit(
trainX, trainY,
validation_data=(valX, valY),
epochs=120,
batch_size=16,
verbose=1,
patience=25
)
使用多种指标评估模型性能:
# 计算该时间步的各种误差指标
mae = calculate_mae(step_true, step_pred)
smape_val = smape(step_true, step_pred)
r2 = calculate_r2(step_true, step_pred)
绘制训练过程和预测结果的图表:
plt.figure(figsize=(15, 5))
# 绘制训练损失
# 绘制学习率变化
# 绘制预测结果
contamination
:隔离森林异常值检测的污染率window_size
:平滑处理的窗口大小lag_steps
:滞后特征的步长列表window_sizes
:滚动统计特征的窗口大小列表n_components
:PCA降维的主成分数量look_back
:回顾窗口大小,即输入序列长度forecast_horizon
:预测窗口大小,即输出序列长度num_layers
:Mamba模型的层数d_state
:状态空间模型的状态维度d_conv
:卷积核宽度expand
:扩展因子dropout
:Dropout比率weight_decay
:权重衰减系数learning_rate
:学习率将时间序列数据保存为CSV格式,放在../data/
目录下。
直接运行main1.py
文件:
python main1.py
系统会自动执行以下步骤:
../results/
目录训练完成后,可以在../results/
目录下查看各个预测窗口的结果图表。
数据预处理优化:
模型架构优化:
训练策略优化:
集成方法:
Mamba模型作为一种新型的序列模型架构,在处理长序列数据方面表现出色,特别适合时间序列预测任务。通过调整模型参数和优化训练策略,可以进一步提高预测精度和泛化能力。