Machine Learning: 项目设计 — SalesPredict全链路规划指南
好的开始是成功的一半——系统设计决定项目成败,动手前先画好蓝图。
1. 你将学到
- 需求分析:业务目标(月度销售额预测MAPE < 10%)、用户故事、核心指标定义
- 数据架构:数据源(订单/用户/商品/日志) → 数据湖 → 特征存储
- 模型架构:基线(LinearRegression) → 进阶(XGBoost) → 深度学习(MLP)的演进路线
- 部署架构:MLflow实验管理 + FastAPI推理服务 + Docker容器化 + 监控告警
- 项目排期与团队协作:Alice(数据工程)、Bob(ML工程)、Charlie(后端/DevOps)的分工
2. 一个创业团队的真实故事
(1) 痛点:直接写代码导致3次推倒重来
Bob带着团队直接开始写代码,2周后发现数据源设计不合理要重来,4周后发现模型架构不支持在线预测又要改,8周后发现部署方案没考虑监控又要重构。没有设计的项目,每一步都是"意外"。
(2) 系统设计的解法
系统设计把"做什么"和"怎么做"提前想清楚——需求→数据→模型→部署→监控,每一步都有明确方案。
PYTHON
# Project design as code
project_config = {
"name": "SalesPredict",
"goal": "Monthly revenue prediction MAPE < 10%",
"data_sources": ["orders", "users", "products", "ad_logs"],
"model_pipeline": "LinearRegression → XGBoost → MLP",
"deployment": "FastAPI + Docker + MLflow",
"team": {"Alice": "Data Engineering", "Bob": "ML Engineering", "Charlie": "DevOps"},
}
(3) 收益:设计先行,开发零返工
Bob用1周完成系统设计后,8周开发零返工,按时交付。设计成本只占项目总时间的10%,但避免了50%以上的返工风险。
3. 需求分析
(1) 业务目标定义
▶ 示例:需求文档模板
PYTHON
# Requirements as structured config
requirements = {
"business_goal": "Predict next month's revenue per product category",
"success_metrics": {
"primary": "MAPE < 10% for monthly revenue prediction",
"secondary": ["MAE < 50k USD per category", "Prediction latency < 100ms"],
},
"user_stories": [
"As Bob (Operations), I want monthly revenue predictions so I can optimize inventory",
"As Alice (US Manager), I want USD-denominated predictions for the US market",
"As Charlie (EU Manager), I want EUR-denominated predictions for the EU market",
"As CFO, I want prediction confidence intervals for budget planning",
],
"constraints": {
"data_latency": "Daily batch update by 6:00 AM",
"prediction_sla": "API response < 100ms p95",
"model_retraining": "Weekly automated retraining",
"compliance": "GDPR for EU user data",
},
"scope": {
"in_scope": ["3 market regions", "5 product categories", "Monthly & weekly predictions"],
"out_of_scope": ["Real-time per-order prediction", "Image-based product classification"],
},
}
输出:
TEXT
📖 仅展示
# 执行成功
| 维度 | 定义 | SalesPredict目标 |
|---|---|---|
| 核心指标 | 模型性能KPI | MAPE < 10% |
| 业务指标 | 业务价值衡量 | 库存成本降低20% |
| SLA | 服务等级协议 | API < 100ms p95 |
| 数据时效 | 数据更新频率 | 日批处理 |
| 合规 | 法规约束 | GDPR(EU数据) |
4. 数据架构
(1) 数据源与数据流
graph TB
ORDERS[Orders DB<br/>Transaction Data] --> ETL[ETL Pipeline<br/>Daily Batch]
USERS[User Profiles] --> ETL
PRODUCTS[Product Catalog] --> ETL
ADLOGS[Ad Platform Logs] --> ETL
ETL --> DATALAKE[Data Lake<br/>S3 / GCS]
DATALAKE --> FEATURE[Feature Store<br/>Engineered Features]
FEATURE --> TRAIN[Training Pipeline]
FEATURE --> SERVE[Serving Layer<br/>Online Features]
SERVE --> API[Prediction API]
▶ 示例:数据源定义
PYTHON
data_sources = {
"orders": {
"source": "PostgreSQL (production DB)",
"fields": ["order_id", "user_id", "product_id", "amount_usd", "order_date", "category"],
"volume": "~500k rows/month",
"latency": "T+1 (next day available)",
},
"users": {
"source": "CRM System",
"fields": ["user_id", "region", "segment", "register_date", "lifetime_value"],
"volume": "~50k active users",
"latency": "T+1",
},
"ad_spend": {
"source": "Google Ads + Facebook Ads API",
"fields": ["date", "channel", "campaign", "spend_usd", "impressions", "clicks"],
"volume": "~10k rows/month",
"latency": "T+2",
},
"product_catalog": {
"source": "PIM System",
"fields": ["product_id", "category", "price_usd", "margin_pct", "launch_date"],
"volume": "~5k products",
"latency": "Weekly update",
},
}
输出:
TEXT
📖 仅展示
# 执行成功
(2) 特征存储设计
| 特征组 | 特征数 | 更新频率 | 存储方式 |
|---|---|---|---|
| RFM特征 | 12 | 日 | Parquet (offline) + Redis (online) |
| 广告特征 | 8 | 日 | Parquet |
| 时间特征 | 6 | 实时计算 | 代码逻辑 |
| 类别特征 | 5 | 周维表 | Parquet |
| 聚合统计 | 10 | 日 | Parquet |
5. 模型架构
(1) 模型演进路线
▶ 示例:模型架构定义
PYTHON
model_architecture = {
"stage_1_baseline": {
"model": "LinearRegression + Pipeline",
"expected_r2": "0.72-0.78",
"expected_mape": "12-15%",
"purpose": "Establish baseline, validate data pipeline",
"timeline": "Week 1-2",
},
"stage_2_advanced": {
"model": "XGBoost + Feature Engineering",
"expected_r2": "0.85-0.89",
"expected_mape": "8-10%",
"purpose": "Production model, meet MAPE < 10% target",
"timeline": "Week 3-5",
},
"stage_3_deep_learning": {
"model": "MLP / LSTM (time series)",
"expected_r2": "0.87-0.92",
"expected_mape": "7-9%",
"purpose": "Incremental improvement, capture temporal patterns",
"timeline": "Week 6-8",
},
}
输出:
TEXT
📖 仅展示
# 执行成功
| 阶段 | 模型 | MAPE | 训练时间 | 优先级 |
|---|---|---|---|---|
| Stage 1 | LinearRegression | 12-15% | <1min | P0 |
| Stage 2 | XGBoost | 8-10% | ~5min | P0 |
| Stage 3 | MLP/LSTM | 7-9% | ~30min | P1 |
(2) 评估策略
PYTHON
evaluation_strategy = {
"cv_method": "TimeSeriesSplit(n_splits=5)",
"primary_metric": "MAPE",
"secondary_metrics": ["MAE", "RMSE", "R2"],
"business_alignment": {
"MAPE_10pct": "Prediction error within 10% of actual revenue",
"MAE_50k": "Average absolute error less than 50k USD per category",
"cost_of_error": "1% MAPE ≈ 100k USD annual inventory waste",
},
"ab_testing": {
"duration": "3 weeks",
"metric": "Revenue prediction MAPE vs actuals",
"sample_size": "All categories, all markets",
},
}
6. 部署架构与团队分工
(1) 部署架构
graph TB
CLIENT[Client Apps] --> NGINX[Nginx Load Balancer]
NGINX --> API1[FastAPI Worker 1]
NGINX --> API2[FastAPI Worker 2]
API1 --> MODEL[MLflow Model Registry<br/>Production Model]
API2 --> MODEL
API1 --> REDIS[(Redis Cache)]
API2 --> REDIS
MODEL --> MLFLOW[MLflow Tracking<br/>Experiment History]
MLFLOW --> MONITOR[Monitoring Stack<br/>Prometheus + Grafana]
MONITOR --> ALERT[Alert Manager<br/>Drift Detection]
ALERT --> RETRAIN[Retraining Pipeline<br/>Airflow/Dagster]
RETRAIN --> MLFLOW
(2) 团队分工
▶ 示例:风险登记表
PYTHON
risk_register = {
"data_quality": {
"risk": "Raw data has >5% missing values in key features",
"probability": "High",
"impact": "Critical - model trained on biased data",
"mitigation": "Automated data quality checks in ETL pipeline",
"owner": "Alice",
},
"model_overfitting": {
"risk": "XGBoost overfits on small category samples",
"probability": "Medium",
"impact": "High - poor generalization to new markets",
"mitigation": "TimeSeriesSplit CV, regularization, early stopping",
"owner": "Bob",
},
"api_latency": {
"risk": "Prediction API exceeds 100ms SLA under load",
"probability": "Medium",
"impact": "Medium - user experience degradation",
"mitigation": "Redis cache for hot queries, Nginx rate limiting",
"owner": "Charlie",
},
}
输出:
TEXT
📖 仅展示
# 执行成功
▶ 示例:项目排期
PYTHON
project_schedule = {
"Week 1-2: Data & Baseline": {
"Alice": "ETL pipeline, data lake setup, data quality checks",
"Bob": "EDA, feature engineering, LinearRegression baseline",
"Charlie": "Dev environment, MLflow setup, CI/CD pipeline",
},
"Week 3-5: Advanced Model": {
"Alice": "Feature store, online serving layer, data monitoring",
"Bob": "XGBoost training, hyperparameter tuning, model evaluation",
"Charlie": "FastAPI scaffold, Docker setup, load testing",
},
"Week 6-8: Deep Learning & Deploy": {
"Alice": "Real-time features, data drift detection",
"Bob": "MLP/LSTM experiments, A/B test design",
"Charlie": "Production deployment, monitoring dashboard, alerting",
},
"Week 9-10: Launch & Monitor": {
"Alice": "Data pipeline monitoring, feature validation",
"Bob": "Model monitoring, retraining pipeline",
"Charlie": "A/B test execution, gradual rollout, on-call setup",
},
}
输出:
TEXT
📖 仅展示
# 执行成功
| 角色 | 负责人 | 职责 | 交付物 |
|---|---|---|---|
| 数据工程 | Alice | ETL/数据湖/特征存储 | 数据管道+特征 |
| ML工程 | Bob | 特征工程/模型训练/评估 | 最佳模型+实验记录 |
| 后端/DevOps | Charlie | API/部署/监控 | 生产服务+监控 |
❓ 常见问题
Q 需求分析应该多详细?
A 至少包含——1)明确的业务目标和量化KPI;2)用户故事(谁用什么做什么);3)约束条件(延迟/合规/预算);4)范围边界(做什么不做什么)。不够详细的需求是返工的主因。
Q 基线模型有必要吗?
A 必须。基线建立性能下限和数据管道验证。没有基线你无法判断XGBoost的改善是模型功劳还是数据管道修好了。
Q 团队应该有多少人?
A ML项目最少3人——1数据+1ML+1DevOps。1人全栈也行但效率低且知识单点。核心是三个角色都有人覆盖,不是人数。
Q 先做数据还是先做模型?
A 数据优先。脏数据+好模型=垃圾结果。先用1-2周建立可靠数据管道,再训练模型。数据问题越早发现修复成本越低。
Q 设计阶段应该花多长时间?
A 项目总时长的10-15%。8周项目花1周设计是合理的。设计不足导致返工的成本远超多花1周设计。
Q 如何确保设计落地?
A 设计文档包含——1)明确的交付物和验收标准;2)代码模板/脚手架;3)测试策略;4)里程碑检查点。每个里程碑验证设计是否正确执行。
📖 小节
- 需求分析三要素:量化目标(MAPE<10%)、用户故事、约束条件(延迟/合规)
- 数据架构:数据源 → ETL → 数据湖 → 特征存储 → 训练/服务两条路径
- 模型架构演进:LinearRegression(基线) → XGBoost(主力) → MLP/LSTM(增量)
- 部署架构:FastAPI + Redis缓存 + Nginx负载均衡 + MLflow模型管理 + Prometheus监控
- 团队分工:Alice(数据工程) + Bob(ML工程) + Charlie(DevOps)三角色协作
- 设计先行,开发零返工——10%时间的设计避免50%的返工
📝 作业
- 基础题(难度⭐):为自己的ML项目写一份需求文档,包含业务目标、成功指标和范围边界。提示:参考第3节需求文档模板。
- 进阶题(难度⭐⭐):绘制SalesPredict的完整数据架构图(Mermaid),标注每个数据源、ETL步骤和存储方式。提示:参考第4节数据架构图。
- 挑战题(难度⭐⭐⭐):完整设计一个ML项目——需求→数据→模型→部署→监控→团队,输出一份可执行的项目计划(含时间线和交付物)。提示:综合第3-6节所有设计要素。