湖北城乡住房建设厅网站怎查证件做PPT哪个网站的素材多点
- 作者: 五速梦信息网
- 时间: 2026年03月21日 10:53
当前位置: 首页 > news >正文
湖北城乡住房建设厅网站怎查证件,做PPT哪个网站的素材多点,桂林网警,廊坊森德科技有限公司Encoder-decoder 模型在序列到序列的自然语言处理任务#xff08;如语言翻译等#xff09;中提供了最先进的结果。多步时间序列预测也可以被视为一个 seq2seq 任务#xff0c;可以使用 encoder-decoder 模型来处理。本文提供了一个用于解决 Kaggle 时间序列预测任务的 encod…Encoder-decoder 模型在序列到序列的自然语言处理任务如语言翻译等中提供了最先进的结果。多步时间序列预测也可以被视为一个 seq2seq 任务可以使用 encoder-decoder 模型来处理。本文提供了一个用于解决 Kaggle 时间序列预测任务的 encoder-decoder 模型并介绍了获得前 10% 结果所涉及的步骤。 数据集 所使用的数据集来自过去的 Kaggle 竞赛 —— Store Item demand forecasting challenge给定过去 5 年的销售数据从 2013 年到 2017 年的 50 个商品来自 10 家不同的商店预测接下来 3 个月2018 年 1 月 1 日至 2018 年 3 月 31 日每个商品的销售情况。这是一个多步多元的时间序列预测问题。 特征也非常的少 有500个商店组合这意味着要预测500个时间序列。 数据预处理 深度学习模型擅长自行发现特征因此可以将特征工程简化到最少。 从图表中可以看出我们的数据具有每周和每月的季节性以及每年的趋势为了捕捉这些特性可以向模型提供DateTime 特征。为了更好地捕捉每个商品销售的年度趋势还提供了年度自相关性。 时间的特征是有周期性的为了将这些信息提供给模型对 DateTime 特征应用了正弦和余弦变换。 最终的特征如下所示。 神经网络期望所有特征的值都在相同的尺度上因此数据缩放变得必不可少。每个时间序列的值都是独立归一化的。年度自相关和年份也进行了归一化。 Encoder-decoder 模型接受一个序列作为输入并返回一个序列作为输出所以需要将数据转为序列 输出序列的长度固定为 90 天而输入序列的长度必须根据问题的复杂性和可用的计算资源来选择。对于这个问题可以选择 180 天6 个月的输入序列长度。通过在数据集中的每个时间序列上应用滑动窗口来构建序列数据。 数据集和数据加载器 Pytorch 提供了方便的抽象 —— Dataset 和 Dataloader —— 用于将数据输入模型。Dataset 接受序列数据作为输入并负责构建每个数据点以输入到模型中。Dataloader 则可以读取Dataset 生成批量的数据 class StoreItemDataset(Dataset):def init(self, cat_columns[], num_columns[], embed_vector_sizeNone, decoder_inputTrue, ohe_cat_columnsFalse):super().init()self.sequence_data Noneself.cat_columns cat_columnsself.num_columns num_columnsself.cat_classes {}self.cat_embed_shape []self.cat_embed_vector_size embed_vector_size if embed_vector_size is not None else {}self.pass_decoder_inputdecoder_inputself.ohe_cat_columns ohe_cat_columnsself.cat_columns_to_decoder Falsedef get_embedding_shape(self):return self.cat_embed_shapedef load_sequence_data(self, processed_data):self.sequence_data processed_datadef process_cat_columns(self, column_mapNone):column_map column_map if column_map is not None else {}for col in self.cat_columns:self.sequence_data[col] self.sequence_data[col].astype(category)if col in column_map:self.sequence_data[col] self.sequence_data[col].cat.set_categories(column_map[col]).fillna(#NA#)else:self.sequence_data[col].cat.add_categories(#NA#, inplaceTrue)self.cat_embed_shape.append((len(self.sequence_data[col].cat.categories), self.cat_embed_vector_size.get(col, 50)))def len(self):return len(self.sequence_data)def getitem(self, idx):row self.sequence_data.iloc[[idx]]x_inputs [torch.tensor(row[x_sequence].values[0], dtypetorch.float32)]y torch.tensor(row[y_sequence].values[0], dtypetorch.float32)if self.pass_decoder_input:decoder_input torch.tensor(row[y_sequence].values[0][:, 1:], dtypetorch.float32)if len(self.num_columns) 0:for col in self.num_columns:num_tensor torch.tensor([row[col].values[0]], dtypetorch.float32)x_inputs[0] torch.cat((x_inputs[0], num_tensor.repeat(x_inputs[0].size(0)).unsqueeze(1)), axis1)decoder_input torch.cat((decoder_input, num_tensor.repeat(decoder_input.size(0)).unsqueeze(1)), axis1)if len(self.cat_columns) 0:if self.ohe_cat_columns:for ci, (num_classes, _) in enumerate(self.cat_embed_shape):col_tensor torch.zeros(num_classes, dtypetorch.float32)col_tensor[row[self.cat_columns[ci]].cat.codes.values[0]] 1.0col_tensor_x col_tensor.repeat(x_inputs[0].size(0), 1)x_inputs[0] torch.cat((x_inputs[0], col_tensor_x), axis1)if self.pass_decoder_input and self.cat_columns_to_decoder:col_tensor_y col_tensor.repeat(decoder_input.size(0), 1)decoder_input torch.cat((decoder_input, col_tensor_y), axis1)else:cat_tensor torch.tensor([row[col].cat.codes.values[0] for col in self.cat_columns],dtypetorch.long)x_inputs.append(cat_tensor)if self.pass_decoder_input:x_inputs.append(decoder_input)y torch.tensor(row[y_sequence].values[0][:, 0], dtypetorch.float32)if len(x_inputs) 1:return tuple(x_inputs), yreturn x_inputs[0], y模型架构 Encoder-decoder 模型是一种用于解决序列到序列问题的循环神经网络RNN。 Encoder-decoder 模型由两个网络组成——编码器Encoder和解码器Decoder。编码器网络学习编码输入序列的表示捕捉其特征或上下文并输出一个向量。这个向量被称为上下文向量。解码器网络接收上下文向量并学习读取并提取解码输出序列。 在编码器和解码器中编码和解码序列的任务由一系列循环单元处理。 编码器 编码器网络的输入形状为序列长度特征维度因此序列中的每个项目由 n 个值组成。在构建这些值时不同类型的特征被不同对待。 时间依赖特征 — 这些是随时间变化的特征如销售和 DateTime 特征。在编码器中每个连续的时间依赖值被输入到一个 RNN 单元中。 数值特征 — 不随时间变化的静态特征如序列的年度自相关。这些特征在序列的长度中重复并被输入到 RNN 中。重复和合并值的过程在 Dataset 中处理。 分类特征 — 如商店 ID 和商品 ID 等特征可以通过多种方式处理每种方法的实现可以在 encoders.py 中找到。对于最终模型分类变量进行了独热编码跨序列重复并被输入到 RNN 中这也在 Dataset 中处理。 带有这些特征的输入序列被输入到循环网络 — GRU 中。下面给出了使用的编码器网络的代码。 class RNNEncoder(nn.Module):def init(self, rnn_num_layers1, input_feature_len1, sequence_len168, hidden_size100, bidirectionalFalse, devicecpu, rnn_dropout0.2):super().init()self.sequence_len sequence_lenself.hidden_size hidden_sizeself.input_feature_len input_feature_lenself.num_layers rnn_num_layersself.rnn_directions 2 if bidirectional else 1self.gru nn.GRU(num_layersrnn_num_layers,input_sizeinput_feature_len,hidden_sizehidden_size,batch_firstTrue,bidirectionalbidirectional,dropoutrnn_dropout)self.device devicedef forward(self, input_seq):ht torch.zeros(self.num_layers * self.rnn_directions, input_seq.size(0), self.hidden_size, deviceself.device)if input_seq.ndim 3:inputseq.unsqueeze(2)gru_out, hidden self.gru(input_seq, ht)print(gru_out.shape)print(hidden.shape)if self.rnn_directions * self.num_layers 1:num_layers self.rnn_directions * self.num_layersif self.rnn_directions 1:gru_out gru_out.view(input_seq.size(0), self.sequence_len, self.rnn_directions, self.hidden_size)gru_out torch.sum(gru_out, axis2)hidden hidden.view(self.num_layers, self.rnn_directions, input_seq.size(0), self.hidden_size)if self.numlayers 0:hidden hidden[-1]else:hidden hidden.squeeze(0)hidden hidden.sum(axis0)else:hidden.squeeze(0)return gru_out, hidden解码器 解码器接收来自编码器的上下文向量解码器的输入还包括未来的 DateTime 特征和滞后特征。模型中使用的滞后特征是前一年的值。使用滞后特征的原因是鉴于输入序列仅限于 180 天提供超出此时间的重要数据点将有助于模型。 不同于直接使用循环网络GRU的编码器解码器是通过循环一个解码器单元来构建的。这是因为从每个解码器单元获得的预测作为输入传递给下一个解码器单元。每个解码器单元由一个 GRUCell 组成其输出被输入到一个全连接层该层提供预测。每个解码器单元的预测被组合形成输出序列。 class DecoderCell(nn.Module):def init(self, input_feature_len, hidden_size, dropout0.2):super().init()self.decoder_rnn_cell nn.GRUCell(input_sizeinput_feature_len,hidden_sizehidden_size,)self.out nn.Linear(hidden_size, 1)self.attention Falseself.dropout nn.Dropout(dropout)def forward(self, prev_hidden, y):rnn_hidden self.decoder_rnn_cell(y, prev_hidden)output self.out(rnn_hidden)return output, self.dropout(rnn_hidden)Encoder-Decoder模型 下面代码将上面2个模型整合完成完整的seq2seq模型 class EncoderDecoderWrapper(nn.Module):def init(self, encoder, decoder_cell, output_size3, teacher_forcing0.3, sequence_len336, decoder_inputTrue, devicecpu):super().init()self.encoder encoderself.decoder_cell decoder_cellself.output_size output_sizeself.teacher_forcing teacher_forcingself.sequence_length sequence_lenself.decoder_input decoder_inputself.device devicedef forward(self, xb, ybNone):if self.decoder_input:decoder_input xb[-1]input_seq xb[0]if len(xb) 2:encoder_output, encoder_hidden self.encoder(input_seq, *xb[1:-1])else:encoder_output, encoder_hidden self.encoder(input_seq)else:if type(xb) is list and len(xb) 1:input_seq xb[0]encoder_output, encoder_hidden self.encoder(*xb)else:input_seq xbencoder_output, encoder_hidden self.encoder(input_seq)prev_hidden encoder_hiddenoutputs torch.zeros(input_seq.size(0), self.output_size, deviceself.device)y_prev input_seq[:, -1, 0].unsqueeze(1)for i in range(self.output_size):step_decoder_input torch.cat((y_prev, decoder_input[:, i]), axis1)if (yb is not None) and (i 0) and (torch.rand(1) self.teacher_forcing):step_decoder_input torch.cat((yb[:, i].unsqueeze(1), decoder_input[:, i]), axis1)rnn_output, prev_hidden self.decoder_cell(prev_hidden, step_decoder_input)y_prev rnn_outputoutputs[:, i] rnn_output.squeeze(1)return outputs训练 模型的性能高度依赖于优化、学习率等超参数和策略 验证策略 —— 由于我们的数据是时间依赖的交叉的训练-验证-测试分割不适用。时间依赖的训练-验证-测试分割存在一个问题即模型没有在最近的验证数据上进行训练这影响了模型在测试数据上的表现。为了解决这个问题模型在过去 3 年的数据2014 到 2016 年上进行训练并预测 2017 年的前 3 个月这用于验证和实验。最终模型在 2014 到 2017 年的数据上进行训练并预测 2018 年的前 3 个月。最终模型基于验证模型训练的学习成果以盲模式无验证进行训练。优化器 —— 使用的优化器是 AdamW它在许多学习任务中提供了最佳结果。另一个探索的优化器是 COCOBOptimizer它不显式设置学习率。在使用 COCOBOptimizer 训练时我观察到它比 AdamW 尤其是在初始迭代时收敛更快。但使用 AdamW 和单周期学习得到了最佳结果。学习率调度 —— 使用了 1cycle 学习率调度器。通过使用循环学习的学习率查找器确定了周期中的最大学习率。损失函数 —— 使用的损失函数是均方误差损失MSE这与最终测试的损失 —— SMAPE 不同。MSE 损失提供了更稳定的收敛性优于使用 SMAPE。为编码器和解码器网络使用了不同的优化器和调度器这带来了结果的改进。除了权重衰减外还在编码器和解码器中使用了 dropout 来对抗过拟合。 结果 下图显示了该模型对2018年前3个月某家商店单品的预测。 通过绘制所有商品的平均销售额以及均值预测来去除噪声可以更好地评估模型。下图来自验证模型对特定日期的预测可以与实际销售数据进行比较。 这个结果在竞赛排行榜中提供前10%的排名。 总结 本文演示了使用Encoder-Decoder 模型创建多步时间序列预测的完整步骤但是为了达到这个结果10%作者还做了超参数调优。并且这个模型还没有增加注意力机制所以还可以通过探索注意机制来进一步改进模型进一步提高模型的记忆能力应该能获得更好的分数。 本文代码 https://avoid.overfit.cn/post/242a897692244172ae44adc15a569647 作者Gautham Kumaran
- 上一篇: 葫芦岛做网站价格wordpress表情文件夹
- 下一篇: 湖北定制型网站建设兰州系统开发
相关文章
-
葫芦岛做网站价格wordpress表情文件夹
葫芦岛做网站价格wordpress表情文件夹
- 技术栈
- 2026年03月21日
-
葫芦岛网站建设网站描文本
葫芦岛网站建设网站描文本
- 技术栈
- 2026年03月21日
-
葫芦岛网站建设泰安信息平台体温
葫芦岛网站建设泰安信息平台体温
- 技术栈
- 2026年03月21日
-
湖北定制型网站建设兰州系统开发
湖北定制型网站建设兰州系统开发
- 技术栈
- 2026年03月21日
-
湖北高端网站建设价格dw个人简历网页制作代码
湖北高端网站建设价格dw个人简历网页制作代码
- 技术栈
- 2026年03月21日
-
湖北建设人力资源网站建网站和建网店的区别
湖北建设人力资源网站建网站和建网店的区别
- 技术栈
- 2026年03月21日
