当前位置: 首页 > news >正文

时序预测 | Pytorch实现CNN-KAN电力负荷时间序列预测模型

预测效果

在这里插入图片描述

代码功能

该代码实现了一个结合卷积神经网络(CNN)和Kolmogorov–Arnold网络(KAN)的混合模型(CNN-KAN),用于时间序列预测任务。核心功能包括:

  1. 数据加载与预处理:加载标准化后的训练集和测试集(时间序列数据)。
  2. 模型构建
    • CNN部分:提取时间序列的局部特征(使用1D卷积层和池化层)。
    • KAN部分:替代全连接层,通过样条基函数增强非线性拟合能力,提高预测精度。
  3. 模型训练与评估:使用MSE损失和Adam优化器训练模型,保存最佳模型参数,并在测试集上计算评估指标(MSE、RMSE、MAE、R²)。
  4. 结果可视化:绘制训练/测试损失曲线,并反归一化预测结果。

算法步骤

  1. 数据加载

    • 使用joblib加载预处理后的训练集(train_set, train_label)和测试集(test_set, test_label)。
    • 封装为DataLoader(批量大小=64)。
  2. 模型定义

    • KANLinear
      • 基础线性变换 + 样条基函数(B-splines)的非线性变换。
      • 支持动态网格更新和正则化损失计算。
    • CNN1DKANModel
      • 卷积块:多个Conv1d + ReLU + MaxPool1d层(参考VGG架构)。
      • 自适应平均池化:替代全连接层,减少参数量。
      • KAN输出层:生成最终预测结果。
  3. 模型训练

    • 损失函数:均方误差(MSELoss)。
    • 优化器:Adam(学习率=0.0003)。
    • 训练循环
      • 前向传播 → 计算损失 → 反向传播 → 参数更新。
      • 记录每个epoch的训练/测试MSE,保存最佳模型(最低测试MSE)。
  4. 模型评估

    • 加载最佳模型进行预测。
    • 计算指标:(模型拟合优度)、MSERMSEMAE
    • 反归一化预测结果(使用预训练的StandardScaler)。
  5. 可视化

    • 绘制训练/测试MSE随epoch的变化曲线。
    • 输出评估指标和反归一化后的结果。

技术路线

  1. 框架:PyTorch(模型构建、训练、评估)。
  2. 数据预处理:使用StandardScaler标准化数据(通过joblib保存/加载)。
  3. 模型架构
    • 特征提取:CNN(1D卷积层)捕获时间序列局部模式。
    • 非线性映射:KAN层替代传统全连接层,通过样条函数灵活拟合复杂关系。
  4. 评估指标sklearn计算MSE等。
  5. 可视化matplotlib绘制损失曲线。

关键参数设定

参数说明
batch_size64数据批量大小
epochs50训练轮数
learn_rate0.0003Adam优化器学习率
conv_archs((2, 32), (2, 64))CNN层配置(卷积层数×通道数)
grid_size5KAN样条网格大小
spline_order3样条多项式阶数
output_dim1预测输出维度(回归任务)

运行环境

  • Python库
    torch, joblib, numpy, pandas, sklearn, matplotlib
    
  • 硬件:支持CUDA的GPU(优先)或CPU(自动切换)。
  • 数据依赖
    • 预处理的训练/测试集文件(train_set, train_label等)。
    • 预训练的StandardScalerscaler文件)。

应用场景

  1. 时间序列预测
    • 如股票价格、气象数据、电力负荷等序列数据的未来值预测。
  2. 高非线性关系建模
    • KAN层通过样条基函数灵活拟合复杂非线性模式,优于传统全连接层。
  3. 轻量化模型需求
    • 自适应池化替代全连接层,减少参数量(模型总参数量:22,432)。
  4. 研究验证
    • 探索CNN与KAN结合的混合架构在预测任务中的有效性(最终R²=0.995,拟合优度高)。

补充说明

  • 创新点:KAN作为输出层,通过动态网格更新和正则化约束(L1 + 熵),增强模型表达能力。
  • 性能:50个epoch后测试集MSE=0.2627(反归一化后MSE=0.0041),预测精度高。
  • 扩展性:可通过调整卷积架构、KAN参数适配不同时间序列长度和复杂度。

完整代码

  • 完整代码订阅专栏获取
# 模型预测
# 模型 测试集 验证  
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")# 模型加载
model = torch.load('best_model_cnn_kan.pt')
model = model.to(device)# 预测数据
original_data = []
pre_data = []
with torch.no_grad():for data, label in test_loader:origin_lable = label.tolist()original_data += origin_lablemodel.eval()  # 将模型设置为评估模式data, label = data.to(device), label.to(device)# 预测test_pred = model(data)  # 对测试集进行预测test_pred = test_pred.tolist()pre_data += test_pred
[8]
import numpy as np
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score# 模型分数
score = r2_score(original_data, pre_data)
print('*'*50)
print('模型分数--R^2:',score)print('*'*50)
# 测试集上的预测误差
test_mse = mean_squared_error(original_data, pre_data)
test_rmse = np.sqrt(test_mse)
test_mae = mean_absolute_error(original_data, pre_data)
print('测试数据集上的均方误差--MSE: ',test_mse)
print('测试数据集上的均方根误差--RMSE: ',test_rmse)
print('测试数据集上的平均绝对误差--MAE: ',test_mae)
**************************************************
模型分数--R^2: 0.9954956071920047
**************************************************
测试数据集上的均方误差--MSE:  0.004104453060426307
测试数据集上的均方根误差--RMSE:  0.06406600549766082
测试数据集上的平均绝对误差--MAE:  0.047805079976603375[19]
from sklearn.preprocessing import StandardScaler, MinMaxScaler# 将列表转换为 NumPy 数组
original_data = np.array(original_data)
pre_data = np.array(pre_data)# 反归一化处理
# 使用相同的均值和标准差对预测结果进行反归一化处理
# 反标准化
scaler  = load('scaler')
original_data = scaler.inverse_transform(original_data)
pre_data = scaler.inverse_transform(pre_data)
[20]
# 可视化结果
plt.figure(figsize=(12, 6), dpi=100)
plt.plot(original_data, label='原始值',color='orange')  # 真实值
plt.plot(pre_data, label='CNN-KAN预测值',color='green')  # 预测值
plt.legend()
plt.show()
http://www.dtcms.com/a/277616.html

相关文章:

  • day16~17-系统负载高故障与磁盘管理
  • 【开源项目】拆解机器学习全流程:一份GitHub手册的工程实践指南
  • Dubbo-Admin 安装与使用指南:可视化管理 Dubbo 服务
  • 基于 SpringBoot 的 REST API 与 RPC 调用的统一封装
  • Linux操作系统之信号概念启程
  • Scrapy Spider深度解析:从基础到高级应用实战
  • 基于MATLAB的Lasso回归的数据回归预测方法应用
  • 【论文阅读】AdaptThink: Reasoning Models Can Learn When to Think
  • muduo概述
  • DVWA CSRF漏洞分析与利用
  • Leaflet面试题及答案(61-80)
  • 梯度下降算法:像下山一样找到最优解
  • opencv4.12 vs2022 cmake contrib编译
  • (一)SAP GROUP REPORTING(集团报表)集团财务合并解决方案套件
  • ERA5的UV合并成矢量并按时间维度转为nc或tif
  • Excalidraw:一款颠覆传统思维的免费开源绘图工具
  • 28.安卓逆向2-frida hook技术-逆向os文件(一)
  • 零基础完全理解视觉语言模型(VLM):从理论到代码实践
  • TASK2 夏令营:用AI做带货视频评论分析
  • 【算法】递归、搜索与回溯
  • docker运行redis指定配置+jdk17安装在centos7
  • sklearn study notes[1]
  • uView UI 组件大全
  • spring-ai-alibaba 1.0.0.2 学习(十六)——多模态
  • Python 的 MRO
  • JDBC相关知识点
  • 查看ubuntu磁盘占用方法
  • Prometheus Operator:Kubernetes 监控自动化实践
  • 对测试左移的一些总结和思考
  • Python 数据挖掘实战概述