7.2 单变量(多->多),attention/informer

继续上文书写:

1 GRU + Attention

收敛速度稳定的很多,你看这些模型是不是很容易搭,像积木一样;

def create_model(input_shape, output_length,lr=1e-3, warehouse="None"):input = Input(shape=input_shape)conv1 = Conv1D(filters=32, kernel_size=3, activation='relu', padding='same', kernel_regularizer=l2())(input)bn = BatchNormalization()(conv1)drop = Dropout(0.4)(bn)gru = GRU(units=64, activation='relu',return_sequences=True)(drop)#print(gru.shape)mult_att = MultiHeadAttention(num_heads=4, key_dim=8)(gru,gru,gru)mult_att_f = Flatten()(mult_att)outputs = Dense(output_length)(mult_att_f)print(outputs.shape)model = Model(inputs=input, outputs=outputs)#model.compile(loss=MeanSquaredError(), optimizer=tf.keras.optimizers.RMSprop(learning_rate=lr, rho=0.9))model.compile(loss=MeanSquaredError(), optimizer=tf.keras.optimizers.RMSprop(lr=lr))return model

2 Informer 

        Informer 模型是一种专为长序列时间序列预测设计的高效 Transformer 架构。它的输入通常是时间序列数据,这些数据可以是多变量的或是单变量的。具体来说,Informer 模型接收以下类型的输入:

  1. 时间序列观测值

    • 这是模型的主要输入,通常是一个形状为 (batch_size, sequence_length, feature_dim) 的张量。其中:
      • batch_size 是同时处理的序列数量。
      • sequence_length 是每个序列的时间步数。
      • feature_dim 是每个时间步上的特征数量,对于单变量时间序列,feature_dim 为 1;对于多变量时间序列,feature_dim 大于 1。
  2. 目标序列长度

    • 在训练过程中,Informer 可能还需要知道目标序列的长度,即要预测的未来时间步数,这通常用于监督学习设置中的教师强制(teacher forcing)。
  3. 标记序列

    • 除了时间序列观测值外,Informer 还可能接受额外的输入,比如标记序列,这些可以包含额外的信息,如节假日、工作日/非工作日等,以帮助模型更好地理解输入数据的上下文。
  4. 编码器和解码器输入掩码

    • Informer 使用自注意力机制,这需要输入掩码来指示哪些位置是有效的,哪些位置应该被忽略。在编码器和解码器中,掩码用于避免某些位置的信息泄露。
  5. 位置信息

    • 虽然不是严格意义上的输入,但 Informer 和其他 Transformer 模型通常使用位置嵌入(Position Embedding)来给模型提供关于序列中每个元素位置的信息。这通常是在输入序列处理的第一阶段内部实现的,而不是作为外部输入。

        当使用 Informer 进行预测时,你通常需要提供过去的时间序列观测值以及你想要预测的未来时间步数。模型会基于过去的观测值预测未来的值。在实际应用中,可能还需要提供一些配置参数,比如嵌入维度、注意力头的数量、前馈网络的宽度等。

添加了一个位置编码,但是感觉不对。

import numpy as np
import pandas as pd
#import lightgbm as lgb
from sklearn.model_selection import StratifiedKFold, KFold, GroupKFold
from sklearn.metrics import mean_squared_error, mean_absolute_error
from sklearn.model_selection import train_test_splitfrom tqdm import tqdm
from sklearn.preprocessing import LabelEncoder
#import h3
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
pd.set_option("display.max_rows",None)from tqdm import tqdm
warnings.filterwarnings('ignore')from tensorflow.keras.preprocessing.sequence import TimeseriesGenerator
from tensorflow.keras.models import Sequential, Model
from tensorflow.keras.layers import Input, Embedding, LayerNormalization, Dense, Dropout, Concatenate,Flatten
from tensorflow.keras.losses import MeanSquaredError, Huber,MeanAbsoluteError
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint, ReduceLROnPlateau
import warnings
from tensorflow.keras.regularizers import l2
from tensorflow.keras import layerstrain_df = pd.read_csv('../data/dataset/train.csv')
#train_df = train_df[train_df.dt<100].reset_index(drop=True)
test_df = pd.read_csv('../data/dataset/test.csv')
#train_df['target_div_dt'] = train_df['target'] / train_df['dt']df_all = pd.concat([train_df,test_df])
df_all['dt_max'] = df_all.groupby('id')['dt'].transform('max')
df_all = df_all.sort_values(['id','dt']).reset_index(drop=True)
df_all['new_dt'] = df_all['dt_max']-df_all['dt']
df_all = df_all.sort_values(['id','new_dt']).reset_index(drop=True)
df_all.tail()
train_df = df_all[~df_all['target'].isna()].reset_index(drop=True)
test_df = df_all[df_all['target'].isna()].reset_index(drop=True)def create_dataset(X, n_steps_in, n_steps_out):print(f"Input data shape before processing: {X.shape}")Xs, ys = [], []for i in range(len(X) - n_steps_in - n_steps_out + 1):Xs.append(X[i:(i + n_steps_in)])ys.append(X[(i + n_steps_in):(i + n_steps_in + n_steps_out)])Xs = np.array(Xs)ys = np.array(ys)print(f"Xs shape after processing: {Xs.shape}")print(f"ys shape after processing: {ys.shape}")return Xs, ys# 定义位置嵌入层
class PositionEmbedding(layers.Layer):def __init__(self, max_positions=512, embedding_dim=128, **kwargs):super(PositionEmbedding, self).__init__(**kwargs)self.max_positions = max_positionsself.embedding_dim = embedding_dimdef build(self, input_shape):self.positions = self.add_weight(shape=(self.max_positions, self.embedding_dim),initializer='uniform',trainable=True,name='position_embeddings')super(PositionEmbedding, self).build(input_shape)def call(self, inputs):seq_len = tf.shape(inputs)[1]positions = tf.range(0, seq_len, delta=1)position_embeddings = tf.gather(self.positions, positions)return inputs + position_embeddingsdef compute_output_shape(self, input_shape):return input_shape# 定义 ProbSparseSelfAttention 层(简化版)
class ProbSparseSelfAttention(layers.Layer):def __init__(self, embed_dim, num_heads, **kwargs):super(ProbSparseSelfAttention, self).__init__(**kwargs)self.embed_dim = embed_dimself.num_heads = num_headsself.head_dim = embed_dim // num_headsself.scale = self.head_dim ** -0.5self.qkv = Dense(embed_dim * 3, use_bias=False)self.out = Dense(embed_dim)def call(self, x):qkv = self.qkv(x)q, k, v = tf.split(qkv, 3, axis=-1)q, k, v = [tf.reshape(t, (-1, self.num_heads, tf.shape(x)[1], self.head_dim)) for t in [q, k, v]]q, k, v = [tf.transpose(t, perm=[0, 2, 1, 3]) for t in [q, k, v]]attn = tf.matmul(q, k, transpose_b=True) * self.scaleattn = tf.nn.softmax(attn, axis=-1)output = tf.matmul(attn, v)output = tf.transpose(output, perm=[0, 2, 1, 3])output = tf.reshape(output, (-1, tf.shape(x)[1], self.embed_dim))return self.out(output)# 定义 Informer Block
class InformerBlock(layers.Layer):def __init__(self, embed_dim, num_heads, ff_dim, dropout_rate=0.1, **kwargs):super(InformerBlock, self).__init__(**kwargs)self.attention = ProbSparseSelfAttention(embed_dim, num_heads)self.ffn = tf.keras.Sequential([Dense(ff_dim, activation="relu"),Dense(embed_dim),])self.layernorm1 = LayerNormalization(epsilon=1e-6)self.layernorm2 = LayerNormalization(epsilon=1e-6)self.dropout1 = Dropout(dropout_rate)self.dropout2 = Dropout(dropout_rate)def call(self, inputs):attn_output = self.attention(inputs)attn_output = self.dropout1(attn_output)out1 = self.layernorm1(inputs + attn_output)ffn_output = self.ffn(out1)ffn_output = self.dropout2(ffn_output)return self.layernorm2(out1 + ffn_output)# 定义 Informer 模型
def create_informer_model(input_seq_length,out_seq_length, input_dim, embed_dim, num_heads, ff_dim, num_blocks, dropout_rate=0.1):inputs = Input(shape=(input_seq_length, input_dim))x = PositionEmbedding()(inputs)for _ in range(num_blocks):x = InformerBlock(embed_dim, num_heads, ff_dim, dropout_rate)(x)x = Flatten()(x)x = Dense(out_seq_length)(x)model = Model(inputs=inputs, outputs=x)return modeldef plot_loss(history, warehouse):plt.figure(figsize=(8, 6))# training and validation lossplt.plot(history.history['loss'], label='Training Loss', color='blue', linewidth=2)plt.plot(history.history['val_loss'], label='Validation Loss', color='orange', linewidth=2)# minimum validation lossmin_val_loss = min(history.history['val_loss'])min_val_loss_epoch = history.history['val_loss'].index(min_val_loss)plt.axvline(min_val_loss_epoch, linestyle='--', color='gray', linewidth=1)plt.text(min_val_loss_epoch, min_val_loss, f'Min Val Loss: {min_val_loss:.4f}', verticalalignment='bottom', horizontalalignment='right', color='gray', fontsize=10)plt.title(f'Training and Validation Loss for ID: {warehouse}', fontsize=16)plt.xlabel('Epoch', fontsize=14)plt.ylabel('Loss', fontsize=14)plt.legend(fontsize=12)plt.grid(True)plt.xticks(fontsize=12)plt.yticks(fontsize=12)plt.tight_layout()#plt.savefig(f'training_validation_loss_{warehouse}.png', dpi=300)plt.show()n_features = 1  # 因为这是一个一维序列
n_steps_in = 70  # 输入序列的长度
n_steps_out = 10  # 预测序列的长度
# 数据预处理
# 数据预处理best_sub = pd.read_csv('../data/sub/es_xgb_55_big_diff_fill_es_216.csv')
tf.random.set_seed(42)
import numpy as np
np.random.seed(42)
import random
import os
error_df = {}
def set_random_seed(seed_value):# Set `PYTHONHASHSEED` environment variable at a fixed valueos.environ['PYTHONHASHSEED']=str(seed_value)# Set `python` built-in pseudo-random generator at a fixed valuerandom.seed(seed_value)# Set `numpy` pseudo-random generator at a fixed valuenp.random.seed(seed_value)# Set `tensorflow` pseudo-random generator at a fixed valuetf.random.set_seed(seed_value)
set_random_seed(42)
import kerasclass PrintCallback(keras.callbacks.Callback):def __init__(self, print_every=1):super(PrintCallback, self).__init__()self.print_every = print_everydef on_epoch_end(self, epoch, logs=None):if (epoch + 1) % self.print_every == 0:print(f"Epoch {epoch + 1}: loss={logs['loss']:.4f}, val_loss={logs['val_loss']:.4f}")# 使用示例
print_every_n_epochs = 5  # 每 5 个 epoch 打印一次
error_id = []
for id in tqdm(train_df.id.unique().tolist()):try:temp_df = train_df[train_df.id==id].reset_index(drop=True)X = temp_df.target.valuesx_test = X[-n_steps_in:]train_X,train_y =  create_dataset(X,n_steps_in,n_steps_out)X_train, X_val, y_train, y_val = train_test_split(train_X, train_y, test_size=0.2, shuffle=True)# 参数配置input_seq_length = n_steps_in  # 输入序列长度out_seq_length = n_steps_outinput_dim = 1  # 输入特征维度embed_dim = 128  # 嵌入维度num_heads = 4  # 注意力头数量ff_dim = 512  # 前馈神经网络的隐藏层维度num_blocks = 4  # Informer Block 的数量# 创建模型model = create_informer_model(input_seq_length,out_seq_length, input_dim, embed_dim, num_heads, ff_dim, num_blocks)model.compile(optimizer='adam', loss='mse')callbacks = [PrintCallback(print_every=print_every_n_epochs),EarlyStopping(monitor='val_loss', patience=25, restore_best_weights=True),]history = model.fit(X_train, y_train, epochs=150, batch_size=32, #validation_split=0.2, validation_data=(X_val, y_val), callbacks=callbacks,verbose=0)test_y = model.predict(x_test.reshape((-1,n_steps_in)))test_df.loc[test_df.id==id,'target'] = test_y[0]error = mean_squared_error(best_sub[best_sub['id']==id]['target'],test_y[0])error_df[id] = round(error,4)print(f'linear model {id} VS best sb ERROR = {error}')except Exception as e:error_id.append(id)print(f'error id = {id}',e)breakpass# 打印模型结构
model.summary()
import matplotlib.pyplot as plt
plot_loss(history,warehouse=id)

把位置编码去了,我觉得周六周日编码一下,这个特征还是有价值的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/390376.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++标准模版库】模拟实现vector+迭代器失效问题

模拟实现vector 一.vector成员变量二.构造函数1.无参&#xff08;默认&#xff09;构造2.有参构造3.拷贝构造1.传统写法2.现代写法 三.vector对象的容量操作1.size2.capacity3.clear4.empty5.reserve6.resize 四.vector对象的访问及遍历操作1.operator[]2.实现迭代器&#xff1…

免费【2024】springboot 大学生志愿者管理系统的设计与实现

博主介绍&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

windows下设置java环境变量

1.打开window的环境变量设置 右键开始菜单选择系统 选择高级系统设置&#xff1a; 点击环境变量 2.在系统变量 新增 JAVA_HOME&#xff1b;该变量的值 选择jdk所在的目录即可。 JAVA_HOME: D:\Program Files\Java\jdk1.8.0_131 3. 在系统变量新增 classpath; 该变量的值设置…

GoLang 安装

golang学习笔记 goland 安装 To use Go programming language in Visual Studio Code (VSCode), you can follow these steps: 1. Install Go: Download and install the latest version of Go from the official Go website (https://golang.org/dl/). 2. Install VSCode:…

llama-3.1下载部署

llama-3.1 下载部署 下载 huggingface 详情页填写申请后等待审核 点击 头像->setting->access token 创建token 配置环境变量 下载模型 pip install -U huggingface_hubhuggingface-cli download --resume-download meta-llama/Meta-Llama-3.1-8B-Instruct --loca…

IDEA的疑难杂症

注意idea版本是否与maven版本兼容 2019idea与maven3.6以上不兼容 IDEA无法启动 打开idea下载安装的目录:如:Idea\IntelliJ IDEA 2024.1\bin 在bin下面找到 打开在最后一行添加暂停 pause 之后双击运行idea.bat 提示找不到一个jar包,切记不要有中文目录 IDEA缓存 …

Java与Python谁更适合后端开发?

在软件开发的世界里&#xff0c;选择合适的编程语言就像为建筑选择合适的材料一样重要。 对于后端开发而言&#xff0c;Java和Python都是流行的选择&#xff0c;但它们各自拥有独特的优势和劣势&#xff0c;“谁更适合”就成为一个被议论的话题。 事实上&#xff0c;并不存在…

每日学术速递8.2

1.A Scalable Quantum Non-local Neural Network for Image Classification 标题&#xff1a; 用于图像分类的可扩展量子非局部神经网络 作者&#xff1a; Sparsh Gupta, Debanjan Konar, Vaneet Aggarwal 文章链接&#xff1a;https://arxiv.org/abs/2407.18906 摘要&#x…

[BJDCTF2020]Easy MD51

抓包看一下信息&#xff0c;发现有sql注入字段 输入 注入发现 查看源码 然后get传参?aQNKCDZO&bs214587387a 最后 MD5函数的弱类型比较 发现PHP代码&#xff0c;分析仍为 PHP md5绕过。 使用数组绕过POST传入param1[]1&param2[]2&#xff0c;得到flag。

RIP综合练习

要求&#xff1a; 1.合理使用IP地址划分网络&#xff0c;各自创建循环接口 2.R1创建环回172.16.1.1/24 172.16.2.1/24 172.16.3.1/24 3.要求R3使用R2访问R1环回 4.减少路由条目数量&#xff0c;R1,R2之间增加路由传递安全性 5.R5创建一个环回模拟运营商&#xff0c;不能…

打卡第31天------贪心算法

每天抓紧时间刷题,争取尽快上岸,不能再耽误一分一秒了,2024年已经过去大半年了。这个算法编程题是我的痛点。要尽快弥补。 卡尔在讲算法题的时候,思路比较清晰,通俗易懂,以前看见算法题就害怕,因为啥都不会,看懵了,跟了一个月了,每天坚持刷题,偶尔会回顾思路,也会…

开源Spring Boot版本WebSSH:轻松在浏览器中管理SSH和FTP

介绍 WebSSH 是一个轻量级的开源ssh工具&#xff0c;只需安装在服务端&#xff0c;就可以通过浏览器访问SSH和FTP。它支持文件和日志高亮显示&#xff0c;Vim 和 Top 命令&#xff0c;实时查看日志&#xff0c;并且操作体验与标准的 Shell 基本相同。WebSSH 支持多会话、文件上…

【Git】git 从入门到实战系列(二)—— git 介绍以及安装方法 (文末附带视频录制操作步骤)

文章目录 一、前言二、git 是什么三、版本控制系统是什么四、本地 vs 集中式 vs 分布式本地版本控制系统集中式版本控制系统分布式版本控制系统 五、安装 git 一、前言 本系列上一篇文章【Git】git 从入门到实战系列&#xff08;一&#xff09;—— Git 的诞生&#xff0c;Lin…

【2024蓝桥杯/C++/B组/小球反弹】

题目 分析 Sx 2 * k1 * x; Sy 2 * k2 * y; &#xff08;其中k1, k2为整数&#xff09; Vx * t Sx; Vy * t Sy; k1 / k2 (15 * y) / (17 * x)&#xff1b; 目标1&#xff1a;根据k1与k2的关系&#xff0c;找出一组最小整数组&#xff08;k1, k2&#xff09;&#xff…

NLP-使用Word2vec实现文本分类

Word2Vec模型通过学习大量文本数据&#xff0c;将每个单词表示为一个连续的向量&#xff0c;这些向量可以捕捉单词之间的语义和句法关系。本文做文本分类是结合Word2Vec文本内容text&#xff0c;预测其文本标签label。以下使用mock商品数据的代码实现过程过下&#xff1a; 1、…

PCL从理解到应用【08】 点云特征 | 法线估计 | 主曲率估计

前言 在PCL中&#xff0c;有多种方法和函数可以用来提取点云特征&#xff0c;本文介绍几何特征。 其中&#xff0c;几何特征主要包括法线估计和主曲率估计。 这些特征能够描述点云表面的几何形状&#xff0c;常用于进一步的点云处理和分析&#xff0c;如配准、分割和物体识别…

利用canvas 实现图片的标注,把标注像素点传入到后端

背景&#xff1a;我们有一个摄像的产品&#xff0c;拍照传统的水表盘面&#xff0c;我们需要框选水表读数&#xff0c;标注点传到后端&#xff0c;后端根据标注点自动去截取摄像表拍摄回来的图片&#xff0c;然后拿到大模型里面进行训练。由于同一只表拍摄的画面都是一样的&…

【时时三省】unity test 测试框架 使用 code blocks 移植

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 目录 1&#xff0c;使用 Code::Blocks 17.12 创建工程 2&#xff0c;移植文件至该工程下&#xff1a; 移入的文件为: 被移入的文件介绍&#xff1a; 更改代码&#xff1a; 向工程添加文…

k8s 部署RuoYi-Vue-Plus之ingress域名解析

可参看https://blog.csdn.net/weimeibuqieryu/article/details/140798925 搭建ingress 1.创建Ingress对象 ingress-ruoyi.yaml其中host替换为你对应域名&#xff0c;需要解析域名到服务器, 同时为后端服务添加了二级域名解析 api. 访问http://xxx.xyz/就能访问前端&#xff0…

力扣SQL50 修复表中的名字 字符串函数

Problem: 1667. 修复表中的名字 &#x1f468;‍&#x1f3eb; 参考题解 select user_id, CONCAT(UPPER(left(name, 1)), LOWER(RIGHT(name, length(name) - 1))) as name from Users order by user_id