跳到主内容
@wquguru
术语统计基础

过拟合 Overfitting

2026-09-05 更新

定义#

过拟合指模型学到了数据里的噪声而不是真实规律。表现是训练数据上表现极好、换到新数据上大幅退化——因为模型把只属于这一段历史的偶然波动也当成了规律。

任何观测值都可以写成「真实规律 + 噪声」两部分。模型太简单会连规律都抓不住(欠拟合),太复杂则会连噪声一起拟合。典型信号有三个:模型复杂度与数据量失衡(样本量小于特征数),训练集误差显著低于测试集,以及参数对数据的微小变动极度敏感。

公式#

观测值的分解:

yobserved=f(x)true+εy_{observed} = f(x)_{true} + \varepsilon

其中 ε\varepsilon 是噪声。过拟合的模型拟合的是这个复合结构,而不是 f(x)truef(x)_{true}

抑制复杂度的常用手段是正则化,在损失函数上加一个对参数大小的惩罚项:

Lasso (L1): min((yiy^i)2+λβj),Ridge (L2): min((yiy^i)2+λβj2)\text{Lasso (L1)}:\ \min\left(\sum (y_i - \hat{y}_i)^2 + \lambda \sum |\beta_j|\right),\qquad \text{Ridge (L2)}:\ \min\left(\sum (y_i - \hat{y}_i)^2 + \lambda \sum \beta_j^2\right)

λ\lambda 越大惩罚越强。另一条路是用信息准则在拟合优度和参数个数之间权衡:AIC=2k2ln(L)\text{AIC} = 2k - 2\ln(L)BIC=ln(n)k2ln(L)\text{BIC} = \ln(n)k - 2\ln(L),其中 kk 是参数个数、LL 是似然值、nn 是样本量。

算一笔账#

先看复杂度和数据量的关系。用 20 个观测拟合一条 10 阶多项式,待估参数有 11 个,剩余自由度只有 2011=920 - 11 = 9;如果拟合到 19 阶,参数正好 20 个,曲线能穿过每一个点,训练残差平方和为 0、R2=1R^2 = 1——但这条曲线在数据点之间剧烈摆动,对新数据毫无预测力。

再用 AIC 比一比两个模型。模型 A 有 2 个参数,对数似然 lnL=100\ln L = -100AIC=2×22×(100)=204\text{AIC} = 2 \times 2 - 2 \times (-100) = 204。模型 B 有 12 个参数,拟合更好,lnL=95\ln L = -95AIC=2×122×(95)=214\text{AIC} = 2 \times 12 - 2 \times (-95) = 214

模型 B 的似然确实更高,但多花的 10 个参数只换来 5 点对数似然,AIC 反而更差。按奥卡姆剃刀,该选 A。

常见问题#

用交叉验证不就能发现过拟合了吗?#

要看怎么切。随机拆分和普通 K-Fold 会让模型在未来的样本上训练、再回到过去评估,等于泄漏信息。金融数据必须按时间切:用按时间的留出验证,或 TimeSeriesSplit 这类时间序列交叉验证,并留出 gap;如果标签用的是未来多日收益、前后有重叠,gap 还要按标签跨度加大。

回测收益很高,就说明策略好吗?#

不能这么推。回测跑在历史数据上,本身就是训练集。参数不断优化去贴合最新行情、只用今天还活着的股票构建历史组合(幸存者偏差),都会让回测曲线漂亮得失真。真正的检验是冻结的样本外数据和真实交易。

变量显著就该放进模型吗?#

不该只看统计显著性。在大量候选变量里挑,总有一些能偶然通过检验;把它们塞进模型,样本内 R² 会上升,样本外表现却可能崩掉。加变量前先问它有没有经济逻辑,再看加了之后样本外是不是真的变好。

相关术语

出自