Informer 是一种用于时间序列预测的深度学习模型,特别适用于长序列的时间序列数据。它是基于 Transformer 结构的一种改进,主要解决了传统 Transformer 在处理长序列时计算复杂度高的问题。
长尾预测能力:
Informer 的这些创新使得它在处理长序列时间序列数据时具有更高的效率和准确性。它适用于各种实际应用场景,如风电、光伏发电预测、股票市场分析、交通流量预测等。
图1 informer结构图
TCN(Temporal Convolutional Network,时序卷积网络)是一种用于处理时间序列数据的深度学习模型。它主要基于卷积神经网络(CNN),但在结构上进行了调整,以适应时间序列的特性。TCN 的设计目标是替代循环神经网络(RNN)在时间序列建模中的作用,特别是长依赖关系的建模。
图2 TCN结构图
SSA麻雀优化算法(Sparrow Search Algorithm,简称 SSA)是一种新兴的群体智能优化算法,它模仿麻雀群体觅食行为来解决优化问题。SSA 在寻找全局最优解时展现出良好的性能和稳定性,适用于各种复杂的优化问题。SSA 麻雀优化算法的核心思想是通过模拟麻雀的觅食策略、反捕猎行为等特性,达到全局搜索和局部搜索的平衡。
种群初始化:
麻雀的角色划分:
发现者更新策略
追随者更新策略
反捕猎机制:
适应度评估:
通过将 TCN、Informer 和 SSA 结合,可以充分发挥每种方法的优势,实现全局和局部的优化和预测,从而提高时间序列预测的精度和稳定性。
class Model(nn.Module):
def __init__(self, configs):
super(Model, self).__init__()
self.task_name = configs.task_name
self.pred_len = configs.pred_len
self.label_len = configs.label_len
self.lstm =TCN(input_size=configs.enc_in, hidden_size=configs.d_model, num_layers=3,
batch_size=configs.batch_size)
#self.icb = ICB(configs.num_features, configs.d_model)
#self.abs = Adaptive_Spectral_Block(configs.num_features)
# Embedding
self.enc_embedding = DataEmbedding(configs.enc_in, configs.d_model, configs.embed, configs.freq,
configs.dropout)
self.dec_embedding = DataEmbedding(configs.dec_in, configs.d_model, configs.embed, configs.freq,
configs.dropout)
# Encoder
self.encoder = Encoder(
[
EncoderLayer(
AttentionLayer(
ProbAttention(False, configs.factor, attention_dropout=configs.dropout,
output_attention=configs.output_attention),
configs.d_model, configs.n_heads),
configs.d_model,
configs.d_ff,
dropout=configs.dropout,
activation=configs.activation
) for l in range(configs.e_layers)
],
[
ConvLayer(configs.d_model) for l in range(configs.e_layers - 1)
] if configs.distil and ('forecast' in configs.task_name) else None,
norm_layer=torch.nn.LayerNorm(configs.d_model)
)
# Decoder
self.decoder = Decoder(
[
DecoderLayer(
AttentionLayer(
ProbAttention(True, configs.factor, attention_dropout=configs.dropout, output_attention=False),
configs.d_model, configs.n_heads),
AttentionLayer(
ProbAttention(False, configs.factor, attention_dropout=configs.dropout, output_attention=False),
configs.d_model, configs.n_heads),
configs.d_model,
configs.d_ff,
dropout=configs.dropout,
activation=configs.activation,
) for l in range(configs.d_layers)
],
norm_layer=torch.nn.LayerNorm(configs.d_model),
projection=nn.Linear(configs.d_model, configs.c_out, bias=True)
)
if self.task_name in ['imputation', 'anomaly_detection']:
self.projection = nn.Linear(configs.d_model, configs.c_out, bias=True)
if self.task_name == 'classification':
self.act = F.gelu
self.dropout = nn.Dropout(configs.dropout)
self.projection = nn.Linear(configs.d_model * configs.seq_len, configs.num_class)
# # 数据归一化
scaler = MinMaxScaler()
data_inverse = scaler.fit_transform(np.array(data))
data_length = len(data_inverse)
train_set = 0.8
data_train = data_inverse[:int(train_set * data_length), :] # 读取目标数据,第一列记为0:1,后面以此类推, 训练集和验证集,如果是多维输入的话最后一列为目标列数据
data_train_mark = data_stamp[:int(train_set * data_length), :]
data_test = data_inverse[int(train_set * data_length):, :] # 这里把训练集和测试集分开了,也可以换成两个csv文件
data_test_mark = data_stamp[int(train_set * data_length):, :]
n_feature = data_dim
window = 10 # 模型输入序列长度
length_size = 1 # 预测结果的序列长度
batch_size = 50
train_loader, x_train, y_train, x_train_mark, y_train_mark = tslib_data_loader(window, length_size, batch_size, data_train, data_train_mark)
test_loader, x_test, y_test, x_test_mark, y_test_mark = tslib_data_loader(window, length_size, batch_size, data_test, data_test_mark)
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
num_epochs = 50 # 训练迭代次数
learning_rate = 0.001 # 学习率
scheduler_patience = int(0.25 * num_epochs) # 转换为整数 学习率调整的patience
early_patience = 0.2 # 训练迭代的早停比例 即patience=0.25*num_epochs
class Config:
def __init__(self):
# basic
self.seq_len = window # input sequence length
self.label_len = int(window / 2) # start token length
self.pred_len = length_size # 预测序列长度
self.freq = 't' # 时间的频率,
# 模型训练
self.batch_size = batch_size # 批次大小
self.num_epochs = num_epochs # 训练的轮数
self.learning_rate = learning_rate # 学习率
self.stop_ratio = early_patience # 早停的比例
# 模型 define
self.dec_in = data_dim # 解码器输入特征数量, 输入几个变量就是几
self.enc_in = data_dim # 编码器输入特征数量
self.c_out = 1 # 输出维度##########这个很重要
# 模型超参数
self.d_model = 64 # 模型维度
self.n_heads = 8 # 多头注意力头数
self.dropout = 0.1 # 丢弃率
self.e_layers = 2 # 编码器块的数量
self.d_layers = 1 # 解码器块的数量
self.d_ff = 64 # 全连接网络维度
self.factor = 5 # 注意力因子
self.activation = 'gelu' # 激活函数
self.channel_independence = 0 # 频道独立性,0:频道依赖,1:频道独立
self.top_k = 6 # TimesBlock中的参数
self.num_kernels = 6 # Inception中的参数
self.distil = 1 # 是否使用蒸馏,1为True
# 一般不需要动的参数
self.embed = 'timeF' # 时间特征编码方式
self.output_attention = 0 # 是否输出注意力
self.task_name = 'short_term_forecast' # 模型的任务,一般不动但是必须这个参数
数据集类似顶刊ETTH的格式即可。
图3 数据集
实验结果拟合效果还是不错的。
图4 实验结果
代码适合功率预测,风电光伏预测,负荷预测,流量预测,浓度预测,机械领域预测等等各种时间序直接预测。
代码源码以及具体详细介绍
https://www.bilibili.com/video/BV1r3eMeTEvL/?spm_id_from=333.999.0.0