
1. 修复前端图表日期排序问题: - 改进 PredictionView.vue 和 HistoryView.vue 中的图表渲染逻辑 - 确保历史数据和预测数据按照正确的日期顺序显示 2. 修复后端API处理: - 解决 optimized_kan 模型类型的路径映射问题 - 添加 JSON 序列化器处理 Pandas Timestamp 对象 - 改进预测数据与历史数据的衔接处理 3. 优化图表样式和用户体验
262 lines
8.0 KiB
Markdown
262 lines
8.0 KiB
Markdown
# 🔄 多模型互补策略在药店销售预测中的应用指南
|
||
|
||
## 📋 多模型互补的价值
|
||
|
||
在药店销售预测系统中,Transformer、mLSTM和KAN模型各有所长。通过多模型互补策略,我们可以:
|
||
|
||
- 💪 **扬长避短**:利用每个模型的优势,弥补各自的不足
|
||
- 🎯 **提高准确性**:不同角度的预测结合,获得更全面的结果
|
||
- 📉 **降低风险**:减少单一模型可能带来的预测偏差
|
||
- 🔍 **增强鲁棒性**:提高对异常数据和市场变化的适应能力
|
||
|
||
## 🚀 实施多模型互补的步骤
|
||
|
||
### 1️⃣ 数据准备与特征工程
|
||
|
||
```python
|
||
# 示例代码
|
||
from models.data_utils import prepare_pharmacy_data
|
||
|
||
# 准备训练数据
|
||
X_train, y_train, X_val, y_val, scaler = prepare_pharmacy_data(
|
||
product_id="P001",
|
||
lookback_days=30, # 历史观察窗口
|
||
forecast_days=7, # 预测未来7天
|
||
include_features=["price", "promotion", "weekday", "holiday", "temperature"]
|
||
)
|
||
```
|
||
|
||
- 确保所有模型使用相同的数据预处理流程
|
||
- 针对不同模型的特点,可以适当调整特征组合
|
||
|
||
### 2️⃣ 各模型独立训练
|
||
|
||
```python
|
||
# 示例代码
|
||
from models.transformer_model import TimeSeriesTransformer
|
||
from models.mlstm_model import MatrixLSTMModel
|
||
from models.kan_model import KANModel
|
||
|
||
# 训练Transformer模型
|
||
transformer = TimeSeriesTransformer(
|
||
input_dim=X_train.shape[2],
|
||
d_model=64,
|
||
nhead=4,
|
||
num_layers=3
|
||
)
|
||
transformer.train(X_train, y_train, X_val, y_val, epochs=100, batch_size=32)
|
||
|
||
# 训练mLSTM模型
|
||
mlstm = MatrixLSTMModel(
|
||
input_dim=X_train.shape[2],
|
||
hidden_dim=64,
|
||
matrix_dim=8,
|
||
num_layers=2
|
||
)
|
||
mlstm.train(X_train, y_train, X_val, y_val, epochs=100, batch_size=32)
|
||
|
||
# 训练KAN模型
|
||
kan = KANModel(
|
||
input_dim=X_train.shape[2],
|
||
grid_size=10,
|
||
layers=[64, 32]
|
||
)
|
||
kan.train(X_train, y_train, X_val, y_val, epochs=100, batch_size=32)
|
||
```
|
||
|
||
- 根据药品特性选择适当的模型参数
|
||
- 对每个模型进行独立的超参数调优
|
||
|
||
### 3️⃣ 模型评估与选择
|
||
|
||
```python
|
||
# 示例代码
|
||
from models.utils import evaluate_model
|
||
|
||
# 评估各模型性能
|
||
transformer_metrics = evaluate_model(transformer, X_val, y_val)
|
||
mlstm_metrics = evaluate_model(mlstm, X_val, y_val)
|
||
kan_metrics = evaluate_model(kan, X_val, y_val)
|
||
|
||
print("Transformer性能:", transformer_metrics)
|
||
print("mLSTM性能:", mlstm_metrics)
|
||
print("KAN性能:", kan_metrics)
|
||
```
|
||
|
||
- 使用多种评估指标:MSE、RMSE、MAE、R²、MAPE
|
||
- 分析各模型在不同类型药品上的表现优势
|
||
|
||
### 4️⃣ 多模型集成策略
|
||
|
||
#### 方案一:加权平均集成
|
||
|
||
```python
|
||
# 示例代码
|
||
def weighted_ensemble_predict(models, weights, X_test):
|
||
predictions = []
|
||
for model, weight in zip(models, weights):
|
||
pred = model.predict(X_test)
|
||
predictions.append(pred * weight)
|
||
|
||
return sum(predictions)
|
||
|
||
# 根据验证集性能确定权重
|
||
total_r2 = transformer_metrics['r2'] + mlstm_metrics['r2'] + kan_metrics['r2']
|
||
weights = [
|
||
transformer_metrics['r2'] / total_r2,
|
||
mlstm_metrics['r2'] / total_r2,
|
||
kan_metrics['r2'] / total_r2
|
||
]
|
||
|
||
# 加权预测
|
||
ensemble_pred = weighted_ensemble_predict(
|
||
[transformer, mlstm, kan],
|
||
weights,
|
||
X_test
|
||
)
|
||
```
|
||
|
||
#### 方案二:特定场景选择
|
||
|
||
```python
|
||
# 示例代码
|
||
def scenario_based_predict(product_id, X_test, transformer, mlstm, kan):
|
||
# 分析产品特性
|
||
product_info = get_product_info(product_id)
|
||
|
||
if product_info['seasonality'] == 'high':
|
||
# 季节性强的药品优先使用Transformer
|
||
return transformer.predict(X_test)
|
||
elif product_info['volatility'] == 'high':
|
||
# 波动性大的药品优先使用KAN
|
||
return kan.predict(X_test)
|
||
elif product_info['trend_dependency'] == 'high':
|
||
# 趋势依赖性强的药品优先使用mLSTM
|
||
return mlstm.predict(X_test)
|
||
else:
|
||
# 默认使用加权集成
|
||
return weighted_ensemble_predict([transformer, mlstm, kan], [0.4, 0.3, 0.3], X_test)
|
||
```
|
||
|
||
#### 方案三:Stacking集成
|
||
|
||
```python
|
||
# 示例代码
|
||
from sklearn.linear_model import Ridge
|
||
|
||
def train_stacking_model(base_models, X_train, y_train, X_val, y_val):
|
||
# 生成基础模型在验证集上的预测
|
||
base_predictions = []
|
||
for model in base_models:
|
||
model.train(X_train, y_train, X_val, y_val)
|
||
pred = model.predict(X_val)
|
||
base_predictions.append(pred)
|
||
|
||
# 将基础预测作为新特征
|
||
stacking_features = np.column_stack(base_predictions)
|
||
|
||
# 训练元模型
|
||
meta_model = Ridge(alpha=1.0)
|
||
meta_model.fit(stacking_features, y_val)
|
||
|
||
return meta_model
|
||
|
||
# 训练stacking模型
|
||
meta_model = train_stacking_model([transformer, mlstm, kan], X_train, y_train, X_val, y_val)
|
||
|
||
# 预测
|
||
def stacking_predict(base_models, meta_model, X_test):
|
||
base_predictions = []
|
||
for model in base_models:
|
||
pred = model.predict(X_test)
|
||
base_predictions.append(pred)
|
||
|
||
stacking_features = np.column_stack(base_predictions)
|
||
final_prediction = meta_model.predict(stacking_features)
|
||
|
||
return final_prediction
|
||
```
|
||
|
||
### 5️⃣ 动态模型选择与调整
|
||
|
||
```python
|
||
# 示例代码
|
||
def dynamic_model_selection(product_id, recent_data, all_models):
|
||
"""根据最近数据表现动态选择最佳模型"""
|
||
best_model = None
|
||
best_score = float('inf')
|
||
|
||
for model in all_models:
|
||
# 在最近数据上评估模型
|
||
score = evaluate_on_recent_data(model, recent_data)
|
||
if score < best_score:
|
||
best_score = score
|
||
best_model = model
|
||
|
||
return best_model
|
||
|
||
# 每周更新最佳模型
|
||
def weekly_model_update(product_ids):
|
||
for product_id in product_ids:
|
||
# 获取最近数据
|
||
recent_data = get_recent_data(product_id, days=14)
|
||
|
||
# 动态选择模型
|
||
best_model = dynamic_model_selection(
|
||
product_id,
|
||
recent_data,
|
||
[transformer, mlstm, kan]
|
||
)
|
||
|
||
# 更新模型权重或选择
|
||
update_model_selection(product_id, best_model)
|
||
```
|
||
|
||
## 📊 不同药品类型的最佳模型组合策略
|
||
|
||
| 药品类型 | 主要特点 | 推荐模型组合 | 权重分配 |
|
||
|---------|---------|------------|---------|
|
||
| 慢性病药物 | 稳定、长期依赖 | mLSTM + Transformer | 0.6 + 0.4 |
|
||
| 季节性药物 | 周期性强、受季节影响 | Transformer + KAN | 0.7 + 0.3 |
|
||
| 促销敏感药物 | 价格弹性大 | KAN + mLSTM | 0.6 + 0.4 |
|
||
| 新上市药品 | 数据少、趋势不明 | KAN + Transformer | 0.7 + 0.3 |
|
||
| 多因素影响药品 | 复杂、多变量 | 三模型均衡 | 0.4 + 0.3 + 0.3 |
|
||
|
||
## 💡 实用技巧与最佳实践
|
||
|
||
1. **分阶段预测**:短期用Transformer,中期用mLSTM,长期用KAN,然后加权融合
|
||
|
||
2. **特征分配**:
|
||
- Transformer:处理时间相关特征(周期性、节假日)
|
||
- mLSTM:处理趋势和序列相关特征
|
||
- KAN:处理非线性特征(价格、促销、天气)
|
||
|
||
3. **自动化流程**:
|
||
```python
|
||
# 示例代码
|
||
def auto_train_predict_pipeline(product_id):
|
||
# 准备数据
|
||
data = prepare_data(product_id)
|
||
|
||
# 训练所有模型
|
||
models = train_all_models(data)
|
||
|
||
# 评估并选择最佳策略
|
||
best_strategy = select_best_strategy(models, data)
|
||
|
||
# 执行预测
|
||
predictions = execute_prediction_strategy(best_strategy, data)
|
||
|
||
# 保存结果和模型
|
||
save_results(product_id, predictions, models, best_strategy)
|
||
|
||
return predictions
|
||
```
|
||
|
||
4. **定期重训练**:每月或每季度重新训练模型,保持预测准确性
|
||
|
||
5. **异常检测与处理**:使用KAN模型检测异常销售模式,并调整预测策略
|
||
|
||
## 🌟 总结
|
||
|
||
多模型互补策略是药店销售预测系统的核心优势,通过合理组合Transformer、mLSTM和KAN模型,可以显著提高预测准确性和鲁棒性。根据不同药品特性选择合适的模型组合和集成方法,并建立自动化的训练-评估-预测流程,能够为药店管理者提供更可靠的销售预测,支持更精准的库存管理和销售决策。 |