泛化误差可分解为 偏差² + 方差 + 噪声。过拟合本质是低偏差、高方差;欠拟合则是高偏差、低方差。
✨ 过拟合区域:方差主导,总误差随复杂度增加而上升。
训练误差 随复杂度单调下降,泛化误差 呈 U 型曲线。
| 复杂度 | 训练误差 | 泛化误差 | 典型模型 |
|---|---|---|---|
| 低 | 高 | 高 (欠拟合) | 线性回归 |
| 中 | 适中 | 最低 ✅ | 正则化Ridge |
| 高 | 极低 (≈0) | 高 (过拟合) | 深度树 / 神经网络 |
VC维衡量模型打散数据点的能力,是模型复杂度的理论度量。VC维越高,模型越容易过拟合。
2D 线性分类器可打散 3 个点(任意标签组合),但无法打散 4 个点(如异或模式)。
💡 量化策略中,VC维过高意味着策略对历史数据“记忆”过强,样本外失效。
import numpy as np
from sklearn.linear_model import Ridge
from sklearn.metrics import mean_squared_error
# 模拟数据: y = sin(x) + 噪声
np.random.seed(42)
X = np.linspace(0, 10, 100).reshape(-1,1)
y = np.sin(X.ravel()) + 0.2 * np.random.randn(100)
# 不同复杂度 (alpha 控制)
alphas = [100, 10, 1, 0.1, 0.01, 0.001]
bias2_list, var_list = [], []
for alpha in alphas:
model = Ridge(alpha=alpha)
# 多次采样估计偏差方差 (简化)
preds = []
for _ in range(50):
idx = np.random.choice(100, 80, replace=False)
X_sub, y_sub = X[idx], y[idx]
model.fit(X_sub, y_sub)
preds.append(model.predict(X))
preds = np.array(preds)
bias2 = (np.mean(preds, axis=0) - np.sin(X.ravel()))**2
var = np.var(preds, axis=0)
bias2_list.append(np.mean(bias2))
var_list.append(np.mean(var))
print("复杂度(alpha) :", alphas)
print("偏差² :", np.round(bias2_list, 4))
print("方差 :", np.round(var_list, 4))
👆 增大 alpha (强正则化) → 偏差↑ 方差↓;减小 alpha → 偏差↓ 方差↑。
| 维度 | 指标 / 方法 | 过拟合警示 |
|---|---|---|
| 偏差-方差 | 交叉验证误差 | 训练误差极低,验证误差高 |
| 模型复杂度 | 参数数量 / 自由度 | 参数 >> 样本量 |
| VC维 | 打散能力 | VC维 > 样本量/10 |
| 正则化 | L1/L2 系数 | 权重绝对值极大 |
| 回测 | 样本外 Sharpe | 样本内 > 2.0,样本外 < 0.5 |