K 折交叉验证模拟器 返回
机器学习模拟器

K 折交叉验证模拟器 — 多项式回归的次数选择

对一维数据进行多项式回归,用 K-fold CV 选择最佳次数。通过训练误差与 CV 误差的对比,直观地看出过拟合何时出现。

参数设置
最大次数 d_max
折数 K
噪声 σ
样本量 N

真实函数为 $y = 2x - 0.5x^2 + 0.05x^3$($x \in [0,5]$)。数据由 LCG(seed=42)确定性生成。

计算结果
CV 最优次数 d*
最小 CV MSE
d* 处的训练 MSE
过拟合比率
训练 MSE 与 CV MSE / 数据与拟合曲线

上:训练 MSE(蓝)与 CV MSE(红)随次数 d 变化,★ 标出 CV 最优。下:数据散点 + 最优次数拟合(绿)+ 高次过拟合曲线(紫色虚线)。

理论与主要公式

多项式回归模型。用最小二乘拟合次数为 $d$ 的多项式:

$$\hat y(x) = \beta_0 + \beta_1 x + \beta_2 x^2 + \cdots + \beta_d x^d$$

训练集上的均方误差(MSE):

$$\mathrm{MSE}_\text{train} = \frac{1}{n}\sum_{i=1}^{n}\bigl(y_i - \hat y(x_i)\bigr)^2$$

K 折交叉验证 MSE。把数据分成 $K$ 等份,依次让每份当 test:

$$\mathrm{MSE}_\text{CV} = \frac{1}{K}\sum_{k=1}^{K}\mathrm{MSE}_\text{test}^{(k)}$$

最优次数 $\arg\min_d \mathrm{MSE}_\text{CV}(d)$。训练 MSE 随 $d$ 单调下降,但 CV MSE 会到达谷底后回升——谷底就是过拟合的临界点。

K 折交叉验证模拟器是什么

🙋
机器学习里经常听到「交叉验证」,它到底在确认什么?
🎓
概括地说,是「在只有手头这点数据的情况下,估计模型对新数据的拟合程度」的程序。把数据切成 K 块,依次拿出一块当测试,其余用于训练,重复 K 次。把上面「折数 K」从 5 调到 2,CV 曲线就会变得颠簸——每折测试数据越多评估越稳,但训练量也跟着减少。
🙋
看图里训练 MSE 一直在下降,可 CV MSE 触底后又往上走,这就是「过拟合」?
🎓
正是过拟合的真面目。次数越高对训练集就越能贴合,但连噪声也一起记住,结果对新数据反而差。看下面那张图——绿色是 CV 最优次数的拟合,紫色虚线是最大次数的拟合。紫色为了穿过每个点扭得像麻花,正是「把噪声记成模型」的状态。
🙋
真实函数是 3 次,为什么最优次数常是 3 或 4?
🎓
理想是每次都选到 3,但带噪声的数据里再加一个系数代价并不大,所以 3 和 4 旗鼓相当,噪声决定胜负。现实里我们并不知道「真实次数」,所以实务做法是在 CV 谷底附近的平坦区域里挑「更简单」的那个——奥卡姆剃刀。
🙋
把噪声 σ 调到 0,过拟合是不是就消失了?
🎓
试一下。σ=0 时任意次数 ≥ 3 的多项式都能完美复现真函数,训练和 CV MSE 都几乎是零。但现实数据一定有噪声,过拟合是逃不掉的宿命。正因为如此,像 CV 这样的「诚实评估方法」必不可少。

常见问题

LOO 是 K = N 的特殊 K 折,每次把一个点留出做测试。偏差最小(几乎用全部数据训练),但要训练 N 次、计算量大,且每折只有一个测试点导致评估方差较大。实务上 K=5 或 10 平衡较好,按数据规模选择。
留出法只切分一次,分得好坏直接影响分数。K 折取 K 种分割的平均,估计更稳定。数据越少,K 折优势越明显;数据充足时简单留出也足够实用。
用于类别不平衡的分类问题,使每折的类别比例与整体一致,避免少数类几乎不进某折导致评估不稳。回归中也可对分箱后的目标值做分层抽样。
若同一组 CV 数据同时用于选超参和报告最终性能,会对 CV 分数本身过拟合(元过拟合)。实务上用嵌套 CV(外层评估、内层调参)或留一份独立测试集。本工具只演示次数选择,所选 d* 的真实泛化性能还需在另一份数据上测量。

实际应用

机器学习模型的超参数调优:scikit-learn 的 GridSearchCVRandomizedSearchCV 内部都跑 K 折 CV 比较候选并选出最佳超参。XGBoost、LightGBM 的树深与学习率、岭回归的正则化系数 λ 等几乎全部模型流程都依赖这一步。

CAE 代理模型的精度评估:用响应面或 Kriging 为重型 CAE 求解器构建代理模型时,用 K 折 CV 估计「代理在未知设计点上的可信度」。在做优化前不检查这一精度,搜索可能在代理的外推区域得到一个看似最优但毫无意义的解。

对小批量试验数据拟合本构模型:用少量试验拟合屈服曲线或疲劳 S-N 曲线时,过于灵活的函数会穿过每个点,外推时失效。CV 帮你选择「不会记住数据」的复杂度,是得到能用于新试验的本构模型的关键。

时间序列模型的评估(时间序列 CV):股价、需求等带时序数据上不能用普通 K 折——会出现「用未来训练去预测过去」。改用「扩展窗口 CV」「滑动窗口 CV」,始终以过去训练、未来评估。

常见误解与注意事项

最常见的误解是「用了 CV 就能完全防止过拟合」。CV 只是「测量过拟合程度的尺子」,本身并不阻止过拟合。如果你只考虑过于复杂的模型,CV MSE 也会一并变差。CV 是用来在多个候选间比较的工具,若候选中没有好模型,CV 跑多少次都白搭。把模拟器里的 σ 调大,会发现任何次数都压不下 CV MSE。

其次常见的是把 K 「越大越好」当成定理。K 越大每折训练数据越多偏差越小,但测试数据越少评估方差越大,且计算量线性增加。实务上 K=5 或 K=10 在偏差、方差、计算成本上取得平衡。把模拟器里的 K=2 与 K=10 对比,后者的 CV 曲线明显更平滑。

最后切勿把「所选模型的 CV 分数 = 该模型的真实泛化性能」画上等号。从众多候选中选最优时,CV 分数会引入选择偏差变得过于乐观。比赛或论文中这是致命伤。正确做法是另外保留一份「最终评估用 holdout」或使用嵌套 CV。在本工具中也注意「d* 的 CV MSE ≠ d* 的真实性能」。