ShopTRAINING/xz模型添加流程.md
xz2000 87df49f764 添加训练算法模拟xgboosT,训练可以完成,预测读取还有问题
数据文件保存机构改为### 1.2. 文件存储位置

-   **最终产物**: 所有最终模型、元数据文件、损失图等,统一存放在 `saved_models/` 根目录下。
-   **过程文件**: 所有训练过程中的检查点文件,统一存放在 `saved_models/checkpoints/` 目录下。

### 1.3. 文件名生成规则

1.  **构建逻辑路径**: 根据训练参数(模式、范围、类型、版本)确定逻辑路径。
    -   *示例*: `product/P001_all/mlstm/v2`

2.  **生成文件名前缀**: 将逻辑路径中的所有 `/` 替换为 `_`。
    -   *示例*: `product_P001_all_mlstm_v2`

3.  **拼接文件后缀**: 在前缀后加上描述文件类型的后缀。
    -   `_model.pth`
    -   `_loss_curve.png`
    -   `_checkpoint_best.pth`
    -   `_checkpoint_epoch_{N}.pth`

#### **完整示例:**

-   **最终模型**: `saved_models/product_P001_all_mlstm_v2_model.pth`
-   **最佳检查点**: `saved_models/checkpoints/product_P001_all_mlstm_v2_checkpoint_best.pth`
-   **Epoch 50 检查点**: `saved_models/checkpoints/product_P001_all_mlstm_v2_checkpoint_epoch_50.pth`
2025-07-21 18:47:27 +08:00

61 lines
4.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 为系统添加新模型的标准流程
本文档总结了向本项目中添加一个新的预测模型以XGBoost为例的标准流程旨在为未来的开发工作提供清晰、可复用的路线图。
---
### 第1步创建模型训练器
这是最核心的一步,负责实现新模型的训练逻辑。
1. **创建新文件**:在 [`server/trainers/`](server/trainers/) 目录下创建一个新的Python文件例如 `new_model_trainer.py`
2. **定义训练函数**:在该文件中,定义一个核心的训练函数,遵循项目的标准签名,接收 `product_id`, `store_id`, `epochs`, `path_info` 等参数。
3. **实现函数内部逻辑**
* **数据加载**:使用 [`utils.multi_store_data_utils.load_multi_store_data`](server/utils/multi_store_data_utils.py) 加载数据,并根据 `product_id``store_id` 进行筛选。
* **数据预处理**将时间序列数据转换为监督学习格式。对于像XGBoost这样的模型这意味着创建一个“滑动窗口”如我们实现的 `create_dataset` 函数)。
* **数据缩放 (关键)****必须**使用 `sklearn.preprocessing.MinMaxScaler` 对特征 (`X`) 和目标 (`y`) 进行归一化。创建并训练 `scaler_X``scaler_y` 两个缩放器。
* **模型训练**:初始化您的新模型,并使用**归一化后**的数据进行训练。
* **生成损失曲线 (可选但推荐)**:如果模型支持,在训练过程中捕获训练集和验证集的损失,然后使用 `matplotlib` 绘制损失曲线图,并将其保存为 `..._loss_curve.png`
* **保存检查点 (可选但推荐)**如果模型支持回调Callbacks可以实现一个自定义回调函数用于按指定轮次间隔保存模型检查点 (`..._checkpoint_epoch_{N}.pth`)。
* **模型评估**:使用**反归一化后**的预测结果来计算评估指标RMSE, R2等
* **模型保存 (关键)**
* 创建一个字典payload**必须**包含以下内容:`'model'` (训练好的模型对象), `'config'` (训练配置), `'scaler_X'` (特征缩放器), 和 `'scaler_y'` (目标缩放器)。
* 使用正确的库PyTorch模型用 `torch.save`其他模型如XGBoost用 `joblib.dump`)将这个字典保存到 `path_info['model_path']` 指定的路径。**文件名统一使用 `.pth` 扩展名**。
---
### 第2步将训练器集成到系统中
1. **注册训练器**:打开 [`server/trainers/__init__.py`](server/trainers/__init__.py)。
* 在文件顶部,从您的新训练器文件中导入训练函数,例如 `from .new_model_trainer import train_product_model_with_new_model`
* 在文件底部的 `__all__` 列表中,添加您的新训练函数名。
2. **添加调度逻辑**:打开 [`server/core/predictor.py`](server/core/predictor.py)。
*`train_model` 方法中,找到 `if/elif` 逻辑块,为您的新模型添加一个新的 `elif model_type == 'new_model':` 分支,并在此分支中调用您的新训练函数。
---
### 第3步实现预测逻辑
1. **修改预测器**:打开 [`server/predictors/model_predictor.py`](server/predictors/model_predictor.py)。
2. **添加预测分支**:在 `load_model_and_predict` 函数中,找到 `if/elif` 逻辑块,为您的新模型添加一个新的 `elif model_type == 'new_model':` 分支。
3. **实现分支内部逻辑**
* 使用与保存时相同的库(例如 `joblib.load`)加载 `.pth` 模型文件。
* 从加载的字典中,**必须**提取出 `model`, `config`, `scaler_X`, 和 `scaler_y`
* 准备用于预测的输入数据例如最近N天的数据
* 在进行预测时,**必须**先用 `scaler_X.transform` 对输入数据进行归一化。
* 得到模型的预测结果后,**必须**用 `scaler_y.inverse_transform` 将结果反归一化,以得到真实的预测值。
---
### 第4步更新API和依赖项
1. **更新API端点**:打开 [`server/api.py`](server/api.py)。
*`/api/training` 路由(`start_training` 函数)的 `valid_model_types` 列表中添加您的新模型ID例如 `'new_model'`)。
*`/api/model_types` 路由(`get_model_types` 函数)返回的列表中,添加您新模型的描述信息,以便它能显示在前端界面。
2. **更新依赖**:打开 [`requirements.txt`](requirements.txt) 文件添加您的新模型所需要的Python库例如 `xgboost`)。
遵循以上四个步骤,您就可以将任何新的预测模型一致、健壮地集成到现有系统中。