ShopTRAINING/docs/模型类型/optimized_kan_forecaster.md
gdtiti c0fe213b70 修复图表显示和数据处理问题
1. 修复前端图表日期排序问题:
   - 改进 PredictionView.vue 和 HistoryView.vue 中的图表渲染逻辑
   - 确保历史数据和预测数据按照正确的日期顺序显示

2. 修复后端API处理:
   - 解决 optimized_kan 模型类型的路径映射问题
   - 添加 JSON 序列化器处理 Pandas Timestamp 对象
   - 改进预测数据与历史数据的衔接处理

3. 优化图表样式和用户体验
2025-06-15 00:01:57 +08:00

8.4 KiB
Raw Permalink Blame History

优化版KAN模型使用指南

1. 简介

优化版Kolmogorov-Arnold网络(OptimizedKAN)是一种内存高效的非线性时间序列预测模型,基于柯尔莫哥洛夫-阿诺尔德定理实现。该模型通过B样条基函数自适应学习复杂的非线性关系特别适合捕捉药店销售数据中的复杂模式和季节性变化。

与原始KAN模型相比优化版本显著降低了内存占用并提高了训练速度同时保持或提升了预测精度。本指南将介绍如何在药店销售预测系统中有效使用优化版KAN模型。

2. 模型架构

优化版KAN模型由三个主要组件组成

  1. OptimizedKANLinear: 核心计算单元实现B样条基函数和线性变换
  2. OptimizedKAN: 中间层组织多个OptimizedKANLinear层
  3. OptimizedKANForecaster: 顶层模型,用于时间序列预测

模型的基本工作流程:

  • 输入时间序列数据经过输入投影层
  • 投影后的数据通过OptimizedKAN网络处理
  • 最后通过输出层生成预测结果

3. 使用方法

3.1 通过命令行界面使用

最简单的使用方式是通过系统提供的命令行界面:

  1. 运行主程序:

    python run_pharmacy_prediction.py
    
  2. 选择以下选项之一:

    • 选项5: 训练单个药品的销售预测模型 (优化版KAN)
    • 选项6: 比较原始KAN和优化版KAN模型性能
  3. 按照提示输入相关参数如产品ID、训练轮数、批次大小等

3.2 通过API直接使用

如果需要在自己的代码中使用优化版KAN模型可以按照以下方式

from models.optimized_kan_forecaster import OptimizedKANForecaster
from pharmacy_predictor import PharmacyPredictor

# 创建预测器实例
predictor = PharmacyPredictor()

# 方法1: 使用专用方法训练优化版KAN模型
metrics = predictor.train_optimized_kan_model(
    product_id='P001',
    epochs=100,
    batch_size=32,
    learning_rate=0.001,
    sequence_length=30,
    forecast_horizon=7,
    hidden_size=64,
    num_layers=2,
    dropout=0.1
)

# 方法2: 使用通用方法训练优化版KAN模型
metrics = predictor.train_model(
    product_id='P001',
    model_type='kan',
    epochs=100,
    batch_size=32,
    learning_rate=0.001,
    sequence_length=30,
    forecast_horizon=7,
    hidden_size=64,
    num_layers=2,
    dropout=0.1,
    use_optimized=True  # 指定使用优化版KAN
)

# 比较原始KAN和优化版KAN模型性能
comparison = predictor.compare_kan_models(
    product_id='P001',
    epochs=100,
    batch_size=32,
    learning_rate=0.001,
    sequence_length=30,
    forecast_horizon=7,
    hidden_size=64,
    num_layers=2,
    dropout=0.1
)

3.3 直接实例化模型

如果需要更灵活地控制模型可以直接实例化OptimizedKANForecaster

import torch
from models.optimized_kan_forecaster import OptimizedKANForecaster

# 创建模型实例
model = OptimizedKANForecaster(
    input_features=8,  # 输入特征数量
    hidden_sizes=[64, 128, 64],  # 隐藏层大小
    output_sequence_length=7,  # 预测天数
    grid_size=5,  # 网格大小
    spline_order=3,  # 样条阶数
    dropout_rate=0.1,  # Dropout比例
    scale_noise=0.1,  # 噪声缩放
    scale_base=1.0,  # 基础权重缩放
    scale_spline=1.0,  # 样条权重缩放
    base_activation=torch.nn.SiLU,  # 基础激活函数
    grid_eps=0.02,  # 网格更新参数
    grid_range=[-1, 1]  # 网格范围
)

# 使用模型进行预测
with torch.no_grad():
    outputs = model(inputs)

4. 参数调优指南

优化版KAN模型有多个参数可以调整以下是一些关键参数的调优建议

4.1 模型结构参数

  • hidden_sizes: 隐藏层大小,通常使用金字塔结构,如[64, 128, 64]

    • 对于简单任务,可以使用更小的隐藏层,如[32, 64, 32]
    • 对于复杂任务,可以使用更大的隐藏层,如[128, 256, 128]
  • grid_size: 网格大小控制B样条基函数的复杂度

    • 默认值为5通常在3-10之间调整
    • 较大的值可以捕捉更复杂的模式,但可能导致过拟合
  • spline_order: 样条阶数控制B样条基函数的平滑度

    • 默认值为3通常在2-5之间调整
    • 较高的阶数可以产生更平滑的函数,但计算成本更高

4.2 训练参数

  • batch_size: 批次大小通常在16-128之间

    • 较大的批次可以加速训练,但可能需要更多内存
    • 优化版KAN可以处理更大的批次而不会耗尽内存
  • learning_rate: 学习率通常在0.0001-0.01之间

    • 建议从0.001开始,根据训练曲线调整
    • 如果损失不稳定,可以降低学习率
  • sequence_length: 输入序列长度通常在7-60之间

    • 较长的序列可以捕捉更长期的依赖关系
    • 优化版KAN可以处理更长的序列而不会导致内存问题

4.3 正则化参数

  • dropout_rate: Dropout比例通常在0.1-0.5之间

    • 较高的值可以减少过拟合,但可能影响模型性能
  • scale_noise, scale_base, scale_spline: 权重缩放参数

    • 这些参数控制初始化时的权重分布
    • 通常不需要调整,除非遇到训练不稳定的情况

5. 最佳实践

5.1 数据预处理

  • 标准化: 确保所有特征都经过标准化处理使均值为0标准差为1
  • 缺失值处理: 在训练前处理所有缺失值,可以使用插值或前向填充
  • 异常值处理: 检测并处理异常值,可以使用截断或分位数标准化

5.2 模型训练

  • 早停: 使用早停策略避免过拟合通常设置patience=10
  • 学习率调度: 考虑使用学习率衰减策略如ReduceLROnPlateau
  • 网格更新: 在训练初期启用网格更新,然后禁用以加速训练
  • 正则化损失: 适当调整正则化损失的权重通常在0.01-0.1之间

5.3 模型评估

  • 多指标评估: 不要仅依赖单一指标综合考虑MSE、RMSE、MAE、R²和MAPE
  • 可视化预测: 绘制预测结果与实际值的对比图,检查模型是否捕捉到趋势和季节性
  • 交叉验证: 对于关键应用,考虑使用时间序列交叉验证

5.4 内存优化

  • 批次大小: 根据可用内存调整批次大小
  • 梯度累积: 如果内存仍然不足,可以考虑使用梯度累积技术
  • 混合精度训练: 对于支持的硬件,可以使用混合精度训练进一步减少内存使用

6. 常见问题解答

Q1: 优化版KAN模型与原始KAN模型的预测结果有差异这正常吗

A1: 是的,这是正常的。虽然两种实现在理论上应该产生相同的结果,但由于数值计算的差异和随机初始化,可能会有轻微的差异。通常这些差异很小,不会显著影响预测性能。

Q2: 如何选择合适的序列长度?

A2: 序列长度应该基于数据的特性和预测任务。对于药店销售数据,可以考虑以下因素:

  • 周期性:如果数据有明显的周期性(如每周模式),序列长度应至少覆盖一个完整周期
  • 季节性:如果数据有季节性,序列长度应足够长以捕捉季节模式
  • 一般建议对于日销售数据可以从30天开始然后根据性能调整

Q3: 优化版KAN模型训练速度仍然较慢如何进一步加速

A3: 可以尝试以下方法:

  • 减小网格大小(grid_size)和样条阶数(spline_order)
  • 使用更小的隐藏层大小
  • 启用GPU加速如果可用
  • 减少训练轮数,配合早停策略
  • 对于大型数据集,考虑使用数据采样

Q4: 模型出现过拟合,如何解决?

A4: 可以尝试以下方法:

  • 增加dropout_rate如0.2-0.5
  • 减小模型复杂度(减少隐藏层大小或层数)
  • 增加正则化损失的权重
  • 使用更多的训练数据
  • 添加数据增强技术

Q5: 如何处理多变量时间序列预测?

A5: 优化版KAN模型原生支持多变量输入。确保所有相关特征都包含在输入中并且所有特征都经过适当的标准化处理。

7. 结论

优化版KAN模型是一种强大且内存高效的时间序列预测工具特别适合药店销售预测这类复杂的非线性预测任务。通过适当的参数调整和最佳实践可以充分发挥模型的潜力获得高精度的预测结果同时保持较低的计算资源消耗。

对于大规模数据集和资源受限的环境优化版KAN模型是理想的选择。通过本指南提供的使用方法和最佳实践用户可以有效地应用优化版KAN模型解决实际问题。