news 2026/5/28 19:39:30

Transformer 预测模型,预测代码,可以直接替换数据。python代码,pytorch框架,有encoder decoder

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Transformer 预测模型,预测代码,可以直接替换数据。python代码,pytorch框架,有encoder decoder


Transformer 预测模型,预测代码,可以直接替换数据。python代码,pytorch框架,有encoder decoder。
多变量输入,单变量输出

2.informer预测 代码 模型
1.适合股票预测,风电预测等各类预测。
2.PyTorch框架实现 。
3.多输入单输出。
4.数据从excel/csv文件中读取,更换简单
且自带数据集,可自己替换数据集。
两个二选一哈,默认transformer。
Informer 时间序列预测

importpandas as pdimportnumpy as np from sklearn.preprocessingimportStandardScaler from sklearn.model_selectionimporttrain_test_splitimporttorch from torch.utils.dataimportDataset, DataLoaderimporttorch.nn as nnimporttorch.nn.functional as Fimportmatplotlib.pyplot as plt# 设置随机种子以保证可重复性torch.manual_seed(42)np.random.seed(42)# 数据加载与预处理def load_data(file_path, features, target, window_size, horizon): data=pd.read_csv(file_path,parse_dates=['timestamp'],index_col='timestamp')X=data[features].values y=data[target].values scaler_X=StandardScaler()scaler_y=StandardScaler()X_scaled=scaler_X.fit_transform(X)y_scaled=scaler_y.fit_transform(y.reshape(-1,1)).flatten()def create_sliding_windows(data, target, window_size, horizon): Xs, ys=[],[]foriinrange(len(data)- window_size - horizon +1):v=data[i:(i + window_size)]labels=target[(i + window_size):(i + window_size + horizon)]Xs.append(v)ys.append(labels)returnnp.array(Xs), np.array(ys)X_windows, y_windows=create_sliding_windows(X_scaled, y_scaled, window_size, horizon)X_train, X_test, y_train, y_test=train_test_split(X_windows, y_windows,test_size=0.2,random_state=42)class TimeSeriesDataset(Dataset): def __init__(self, X, y): self.X=torch.tensor(X,dtype=torch.float32)self.y=torch.tensor(y,dtype=torch.float32)def __len__(self):returnlen(self.X)def __getitem__(self, idx):returnself.X[idx], self.y[idx]train_dataset=TimeSeriesDataset(X_train, y_train)test_dataset=TimeSeriesDataset(X_test, y_test)train_loader=DataLoader(train_dataset,batch_size=32,shuffle=True)test_loader=DataLoader(test_dataset,batch_size=32,shuffle=False)returntrain_loader, test_loader, scaler_y# 定义模型组件class PositionalEncoding(nn.Module): def __init__(self, d_model,max_len=5000): super(PositionalEncoding, self).__init__()pe=torch.zeros(max_len, d_model)position=torch.arange(0, max_len,dtype=torch.float).unsqueeze(1)div_term=torch.exp(torch.arange(0, d_model,2).float()*(-np.log(10000.0)/ d_model))pe[:,0::2]=torch.sin(position * div_term)pe[:,1::2]=torch.cos(position * div_term)pe=pe.unsqueeze(0).transpose(0,1)self.register_buffer('pe', pe)def forward(self, x): x=x + self.pe[:x.size(0), :]returnx class DataEmbedding(nn.Module): def __init__(self, c_in, d_model,dropout=0.1): super(DataEmbedding, self).__init__()self.value_embedding=nn.Linear(c_in, d_model)self.position_embedding=PositionalEncoding(d_model)self.dropout=nn.Dropout(p=dropout)def forward(self, x): x=self.value_embedding(x)+ self.position_embedding(x)returnself.dropout(x)class InformerModel(nn.Module): def __init__(self, enc_in, dec_in, c_out, seq_len, pred_len,factor=5,d_model=512,n_heads=8,e_layers=3,d_layers=2,d_ff=512,dropout=0.1,activation='gelu'): super(InformerModel, self).__init__()self.enc_embedding=DataEmbedding(enc_in, d_model, dropout)self.dec_embedding=DataEmbedding(dec_in, d_model, dropout)self.encoder=nn.TransformerEncoder(encoder_layer=nn.TransformerEncoderLayer(d_model=d_model,nhead=n_heads,dim_feedforward=d_ff,dropout=dropout),num_layers=e_layers)self.decoder=nn.TransformerDecoder(decoder_layer=nn.TransformerDecoderLayer(d_model=d_model,nhead=n_heads,dim_feedforward=d_ff,dropout=dropout),num_layers=d_layers)self.projection=nn.Linear(d_model, c_out)def forward(self, src, tgt): src=self.enc_embedding(src)tgt=self.dec_embedding(tgt)memory=self.encoder(src)output=self.decoder(tgt, memory)output=self.projection(output)returnoutput# 训练和评估模型def train_and_evaluate(model, optimizer, criterion, train_loader, test_loader,num_epochs=50):forepochinrange(num_epochs): model.train()running_loss=0.0forinputs, labelsintrain_loader: inputs=inputs.permute(1,0,2).to(device)# (seq_len, batch_size, input_dim)targets=labels.permute(1,0).unsqueeze(-1).to(device)# (seq_len, batch_size, output_dim)optimizer.zero_grad()outputs=model(inputs, targets[:-1])loss=criterion(outputs.view(-1), targets[1:].view(-1))loss.backward()optimizer.step()running_loss+=loss.item()print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss/len(train_loader):.4f}')# 评估模型model.eval()total_loss=0.0predictions=[]actuals=[]with torch.no_grad():forinputs, labelsintest_loader: inputs=inputs.permute(1,0,2).to(device)# (seq_len, batch_size, input_dim)targets=labels.permute(1,0).unsqueeze(-1).to(device)# (seq_len, batch_size, output_dim)outputs=model(inputs, targets[:-1])loss=criterion(outputs.view(-1), targets[1:].view(-1))total_loss+=loss.item()predictions.extend(outputs.cpu().numpy().squeeze())actuals.extend(targets[1:].cpu().numpy().squeeze())avg_loss=total_loss / len(test_loader)# 计算评价指标predictions=np.array(predictions)actuals=np.array(actuals)mse=np.mean((predictions-actuals)**2)rmse=np.sqrt(mse)mae=np.mean(np.abs(predictions-actuals))mape=np.mean(np.abs((predictions-actuals)/actuals))*100r2=1-((predictions-actuals)**2).sum()/((actuals-np.mean(actuals))**2).sum()print(f'Test Loss: {avg_loss:.4f}')print(f'R² Score: {r2:.4f}')print(f'RMSE: {rmse:.4f}')print(f'MAE: {mae:.4f}')print(f'MAPE: {mape:.4f}')# 保存结果到文本文件results=f"Test Loss: {avg_loss:.4f}\n"results+=f"R² Score: {r2:.4f}\n"results+=f"RMSE: {rmse:.4f}\n"results+=f"MAE: {mae:.4f}\n"results+=f"MAPE: {mape:.4f}\n"with open('results.txt','w')as f: f.write(results)# 可视化结果plt.figure(figsize=(12,6))plt.plot(actuals,label='Actual')plt.plot(predictions,label='Predicted')plt.title('Actual vs Predicted')plt.xlabel('Time Steps')plt.ylabel('Value')plt.legend()plt.savefig('prediction_vs_actual.png')plt.show()# 主函数if__name__=="__main__":# 参数设置file_path='data.csv'features=['feature1','feature2']target='target'window_size=10horizon=1# 单步预测,如果需要多步预测,设置更大的值input_dim=len(features)output_dim=horizon# 设备选择device=torch.device("cuda"iftorch.cuda.is_available()else"cpu")# 加载数据train_loader, test_loader, scaler_y=load_data(file_path, features, target, window_size, horizon)# 初始化模型model=InformerModel(enc_in=input_dim,dec_in=output_dim,c_out=output_dim,seq_len=window_size,pred_len=horizon,d_model=512,n_heads=8,e_layers=3,d_layers=2,d_ff=512,dropout=0.1,activation='gelu').to(device)criterion=nn.MSELoss()optimizer=torch.optim.Adam(model.parameters(),lr=0.001)# 训练和评估模型train_and_evaluate(model, optimizer, criterion, train_loader, test_loader)


当然可以!下面我将为你提供两个版本的代码:一个是基于Transformer Encoder-Decoder架构的时间序列预测模型,另一个是Informer模型。这两个模型都适合多变量输入和单变量输出,并且可以从Excel/CSV文件中读取数据。

1. Transformer Encoder-Decoder 模型

项目介绍
  • 模型架构:

    • Encoder: 处理输入时间序列数据。
    • Decoder: 生成未来的预测值。
  • 功能:

    • 多变量输入,单变量输出。
    • 数据从Excel/CSV文件中读取,更换简单。
    • 自带数据集,可自己替换数据集。
    • 评价指标: R², RMSE, MAE, MAPE
    • 结果保存到文本中,可以后续处理。
代码实现

2. Informer 预测模型

项目介绍
  • 模型架构:

    • 基于Informer论文中的架构,结合了自注意力机制和局部特征提取。
  • 功能:

    • 多变量输入,单变量输出。
    • 数据从Excel/CSV文件中读取,更换简单。
    • 自带数据集,可自己替换数据集。
    • 评价指标: R², RMSE, MAE, MAPE
    • 结果保存到文本中,可以后续处理。
代码实现

如何使用这些代码

  1. 准备数据

    • 确保你的数据集格式正确(例如CSV文件),并且包含特征列和目标列。
    • 示例数据data.csv的结构如下:
      timestamp,feature1,feature2,target 2023-01-01 00:00:00,0.1,0.2,3.4 2023-01-01 00:01:00,0.5,0.6,7.8 ...
  2. 替换数据路径

    • load_data函数中,将'data.csv'替换为你的数据文件路径。
    file_path='your_data_file.csv'
  3. 调整窗口大小和预测步数

    • 根据你的需求调整window_sizehorizon参数。
    window_size=20# 更改窗口大小horizon=5# 更改预测步数
  4. 运行代码

    • 将上述代码复制到你的Python脚本中,并运行该脚本。
    • 确保你已经安装了所需的库:
      pipinstallpandas numpy scikit-learn torch matplotlib

示例:使用自定义数据集

假设你有一个新的数据集new_data.csv,其内容如下:

timestamp,feature1,feature2,target 2023-01-01 00:00:00,0.1,0.2,3.4 2023-01-01 00:01:00,0.5,0.6,7.8 ...

你可以按照以下步骤进行替换:

  1. 修改数据路径

    file_path='new_data.csv'
  2. 调整窗口大小和预测步数

    window_size=20# 更改窗口大小horizon=5# 更改预测步数
  3. 运行完整的代码

    • 将所有代码整合到一个Python脚本中,并运行该脚本。

注释说明

代码中包含了详细的注释,帮助你理解每个部分的功能。以下是关键部分的注释:

  • 数据加载与预处理

    • load_data: 加载数据并进行标准化,创建滑动窗口。
  • 模型组件

    • PositionalEncoding: 添加位置编码,帮助模型理解序列的位置信息。
    • DataEmbedding: 结合值嵌入和位置嵌入。
    • TransformerModel: 实现Transformer Encoder-Decoder架构。
    • InformerModel: 实现Informer架构,结合自注意力机制和局部特征提取。
  • 训练和评估模型

    • train_and_evaluate: 训练模型并计算评价指标,保存结果并可视化。

结果

运行代码后,你将得到以下结果:

  1. 控制台输出

    • 每个epoch的损失值。
    • 测试集上的评价指标(R², RMSE, MAE, MAPE)。
  2. 文件输出

    • results.txt: 包含测试集上的评价指标。
  3. 图像输出

    • prediction_vs_actual.png: 实际值与预测值的对比图。

希望这些详细的信息和代码能够帮助你顺利实施和优化你的项目。如果你有任何进一步的问题或需要更多帮助,请随时提问!

默认选择 Transformer Encoder-Decoder 模型

默认情况下,我们将使用Transformer Encoder-Decoder模型。如果你更倾向于使用Informer模型,只需切换到相应的代码块即可。

运行默认的 Transformer Encoder-Decoder 模型

确保你已经安装了所需的库:

pipinstallpandas numpy scikit-learn torch matplotlib

然后运行以下命令来执行Transformer Encoder-Decoder模型:

python transformer_encoder_decoder.py

其中transformer_encoder_decoder.py是包含上述Transformer Encoder-Decoder模型代码的文件。

运行 Informer 模型

同样地,确保你已经安装了所需的库,然后运行以下命令来执行Informer模型:

python informer.py

其中informer.py是包含上述Informer模型代码的文件。

希望这些详细的指导和代码示例能帮助你成功实现和优化你的时间序列预测项目。如果有任何问题或需要进一步的帮助,请随时告诉我!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/28 19:39:02

5分钟掌握RevokeMsgPatcher:终极微信/QQ/TIM防撤回工具完整指南

5分钟掌握RevokeMsgPatcher:终极微信/QQ/TIM防撤回工具完整指南 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用了) 项目地址: https://g…

作者头像 李华
网站建设 2026/5/28 19:32:59

Arduino与Tinkercad入门:15个仿真项目掌握嵌入式开发核心

1. 项目概述与核心价值如果你对电子制作、智能硬件或者物联网感兴趣,但一看到电路板、代码和一堆五颜六色的线就头疼,觉得门槛太高,那今天这篇分享就是为你准备的。我干了十多年嵌入式开发,带过无数新手入门,深知最大的…

作者头像 李华
网站建设 2026/5/28 19:29:08

Falcon2-5.5B-Polish核心技术解析:从Falcon-11B到5.5B的智能剪枝策略

Falcon2-5.5B-Polish核心技术解析:从Falcon-11B到5.5B的智能剪枝策略 【免费下载链接】Falcon2-5.5B-Polish 项目地址: https://ai.gitcode.com/hf_mirrors/Jinan_AICC/Falcon2-5.5B-Polish Falcon2-5.5B-Polish是一个基于Falcon-11B进行智能剪枝优化的大语…

作者头像 李华
网站建设 2026/5/28 19:29:07

Java RPG Maker MV/MZ 解密器:专业游戏资源解密工具深度解析

Java RPG Maker MV/MZ 解密器:专业游戏资源解密工具深度解析 【免费下载链接】Java-RPG-Maker-MV-Decrypter You can decrypt whole RPG-Maker MV Directories with this Program, it also has a GUI. 项目地址: https://gitcode.com/gh_mirrors/ja/Java-RPG-Make…

作者头像 李华
网站建设 2026/5/28 19:27:49

【实机飞行!】在Jetson Orin NX上部署Fast-Drone-250进行实机飞行

原本的Fast-Drone-250项目是基于x86平台实现的。将其迁移到Jetson orin nx上面临着两个问题,一是arm架构与x86架构的代码兼容性问题,二是nx的cpu算力不足,需要部署vins-gpu。 本文Jetson orin nx使用的是jetpack 5.1.4,Ubuntu20.…

作者头像 李华