本文目录导读:

利用历史大数据建模预测,核心思路可以概括为一条链路:数据 → 特征 → 模型 → 预测 → 决策,下面从实用脚本的角度,把整个流程拆开讲清楚。
整体框架
历史数据采集 → 数据清洗/存储 → 特征工程 → 模型训练 → 评估调优 → 上线预测 → 反馈迭代
实用脚本一般不是单文件,而是一组可复用的模块:
| 模块 | 作用 | 常用工具 |
|---|---|---|
| 数据层 | 拉取、清洗、入库 | pandas, SQLAlchemy, PySpark |
| 特征层 | 构造时序/统计特征 | pandas, tsfresh, featuretools |
| 模型层 | 训练、调参、保存 | scikit-learn, XGBoost, LightGBM, PyTorch |
| 服务层 | 定时预测、API | Airflow, FastAPI, cron |
| 监控层 | 效果跟踪、再训练 | MLflow, Prometheus |
关键步骤与脚本示例
数据准备
import pandas as pd
def load_history(path):
df = pd.read_csv(path, parse_dates=['ts'])
df = df.sort_values('ts').drop_duplicates('ts')
df = df.fillna(method='ffill') # 时序常用填充
return df
要点:
- 时间对齐:统一时区、采样频率
- 缺失处理:前向填充 / 插值 / 删除
- 异常检测:3σ、IQR、孤立森林
特征工程(决定上限)
常见三类特征:
def build_features(df):
df['hour'] = df['ts'].dt.hour
df['weekday'] = df['ts'].dt.weekday
# 滞后特征
for lag in [1, 7, 14, 30]:
df[f'lag_{lag}'] = df['y'].shift(lag)
# 滑动统计
df['roll_mean_7'] = df['y'].rolling(7).mean()
df['roll_std_7'] = df['y'].rolling(7).std()
df['roll_mean_30'] = df['y'].rolling(30).mean()
# 差分
df['diff_1'] = df['y'].diff()
return df.dropna()
注意:构造滞后/滑动特征时,只能使用预测时刻之前的信息,否则会数据泄漏。
模型选择
| 场景 | 推荐模型 |
|---|---|
| 单变量时序 | ARIMA, Prophet, SARIMA |
| 多特征回归 | LightGBM / XGBoost |
| 长序列、多序列 | LSTM, Transformer, N-BEATS |
| 分类/流失/风控 | LightGBM + 类别特征 |
实用脚本常先用 LightGBM 打底,效果好、训练快、可解释。
import lightgbm as lgb
from sklearn.model_selection import TimeSeriesSplit
tscv = TimeSeriesSplit(n_splits=5)
model = lgb.LGBMRegressor(n_estimators=1000, learning_rate=0.05)
model.fit(X_train, y_train, eval_set=[(X_val, y_val)],
callbacks=[lgb.early_stopping(50)])
评估
- 回归:MAE、RMSE、MAPE、SMAPE
- 分类:AUC、F1、Recall@K
- 时序专用:滚动回测,时间序列不能随机划分
from sklearn.metrics import mean_absolute_percentage_error print(mean_absolute_percentage_error(y_val, model.predict(X_val)))
上线预测
import joblib, datetime
def daily_predict(model_path, feature_fn, output_path):
model = joblib.load(model_path)
X = feature_fn(datetime.date.today())
pred = model.predict(X)
pd.DataFrame({'date': ..., 'pred': pred}).to_csv(output_path)
配合 cron / Airflow 定时跑,输出写入数据库或推送到业务系统。
实用脚本的工程要点
- 配置化:路径、超参、特征列表放 YAML,不写死在代码里。
- 版本管理:数据版本 + 模型版本 + 代码版本(DVC / MLflow)。
- 可复现:固定随机种子,记录环境依赖(requirements.txt / conda)。
- 监控漂移:定期比较预测分布 vs 实际分布(PSI、KS)。
- 自动再训练:效果下降触发 pipeline 重跑。
- 幂等与回滚:同一日期重复跑结果一致,新模型可一键回退。
典型应用场景
| 场景 | 输入特征 | 输出 |
|---|---|---|
| 销量预测 | 历史销量、促销、节假日 | 未来N天销量 |
| 服务器容量 | CPU/内存历史、业务量 | 未来负载 |
| 金融风控 | 用户行为、交易历史 | 违约概率 |
| 用户流失 | 活跃度、付费、互动 | 流失概率 |
| 设备故障 | 传感器时序 | 剩余寿命/告警 |
常见坑
- 数据泄漏:用了未来信息(最常见、最致命)
- 非平稳:直接建模导致预测偏移,需差分/去趋势
- 过拟合:特征过多、样本过少,用交叉验证 + 正则
- 忽略业务周期:节假日、大促需单独建模或加特征
- 只看离线指标:上线后分布变了要能监控
如果你能告诉我具体场景(比如销量、风控、设备预测),我可以给一份更贴合的可运行脚本骨架,包括数据 schema、特征函数和训练/预测入口。