Crossformer预测模型,可以预测未来值!!!

Crossformer是2023年提出的模型,相对较新,还是可以水论文的。它不仅考虑了时间序列,还考虑了变量之间的跨维度依赖关系。Crossformer 的输入使用 Dimension-Segment-Wise (DSW) 嵌入到 2d 数组中,然后使用两阶段注意力层进行处理,该关注层据称可以捕获跨时间和跨维度依赖关系。在跨时间阶段,将多头自我注意 (MSA) 应用于每个维度,然后使用 MLP 来捕获每个维度中不同细分之间的依赖关系。在跨维度阶段,由于直接将 MSA 应用于高维数据集的成本不高,论文建议使用 router 机制将来自各个维度的消息聚合到一个低维空间中。然后,为了建立全对多连接,聚合的消息被视为键和值,维度向量被视为查询。最后,论文使用分层编码器-解码器结构在不同尺度上使用提取的信息。


下面将给出部分原代码,模型可以对未知的未来值进行预测!!!!目前的论文均未对未来值进行预测,仅仅只是基于测试集进行预测,属于“伪预测”,本人基于开源的crossformer模型代码对其进行了修改,使其更加容易理解,并且添加了对未来值的预测部分,可以对未来值进行指定长度的预测!!!!!

import numpy as np``import torch``import torch.nn as nn``from torch import optim``from torch.utils.data import DataLoader, Dataset``import matplotlib.pyplot as plt``import warnings``import pandas as pd``from sklearn.preprocessing import StandardScaler``from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score, mean_absolute_percentage_error``import math``from cross_models.cross_former import Crossformer``from tqdm import tqdm`  `warnings.filterwarnings('ignore')``# 配置参数``device = torch.device("cuda" if torch.cuda.is_available() else "cpu")``in_len = 96``out_len = 1` `epochs = 10``   ``df_raw = pd.read_excel('多变量.xlsx') #excel用这行``target_var = 'canopy'  #确定你需要预测的列名``col_ = df_raw.pop(target_var)``df_raw.insert(1, target_var, col_)``   ``plt.figure(figsize=(12, 4), dpi=600)``plt.plot(df_raw[target_var])``# 显示图表``plt.show()``   ``# 数据集的划分(70%训练集, 10%验证集, 20%测试集)``total_len = len(df_raw)``train_num = int(total_len * 0.7)``val_num = int(total_len * 0.1)``test_num = total_len - train_num - val_num``   ``cols_data = df_raw.columns[1:]``df_data = df_raw[cols_data]``# 数据归一化处理``scaler = StandardScaler()``train_data = df_data[train_border1:train_border2]``scaler.fit(train_data.values)``data = scaler.transform(df_data.values)``# 分别定义训练集、验证集和测试集``train_data_x = data[train_border1:train_border2]``train_data_y = data[train_border1:train_border2]``   ``val_data_x = data[val_border1:val_border2]``val_data_y = data[val_border1:val_border2]``   ``test_data_x = data[test_border1:test_border2]``test_data_y = data[test_border1:test_border2]``# 创建 DataLoader 实例``batch_size = 32  # 设置批量大小``train_loader = DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True)``val_loader = DataLoader(dataset=val_dataset, batch_size=batch_size, shuffle=False)``test_loader = DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=False)``   ``model = Crossformer(`        `data_dim=df_raw.shape[1]-1,``         in_len=in_len,  ``        out_len=out_len,`        `seg_len=8,`        `win_size=3,`        `factor=5,`        `d_model=64,``        d_ff=256,`        `n_heads=8,``        e_layers=2,`        `dropout=0.1,``        baseline=False,`        `device=device`    `).float().to(device)``criterion = nn.MSELoss()``optimizer = optim.Adam(model.parameters(), lr=0.001, weight_decay=1e-3)``# 验证``def validate(model, vali_loader, criterion):`    `model.eval()`    `total_loss = []`    `with torch.no_grad():`        `for batch_x, batch_y in vali_loader:`            `pred, true = process_one_batch(model, batch_x, batch_y)`            `loss = criterion(pred.detach().cpu(), true.detach().cpu())`            `total_loss.append(loss.item())`    `model.train()`    `return np.average(total_loss)``   ``for epoch in range(epochs):`    `train_loss = []`    `model.train()`    `for batch_x, batch_y in tqdm(train_loader, desc=f"Epoch {epoch + 1}/{epochs} Training"):`        `optimizer.zero_grad()`        `pred, true = process_one_batch(model, batch_x, batch_y)  # 处理一个批次的数据`        `loss = criterion(pred, true)  # 计算损失`        `train_loss.append(loss.item())`        `loss.backward()  # 反向传播`        `optimizer.step()  # 更新模型参数`    `# 验证`    `vali_loss = validate(model, val_loader, criterion)  # 使用 val_loader 进行验证`    `print(f"Epoch: {epoch + 1} | Train Loss: {np.average(train_loss):.7f} Vali Loss: {vali_loss:.7f}")``# 测试``model.eval()``preds, trues = [], []``with torch.no_grad():`    `for batch_x, batch_y in tqdm(test_loader, desc="Testing"):  # 使用 test_loader 进行测试`        `pred, true = process_one_batch(model, batch_x, batch_y)`        `preds.append(pred.detach().cpu().numpy())`        `trues.append(true.detach().cpu().numpy())``   ``preds = np.concatenate(preds, axis=0)``trues = np.concatenate(trues, axis=0)``   ``plt.rcParams['font.sans-serif'] = ['SimHei']``plt.figure(figsize=(12, 4), dpi=600)``plt.plot(trues[:, out_len-1, 0], label='真实值', color='blue')``for i in range(out_len):`    `plt.plot(preds[:, i, 0], label=f'Step {i+1} Prediction')``plt.title('真实值 vs 预测值')``plt.xlabel('样本序号')``plt.ylabel('目标值')``plt.legend()``plt.show()``   ``metrics = []``for i in range(out_len):`    `r2 = r2_score(trues[:, i, 0], preds[:, i, 0])`    `rmse = math.sqrt(mean_squared_error(trues[:, i, 0], preds[:, i, 0]))`    `mae = mean_absolute_error(trues[:, i, 0], preds[:, i, 0])`    `mape = mean_absolute_percentage_error(trues[:, i, 0], preds[:, i, 0])`    `metrics.append([i + 1, rmse, mae, r2, mape])`    `print(f'Step {i+1} - RMSE: {rmse}, MAE: {mae}, R2: {r2}, MAPE: {mape}')``# 使用预测函数``future_steps = 300  # 设定你希望预测的未来步骤数``predictions = predict_future(model, data, in_len, out_len, future_steps, scaler)``   ``preds_reshaped = preds.reshape(preds.shape[0], preds.shape[2])``preds_df = pd.DataFrame(preds_reshaped)``trues_reshaped = trues.reshape(trues.shape[0], trues.shape[2])``trues_df = pd.DataFrame(trues_reshaped)``#在预测对比图中绘制未来值``plt.figure(figsize=(12, 4), dpi=600)``for i in range(out_len):`    `predicted_plot = preds_df.iloc[:, i]`    `plt.plot(predicted_plot, label=f'Step {i+1}')`    `data_index = predicted_plot.index[-1] + 1 + pd.DataFrame(predictions[:, 0, 0]).index`    `plt.plot(data_index, pd.DataFrame(predictions[:, 0, 0]), linestyle='-', color='k', label='future')``   ``actual_plot = trues_df.iloc[:, out_len-1]``plt.plot(actual_plot, label='Actual')``plt.xlabel('Time')``plt.ylabel('data')``plt.legend()``plt.show()

模型使用的示例数据如下:

对其进行预测时得出的4个指标如下:

需要多步预测的可以自行设置参数“out_len ”。

此外,还使用模型对示例数据未来的300个数据就行了预测,效果如下:

模型可以对数据进行基本的趋势进行预测!!!!!

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费

在这里插入图片描述

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值