280 lines
7.6 KiB
Markdown
280 lines
7.6 KiB
Markdown
# 药店销售预测系统 - 模型管理规则
|
|
|
|
## 📋 统一模型命名规范
|
|
|
|
### 文件名格式
|
|
|
|
#### 1. 产品训练模式 (Product Mode)
|
|
```
|
|
{model_type}_product_{product_id}_{version}.pth
|
|
```
|
|
**示例:**
|
|
- `tcn_product_P001_v1.pth`
|
|
- `mlstm_product_P002_v2.pth`
|
|
- `kan_product_P001_v1.pth`
|
|
- `transformer_product_P001_v1.pth`
|
|
|
|
#### 2. 店铺训练模式 (Store Mode)
|
|
```
|
|
{model_type}_store_{store_id}_{product_id}_{version}.pth
|
|
```
|
|
**示例:**
|
|
- `tcn_store_S001_P001_v1.pth`
|
|
- `mlstm_store_S002_P001_v1.pth`
|
|
- `kan_store_S001_P002_v2.pth`
|
|
|
|
#### 3. 全局训练模式 (Global Mode)
|
|
```
|
|
{model_type}_global_{product_id}_{aggregation_method}_{version}.pth
|
|
```
|
|
**示例:**
|
|
- `tcn_global_P001_sum_v1.pth`
|
|
- `mlstm_global_P001_mean_v1.pth`
|
|
- `transformer_global_P002_weighted_v1.pth`
|
|
|
|
### 模型类型标识符
|
|
|
|
| 模型类型 | 标识符 | 说明 |
|
|
|---------|-------|------|
|
|
| TCN | `tcn` | 时间卷积网络 |
|
|
| mLSTM | `mlstm` | 多层长短期记忆网络 |
|
|
| KAN | `kan` | Kolmogorov-Arnold网络 |
|
|
| 优化KAN | `optimized_kan` | 优化版KAN网络 |
|
|
| Transformer | `transformer` | 注意力机制模型 |
|
|
|
|
### 聚合方法标识符
|
|
|
|
| 聚合方法 | 标识符 | 说明 |
|
|
|---------|-------|------|
|
|
| 求和 | `sum` | 所有店铺销量求和 |
|
|
| 平均 | `mean` | 所有店铺销量平均值 |
|
|
| 加权平均 | `weighted` | 基于店铺规模的加权平均 |
|
|
| 最大值 | `max` | 取各店铺最大销量 |
|
|
|
|
## 📁 目录结构
|
|
|
|
```
|
|
项目根目录/
|
|
├── saved_models/ # 统一模型存储目录
|
|
│ ├── tcn_product_P001_v1.pth # 产品模式模型
|
|
│ ├── tcn_store_S001_P001_v1.pth # 店铺模式模型
|
|
│ ├── tcn_global_P001_sum_v1.pth # 全局模式模型
|
|
│ └── ... # 其他模型文件
|
|
├── server/
|
|
│ └── utils/
|
|
│ └── model_manager.py # 统一模型管理器
|
|
└── ...
|
|
```
|
|
|
|
## 📦 模型文件内容结构
|
|
|
|
每个模型文件包含以下标准化内容:
|
|
|
|
```python
|
|
{
|
|
# 模型状态
|
|
'model_state_dict': {...}, # PyTorch模型参数
|
|
|
|
# 数据预处理器
|
|
'scaler_X': MinMaxScaler(...), # 特征缩放器
|
|
'scaler_y': MinMaxScaler(...), # 目标变量缩放器
|
|
|
|
# 模型配置
|
|
'config': {
|
|
'model_type': 'tcn', # 模型类型
|
|
'input_dim': 8, # 输入特征维度
|
|
'output_dim': 7, # 输出维度
|
|
'sequence_length': 30, # 输入序列长度
|
|
'forecast_horizon': 7, # 预测时间窗口
|
|
'hidden_size': 64, # 隐藏层大小
|
|
# ... 其他模型特定参数
|
|
},
|
|
|
|
# 评估指标
|
|
'metrics': {
|
|
'mse': 150.0, # 均方误差
|
|
'rmse': 12.25, # 均方根误差
|
|
'mae': 9.5, # 平均绝对误差
|
|
'r2': 0.85, # 决定系数
|
|
'mape': 15.2, # 平均绝对百分比误差
|
|
'training_time': 45.6 # 训练时间(秒)
|
|
},
|
|
|
|
# 训练历史
|
|
'loss_history': {
|
|
'train': [0.8, 0.6, 0.4, ...], # 训练损失历史
|
|
'test': [0.9, 0.7, 0.5, ...], # 测试损失历史
|
|
'epochs': [1, 2, 3, ...] # 轮次
|
|
},
|
|
|
|
# 管理信息
|
|
'model_manager_info': {
|
|
'product_id': 'P001', # 产品ID
|
|
'product_name': '感冒灵颗粒', # 产品名称
|
|
'model_type': 'tcn', # 模型类型
|
|
'version': 'v1', # 版本号
|
|
'store_id': 'S001', # 店铺ID (可选)
|
|
'training_mode': 'product', # 训练模式
|
|
'aggregation_method': 'sum', # 聚合方法 (可选)
|
|
'created_at': '2025-06-21T22:03:23.357844', # 创建时间
|
|
'filename': 'tcn_product_P001_v1.pth' # 文件名
|
|
},
|
|
|
|
# 其他信息
|
|
'loss_curve_path': 'saved_models/TCN_product_感冒灵颗粒_loss_curve.png' # 损失曲线图路径
|
|
}
|
|
```
|
|
|
|
## 🔧 模型管理器API
|
|
|
|
### 主要方法
|
|
|
|
#### 1. 保存模型
|
|
```python
|
|
model_path = model_manager.save_model(
|
|
model_data=model_data,
|
|
product_id='P001',
|
|
model_type='tcn',
|
|
version='v1',
|
|
store_id='S001', # 可选,店铺模式需要
|
|
training_mode='product', # 'product', 'store', 'global'
|
|
aggregation_method='sum', # 可选,全局模式需要
|
|
product_name='感冒灵颗粒'
|
|
)
|
|
```
|
|
|
|
#### 2. 列出模型
|
|
```python
|
|
# 列出所有模型
|
|
models = model_manager.list_models()
|
|
|
|
# 按条件过滤
|
|
models = model_manager.list_models(
|
|
product_id='P001', # 按产品过滤
|
|
model_type='tcn', # 按模型类型过滤
|
|
store_id='S001', # 按店铺过滤
|
|
training_mode='product' # 按训练模式过滤
|
|
)
|
|
```
|
|
|
|
#### 3. 解析文件名
|
|
```python
|
|
info = model_manager.parse_model_filename('tcn_product_P001_v1.pth')
|
|
# 返回:
|
|
# {
|
|
# 'model_type': 'tcn',
|
|
# 'product_id': 'P001',
|
|
# 'version': 'v1',
|
|
# 'training_mode': 'product',
|
|
# 'store_id': None,
|
|
# 'aggregation_method': None
|
|
# }
|
|
```
|
|
|
|
#### 4. 获取特定模型
|
|
```python
|
|
model = model_manager.get_model_by_id('tcn_product_P001_v1')
|
|
```
|
|
|
|
## 🚀 版本管理策略
|
|
|
|
### 版本号规则
|
|
- **v1**: 初始版本
|
|
- **v2, v3, ...**: 后续优化版本
|
|
- **自动递增**: 同一配置下重新训练自动生成新版本
|
|
|
|
### 版本冲突处理
|
|
- 相同产品、模型类型、训练模式的模型会自动生成新版本号
|
|
- 避免意外覆盖之前训练的模型
|
|
- 支持模型版本对比和回滚
|
|
|
|
## 📊 兼容性支持
|
|
|
|
### 支持的旧格式
|
|
系统可以解析和处理以下旧格式文件名:
|
|
- `transformer_model_product_P001_v1.pth`
|
|
- `P001_mlstm_v1_global_model.pt`
|
|
- `kan_optimized_model_product_P001.pth`
|
|
|
|
### 迁移策略
|
|
- 旧格式模型可以正常读取和使用
|
|
- 重新训练时会使用新的标准化命名
|
|
- 提供迁移工具将旧格式转换为新格式
|
|
|
|
## 🛠️ 使用示例
|
|
|
|
### 1. 训练并保存模型
|
|
```python
|
|
from core.predictor import PharmacyPredictor
|
|
|
|
predictor = PharmacyPredictor()
|
|
|
|
# 产品模式训练
|
|
metrics = predictor.train_model(
|
|
product_id='P001',
|
|
model_type='tcn',
|
|
epochs=50,
|
|
training_mode='product'
|
|
)
|
|
|
|
# 店铺模式训练
|
|
metrics = predictor.train_model(
|
|
product_id='P001',
|
|
model_type='mlstm',
|
|
epochs=50,
|
|
training_mode='store',
|
|
store_id='S001'
|
|
)
|
|
|
|
# 全局模式训练
|
|
metrics = predictor.train_model(
|
|
product_id='P001',
|
|
model_type='transformer',
|
|
epochs=50,
|
|
training_mode='global',
|
|
aggregation_method='sum'
|
|
)
|
|
```
|
|
|
|
### 2. 加载和预测
|
|
```python
|
|
from predictors.model_predictor import load_model_and_predict
|
|
|
|
# 使用特定模型进行预测
|
|
predictions = load_model_and_predict(
|
|
product_id='P001',
|
|
model_type='tcn',
|
|
training_mode='product',
|
|
store_id=None
|
|
)
|
|
```
|
|
|
|
## 📈 性能和监控
|
|
|
|
### 存储效率
|
|
- 统一目录避免文件分散
|
|
- 标准化命名便于查找和管理
|
|
- 支持大量模型文件的高效检索
|
|
|
|
### 元数据管理
|
|
- 每个模型包含完整的训练信息
|
|
- 支持模型性能对比和分析
|
|
- 便于模型版本管理和回滚
|
|
|
|
## 🔄 更新日志
|
|
|
|
### v2.1.0 (2025-06-21)
|
|
- ✅ 实现统一模型命名规范
|
|
- ✅ 创建标准化模型管理器
|
|
- ✅ 支持三种训练模式的文件名格式
|
|
- ✅ 添加完整的元数据管理
|
|
- ✅ 实现版本自动管理
|
|
- ✅ 提供向后兼容性支持
|
|
|
|
---
|
|
|
|
**注意事项:**
|
|
1. 所有新训练的模型都将使用新的命名规范
|
|
2. 旧格式模型仍可正常使用,但建议逐步迁移
|
|
3. 模型文件保存在项目根目录的 `saved_models/` 目录下
|
|
4. 删除模型时请确保相关损失曲线图片也被清理 |