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

news2024/11/15 11:19:55

继续上文书写:

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_split

from 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 layers


train_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_positions
        self.embedding_dim = embedding_dim

    def 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_embeddings

    def 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_dim
        self.num_heads = num_heads
        self.head_dim = embed_dim // num_heads
        self.scale = self.head_dim ** -0.5
        self.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.scale
        attn = 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 model




def plot_loss(history, warehouse):
    plt.figure(figsize=(8, 6))

    # training and validation loss
    plt.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 loss
    min_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 value
    os.environ['PYTHONHASHSEED']=str(seed_value)
    # Set `python` built-in pseudo-random generator at a fixed value
    random.seed(seed_value)
    # Set `numpy` pseudo-random generator at a fixed value
    np.random.seed(seed_value)
    # Set `tensorflow` pseudo-random generator at a fixed value
    tf.random.set_seed(seed_value)
set_random_seed(42)
import keras

class PrintCallback(keras.callbacks.Callback):
    def __init__(self, print_every=1):
        super(PrintCallback, self).__init__()
        self.print_every = print_every

    def 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.values
        x_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_out
        input_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)
    break
    pass

# 打印模型结构
model.summary()
import matplotlib.pyplot as plt
plot_loss(history,warehouse=id)

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

怎么给电脑文件加密?实用的四种方法,「重磅来袭」!

小李&#xff1a;“嘿&#xff0c;小张&#xff0c;你上次提到的那个重要项目报告&#xff0c;我放在了电脑里&#xff0c;但总觉得不太安全&#xff0c;万一被误删了或者不小心泄露了怎么办&#xff1f;” 小张&#xff1a;“别担心&#xff0c;小李&#xff0c;给文件加密是…

如何提高工作效率?分享9个高效率工作的方法

如果您的企业正在面临以下问题&#xff1a; 员工敏捷性和生产力降低员工满意度不足利润下降 那么您需要创建一个运营改进指南。 这需要经常更新&#xff0c;因为这不是一次性的努力&#xff0c;而是必须定期进行的持续过程。然而&#xff0c;您的运营改进指南还必须强调优化…

java 垃圾回收器以及JVM调优方式

什么是垃圾&#xff1a; 没有被引用的对象 就是垃圾。 定位的方式 reference count: 引用计数&#xff0c;即在对象上记录着有多少个引用指向它。&#xff08;循环引用无法解决&#xff09; root searching: 根可达算法&#xff0c;根对象包含 线程栈变量&#xff0c;静态变…

bootStrap中操作行详情,删除,修改等操作

点击列表某一行的操作按钮&#xff0c;结合swtich case 出发不同操作

【2024算力大会分会 | SPIE出版】2024云计算、性能计算与深度学习国际学术会议(CCPCDL 2024)

【2024算力大会分会 | SPIE出版】 2024云计算、性能计算与深度学习国际学术会议(CCPCDL 2024) 2024 International conference on Cloud Computing, Performance Computing and Deep Learning CCPCDL往届均已完成EI检索&#xff0c;最快会后4个半月完成&#xff01; 2024中…

postgresql 11.17 开发环境rpm安装及扩展安装

进入postgresql安装文件rpm所在文件夹 cd /data460/software 执行 yum local install *.rpm 提示缺少啥依赖就对应yum安装 最后有个依赖比较特殊 Requires: llvm-toolset-7-clang > 4.0.1 You could try using --skip-broken to work around the problem 需要安装centos-re…

Spring WebFlux 整合 r2dbc 的增删改查案例

无障碍阅读方法 微信公众号关注:张家的小伙子 回复:10205文章目录 无障碍阅读方法说明准备创建mysql数据库和数据表创建一个maven项目添加项目依赖包创建项目基本目录接口启动类编写编写application配置添加跨域请求配置创建实体-数据表映射类创建Dao操作类编写自己的增删改…

VS code 美化之 代码窗背景图 日志2024/8/2

VS code 美化之 代码窗背景图 先看效果: 参考文档: VSCode设置背景图片的两种方式_vscode代码背景-CSDN博客 用插件那个方法我试了,其只会在右侧 侧边栏目出现背景图,可能是我设置不正确吧 而且安装这个插件之后出现弹窗 vscode安装出现问题什么的提示,删除这个拓展就不会有…

时间价值衰减对期权价格有哪些影响?投资必知!

今天带你了解时间价值衰减对期权价格有哪些影响&#xff1f;投资必知&#xff01;期权的时间对期权的价格和价值具有重要影响&#xff0c;这是由于期权的特性和市场机制决定的&#xff0c;其实期权的时间价值是会衰减的。 期权的时间价值&#xff0c;指的是潜在的可能性。 比…

TypeScript(switch判断)

1.switch 语法用法 switch是对某个表达式的值做出判断。然后决定程序执行哪一段代码 case语句中指定的每个值必须具有与表达式兼容的类型 语法switch(表达式){ case 值1&#xff1a; ​ 执行语句块1 break; case 值2&#xff1a; ​ 执行语句块3 break; dfault: //如…

CSDN选择:腾讯cdn缓存跟阿里云cdn对比

在如今互联网迅速发展的时代&#xff0c;内容分发网络&#xff08;CDN&#xff09;变得越来越重要。而在众多CDN提供商中&#xff0c;腾讯云和阿里云的CDN服务无疑是具代表性的两家。那么&#xff0c;这两家的CDN服务究竟有何差异&#xff1f;哪一家更值得选择呢&#xff1f;今…

Python WSGI服务器库之gunicorn使用详解

概要 在部署 Python Web 应用程序时,选择合适的 WSGI 服务器是关键的一步。Gunicorn(Green Unicorn)是一个高性能、易于使用的 Python WSGI HTTP 服务器,适用于各种应用部署场景。Gunicorn 设计简洁,支持多种工作模式,能够有效地管理和处理大量并发请求。本文将详细介绍…

【Canvas与艺术】八角大楼

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>八角大楼</title><style type"text/css">.cen…

System,InvalidOperationException:未在本地计算机,上注册“Microsoft.ACE,OLEDB.12.0”提供程序。

未在本地计算机,上注册“Microsoft.ACE,OLEDB.12.0”提供程序 问题原因分析解决方案&#xff1a;第一步第二步 问题 本地导入excel没有问题&#xff0c;发布到服务器上出现System,InvalidOperationException:未在本地计算机,上注册“Microsoft.ACE,OLEDB.12.0”提供程序。 原…

tls.go中的流程梳理

文章目录 tls.go中的流程梳理b站博主的 tls 加密过程自己推理的过程(未完待续)发送ClientHello获取ServerHello tls.go中的流程梳理 b站博主的 tls 加密过程 客户端发送ClentHello(tls版本 加密套件 随机数1)服务器发送ServerHello(tls版本 加密套件 随机数2) 这个阶段之后&…

PLM选型指南:如何选择适合自己企业的系统?

导语&#xff1a;在当前的市场竞争中&#xff0c;制造环节的利润逐渐被压缩&#xff0c;企业亟需寻求新的利润增长点来抢占更多市场份额。企业之间的竞争已不再仅仅是产品质量的较量&#xff0c;更是产品创新速度与效率的角逐。由此&#xff0c;研发创新成为企业转型升级的破局…

Swin Transformer和vit

Swin Transformer最为关键的设计在于连续自注意力层间&#xff0c;特征图上的窗划分口实现了半个窗宽的移动。这使得前一层的窗口间可以实现交互和联系&#xff0c;大幅度提升了模型的表达能力。同时在同一窗口内的查询都拥有相同的key序列&#xff0c;使得硬件内存更容易实现大…

【AI冰封挑战】搭档函数计算,“冰”封你的夏日记忆

在 AI 绘画领域&#xff0c;Stable Diffusion、 WebUI、Midjourney 等工具各领风骚&#xff0c;但 ComfyUI 以其独特的自动化工作流机制&#xff0c;自问世以来便迅速崭露头角&#xff0c;成为众多应用开发者和艺术创作者的新宠。它不仅革新了 AI 生图的创作流程&#xff0c;更…

环网自愈型RS485转光纤

一、概述 工业级双环光纤自愈RS485 转 光纤。工业现场总线光通讯中光纤双环网自愈是 一种有效 的高可靠通讯方式 。双环 自愈光 纤 Modem 采用光纤传输技术&#xff0c;专为工业自动化、 SCADA(数据采集及监控)等工业环境的远程数 据通讯而设计&#xff0c;该产品主用实现48…

nvm管理node版本问题处理集合

windows上通过nvm管理node版本&#xff0c;通过nvm安装node&#xff0c;报错了&#xff0c;信息&#xff1a; > Could not retrieve https://nodejs.org/dist/latest/SHASUMS256.txt. Get > https://nodejs.org/dist/latest/SHASUMS256.txt: dial tcp 104.20.23.46:443: …