Day 7 完整教程:第一周复习与模型综合比较
📋 目录
- 第一周知识点回顾
- 模型比较方法论
- 评估指标的深层理解
- 模型选择策略
- 量化交易中的模型评估
- 完整编程实战(多模型对比)
第一部分:第一周知识点回顾(2小时理论)
1.1 Day 1:机器学习基础与评估指标
核心概念:
- 监督学习、无监督学习、强化学习的区别
- 过拟合:训练好测试差;欠拟合:两者都差
- 数据集划分:训练集→验证集→测试集(按时间顺序)
评估指标:
- 回归:MSE、MAE、R²
- 分类:准确率、精确率、召回率、F1、AUC
量化要点:
- 时间序列数据必须按时间划分,不能随机打乱
- AUC比准确率更适合不平衡数据
1.2 Day 2:线性回归与正则化
核心算法:
- 最小二乘法:解析解 β=(XTX)−1XTyβ = (X^TX)^{-1}X^Tyβ=(XTX)−1XTy
- 梯度下降:迭代优化 β:=β−α∇J(β)β := β - α∇J(β)β:=β−α∇J(β)
正则化:
- Ridge (L2):J=MSE+λ∑βj2J = \text{MSE} + λ \sum β_j^2J=MSE+λ∑βj2,系数收缩
- Lasso (L1):J=MSE+λ∑∣βj∣J = \text{MSE} + λ \sum| β_j|J=MSE+λ∑∣βj∣,稀疏解
量化应用:
- 多因子模型的因子加权
- 收益率预测的基准模型
1.3 Day 3:逻辑回归与分类
核心原理:
- Sigmoid函数:p=1/(1+e−z)p = 1/(1+e^{-z})p=1/(1+e−z),将线性输出转为概率
- 决策边界:z=0z = 0z=0,即 βTx=0β^Tx = 0βTx=0(线性)
- 交叉熵损失:L=−[ylog(p)+(1−y)log(1−p)]L = -[y \log(p) + (1-y)\log(1-p)]L=−[ylog(p)+(1−y)log(1−p)]
技术指标:
- RSI:动量指标,超买(>70)/超卖(<30)
- MACD:趋势跟踪,金叉/死叉信号
1.4 Day 4:分类评估深入
ROC曲线:
- X轴:FPR,Y轴:TPR
- AUC:随机正样本排在负样本前的概率
- 优点:不受类别不平衡影响
PR曲线:
- X轴:召回率,Y轴:精确率
- 更适合极度不平衡数据
阈值选择:
- 最大化F1:平衡精确率和召回率
- 成本最小化:根据业务成本矩阵
- 约束优化:给定精确率/召回率下限
1.5 Day 5:KNN与相似度
核心原理:
- 基于实例的学习,无需训练
- 分类:多数投票;回归:平均
距离度量:
- 欧氏距离:∑(xi−yi)2\sqrt{\sum(x_i-y_i)^2}∑(xi−yi)2
- 曼哈顿距离:∑∣xi−yi∣\sum|x_i-y_i|∑∣xi−yi∣
- 余弦相似度:关注方向
K值选择:
- 小K过拟合,大K欠拟合
- 交叉验证选择最佳K
维度灾难:
- 高维空间距离失效
- 缓解方法:PCA降维、特征选择
1.6 Day 6:决策树
分裂准则:
- 信息增益(ID3):Gain=H(S)−H(S∣A)\text{Gain} = H(S) - H(S|A)Gain=H(S)−H(S∣A)
- 基尼系数(CART):Gini=1−∑pi2\text{Gini} = 1 - \sum p_i^2Gini=1−∑pi2
过拟合控制:
- 预剪枝:max_depth, min_samples_split
- 后剪枝:成本复杂度剪枝 (ccp_alpha)
优点 :可解释性强、自动特征选择
缺点:容易过拟合、不稳定
1.7 第一周核心公式总结
| 模型 | 核心公式 | 损失函数 | 超参数 |
|---|---|---|---|
| 线性回归 | y=βTxy = β^Txy=βTx | MSE | α (正则化) |
| 逻辑回归 | p=σ(βTx)p = σ(β^Tx)p=σ(βTx) | 交叉熵 | C (正则化) |
| KNN | 距离度量 | - | K, metric |
| 决策树 | 树结构 | 基尼/熵 | max_depth |
第二部分:模型比较方法论
2.1 为什么要比较模型?
目的:
- 找到最适合当前问题的模型
- 理解不同模型的优缺点
- 为集成学习提供基础
- 避免"一刀切"的选择
2.2 比较的维度
| 维度 | 说明 | 评估方式 |
|---|---|---|
| 预测性能 | 准确率、AUC等 | 测试集评估 |
| 稳定性 | 方差大小 | 交叉验证 |
| 训练速度 | 拟合时间 | 计时 |
| 预测速度 | 推理时间 | 计时 |
| 可解释性 | 能否理解决策过程 | 定性评估 |
| 内存消耗 | 存储需求 | 模型大小 |
2.3 公平比较的原则
必须遵守:
- 相同的数据集划分
- 相同的评估指标
- 相同的随机种子
- 对每个模型进行适当的超参数调优
常见陷阱:
- 数据泄露(用未来信息训练)
- 测试集污染(反复使用测试集调参)
- 比较不匹配的指标
2.4 统计显著性检验
为什么需要:一个模型AUC比另一个高0.01,是真的更好还是随机波动?
方法:
- 配对t检验:比较同一测试集上的预测差异
- McNemar检验:比较分类器的错误模式
- DeLong检验:比较两个AUC的差异
python
from scipy.stats import ttest_rel
# 配对t检验
t_stat, p_value = ttest_rel(pred1, pred2)
if p_value < 0.05:
print("两个模型有显著差异")
第三部分:评估指标的深层理解
3.1 不同场景下的指标选择
| 应用场景 | 推荐指标 | 原因 |
|---|---|---|
| 涨跌预测(平衡) | 准确率、AUC | 直观 |
| 涨跌预测(不平衡) | AUC、F1 | 不受不平衡影响 |
| 收益率预测 | MSE、MAE | 回归任务 |
| 信号质量要求高 | 精确率 | 减少误报 |
| 抓住机会重要 | 召回率 | 减少漏报 |
| 策略比较 | 夏普比率 | 风险调整后收益 |
3.2 指标之间的权衡
text
精确率 ↑ → 阈值 ↑ → 召回率 ↓
召回率 ↑ → 阈值 ↓ → 精确率 ↓
F1分数 = 2 * (P * R) / (P + R) # 平衡两者
3.3 超越单一指标
多指标评估矩阵:
| 模型 | 准确率 | 精确率 | 召回率 | F1 | AUC | 训练时间(s) | 推理时间(ms) |
|---|---|---|---|---|---|---|---|
| LR | 0.72 | 0.68 | 0.65 | 0.66 | 0.75 | 0.1 | 0.01 |
| KNN | 0.70 | 0.66 | 0.63 | 0.64 | 0.73 | 0 | 0.5 |
| DT | 0.71 | 0.67 | 0.64 | 0.65 | 0.74 | 0.05 | 0.001 |
选择建议:
- 追求最高AUC → 选择AUC最高的
- 追求可解释性 → 选择LR或DT
- 追求推理速度 → 选择DT或LR
- 追求稳定性 → 选择CV方差小的
第四部分:模型选择策略
4.1 没有免费午餐定理
没有任何一个模型在所有问题上都优于其他模型。
含义:
- 需要针对具体问题选择模型
- 简单模型可能是最好的起点
- 复杂模型不一定更好
4.2 模型选择流程
text
1. 理解问题(分类/回归?数据规模?特征类型?)
↓
2. 选择候选模型(2-5个代表性模型)
↓
3. 交叉验证评估(同一数据划分)
↓
4. 多指标比较(不只看一个指标)
↓
5. 选择最佳模型或集成
4.3 模型选择决策树
python
# 伪代码
if n_samples < 100:
if n_features < 10:
recommend = "逻辑回归 / 朴素贝叶斯"
else:
recommend = "线性回归 + 正则化 / SVM"
elif n_samples > 10000:
if need_interpretability:
recommend = "决策树 / 逻辑回归"
else:
recommend = "随机森林 / XGBoost / LightGBM"
else:
if need_interpretability:
recommend = "逻辑回归 / 决策树"
else:
recommend = "随机森林 / SVM"
第五部分:量化交易中的模型评估
5.1 回测与模型评估的区别
| 方面 | 模型评估 | 策略回测 |
|---|---|---|
| 关注点 | 预测准确率 | 收益、风险 |
| 时间框架 | 样本外预测 | 完整交易周期 |
| 考虑因素 | 特征、标签 | 交易成本、滑点 |
| 输出 | 准确率、AUC | 夏普比率、回撤 |
5.2 量化模型评估的特殊性
1. 时间序列特殊性:
- 必须按时间划分,不能随机
- 使用TimeSeriesSplit交叉验证
2. 过拟合风险更高:
- 金融数据信噪比低
- 需要严格的样本外测试
3. 业务指标更重要:
- 夏普比率 > 准确率
- 最大回撤 > AUC
5.3 量化模型的评估框架
python
def evaluate_quant_model(model, X_train, X_test, y_train, y_test, prices):
"""量化模型评估框架"""
# 1. 基础预测评估
y_pred = model.predict(X_test)
y_proba = model.predict_proba(X_test)[:, 1] if hasattr(model, 'predict_proba') else None
# 2. 分类指标
metrics = {
'accuracy': accuracy_score(y_test, y_pred),
'precision': precision_score(y_test, y_pred),
'recall': recall_score(y_test, y_pred),
'f1': f1_score(y_test, y_pred),
'auc': roc_auc_score(y_test, y_proba) if y_proba is not None else None
}
# 3. 策略指标(假设根据预测信号交易)
signals = y_proba > 0.5 if y_proba is not None else y_pred
returns = prices.pct_change().shift(-1)
strategy_returns = signals * returns
sharpe = strategy_returns.mean() / strategy_returns.std() * np.sqrt(252)
# 4. 稳定性评估
cv_scores = cross_val_score(model, X_train, y_train, cv=5, scoring='roc_auc')
return {
'prediction_metrics': metrics,
'strategy_sharpe': sharpe,
'cv_auc_mean': cv_scores.mean(),
'cv_auc_std': cv_scores.std()
}