Informer 时间序列模型
data
1. WTH.csv
- 水厂
- csv格式数据,总共13列,包含一列标签,12列特征,后面输入模型维度:12
- 每隔一小时一条记录
- 每个时间点对应多个特征,最后一个数据值作为数据标签
2. ECL.csv
- csv格式数据
3. data_loader
cols = list(df_raw.columns); cols.remove(self.target); cols.remove('date')
df_raw = df_raw[['date']+cols+[self.target]]
num_train = int(len(df_raw)*0.7)
num_test = int(len(df_raw)*0.2)
num_vali = len(df_raw) - num_train - num_test
border1s = [0, num_train-self.seq_len, len(df_raw)-num_test-self.seq_len]
border2s = [num_train, num_train+num_vali, len(df_raw)]
border1 = border1s[self.set_type]
border2 = border2s[self.set_type]
border: 由于输入数据是一个连续的序列,因此在原始数据集里取序列的时候【不可以把数据集里末端元素作为序列头】,因为后面没有元素了,无法组成一个完整的序列,因此在划分的训练集、测试集、验证集里会有一个序列边界border的概念,即【最后一个可以组成完整序列的序列头】元素位置。
- 以减去seq_len序列长度操作来实现【限定(组成完整序列)的边界】
model
?tips : 由于pytorch机制,debug nn.module的时候在forward处打断点
main
命令行参数parser
从命令行中解析参数,从命令行中将参数读出来
- parser.add_argument('--freq'):数据重采样(将多个样本结合为一个,比如求均值)
- parser.add_argument('--label_len'): 训练样本(含标签样本)序列长度(模型里先验知识)
- parser.add_argument('--pred_len'):预测样本序列长度
- parser.add_argument('--enc_in'): 输入样本数据维度/输入编码器的样本大小(比如csv训练数据有多少列)
- args.s_layers : 模块循环次数
- args.freq: 时间序列的间隔大小(小时)
data_parser字典
data_parser = {
'ETTh1':{'data':'ETTh1.csv','T':'OT','M':[7,7,7],'S':[1,1,1],'MS':[7,7,1]},
'ETTh2':{'data':'ETTh2.csv','T':'OT','M':[7,7,7],'S':[1,1,1],'MS':[7,7,1]},
'ETTm1':{'data':'ETTm1.csv','T':'OT','M':[7,7,7],'S':[1,1,1],'MS':[7,7,1]},
'ETTm2':{'data':'ETTm2.csv','T':'OT','M':[7,7,7],'S':[1,1,1],'MS':[7,7,1]},
'WTH':{'data':'WTH.csv','T':'WetBulbCelsius','M':[12,12,12],'S':[1,1,1],'MS':[12,12,1]},
'ECL':{'data':'ECL.csv','T':'MT_320','M':[321,321,321],'S':[1,1,1],'MS':[321,321,1]},
'Solar':{'data':'solar_AL.csv','T':'POWER_136','M':[137,137,137],'S':[1,1,1],'MS':[137,137,1]},
定义了一个字典,字典里提供了很多样例数据,不同的样例数据,指定了标签具体是数据中的哪一列。
- T: 标签列
- M:序列大小
这个可以用于后面自定义数据,指定数据大小等等,自己定义,模仿构建数据输入模式
Structure
- ?Encoder: 96(包含了?label: 48)
- ⚪Decoder: 72 =? label: 48 + ?pred: 24
model.py
- ?Encoder: 96(包含了?label: 48)
- ⚪Decoder: 72 =? label: 48 + ?pred: 24
- 初始化:input = torch.zeros()
- 合并48个先验序列:input = torch.cat()
embed.py
-
DataEmbedding
encoder.py
-
class EncoderLayer
-
forward: attention
计算Q\K\V
-
attn.py
-
ProbAttention(Informer核心:创新QKV的计算)
Q\K\V
每个Q和每个K计算,效率太慢,
比如96个Q和96个K
不把96个Q全部和K一一计算,从96个Q中选一部分作为代表
怎么选出Q呢?
先随机选25个K,作为评判标准,
计算96个Q与25个K之间的attention
将得分从大到小排序
前25个得分高的Q作为代表
实现用小的计算量达到同样高水平效果
更新分数的时候只更新这25个Q值的,其他的用均值作为更新
-
Decoder.py
-
cross attention
Q : X
K : encoder 输出的特征
V:encoder 输出的特征
-
output 多变量预测
最后反向传播,参数更新,学习参数