K-分割交叉验证模拟器 返回
机器学习模拟器

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

对一维数据进行多项式回归,通过K-fold CV选择最优次数的过程可视化。通过训练误差和CV误差的差异,直观了解何时开始过学习。

参数设置
分割数 K
数据点数 N
分数离散度 σ
%
动画速度
×

每折的验证分数为合成值(Math.random)。训练数据越多(K 越大)偏差越小,验证集越小则估计的方差(标准差)越大。

暂停时,拖动滑块即可即时更新结果。

计算结果
折数 k
当前折
CV 平均分数
CV 分数标准差
K 折交叉验证动画

每一折轮流作为验证集(橙色),其余用于训练(绿色)。逐折记录验证分数,汇总为 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-fold交叉验证MSE。将数据分成 $K$ 等份,依次将各份作为测试集进行学习和评估:

$$\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个部分,轮流取其中1个作为测试集,其余作为训练集,重复学习和评估K次。在上面的模拟器中,你可以看到当K从5改成2时,CV曲线会有点抖动——用更多数据进行评估会让结果更稳定。
🙋
我注意到训练MSE一直在下降,但CV MSE到某个点后开始上升。这就是"过学习"吗?
🎓
完全正确!过学习的本质就是这样:当你增加多项式的次数,就能更完美地拟合训练数据,但同时也把噪声记住了。下面的图表显示得很清楚——绿线是最优次数的拟合,紫虚线是最高次数的拟合。紫线扭来扭去想要穿过每个数据点,这就是"记住了噪声"的样子。
🙋
真实函数是3次的,但为什么最优次数有时候选择3次,有时候选择4次呢?
🎓
理想情况当然是选择真实的3次,但有噪声的数据中,加一个额外的项有时候也不会让性能变差多少。所以3和4会竞争,具体选哪个取决于噪声的分布。实际工作中,我们通常不知道真实函数的次数,所以用交叉验证选择次数后,还会遵循"奥卡姆剃刀法则"——在性能相近的模型中选择更简单的那个。
🙋
如果把噪声σ设成0,过学习也会消失吗?
🎓
自己试试看!当σ=0时,没有噪声,任何3次或更高次的多项式都能完美重现真实函数,训练和CV的MSE都会接近零。但现实数据总是带噪声的,所以过学习是避免不了的。正因如此,交叉验证这样的"诚实评估工具"才至关重要。

常见问题

LOO是K=N(数据点数)的特殊情况,每次把一个数据点作为测试,其余全部用于训练。它的偏差很小(用了几乎全部数据),但需要学习N次,计算量大,而且因为只用1个点测试,评估的波动较大。实践中K=5或K=10通常更平衡。
留出法只分割一次训练/测试,评估值随着分割方式波动很大。K-fold取K种分割的平均值,让评估结果更稳定可靠。数据越少,K-fold的优势越明显。
在分类问题中当类别比例不均匀时使用。分层采样确保每个fold的类别比例与整体相同。普通K-fold可能导致某个fold中少数类几乎没有,使评估不稳定。在回归中,保持目标变量分布的分层也有用。
在同一个CV数据上既进行"超参数选择"又进行"最终评估"会导致对CV分数的过学习(元过学习)。正确做法是使用嵌套CV,或者另外预留一个测试集进行最终评估。本工具仅展示次数选择过程,选定的d*的真实泛化性能应在额外的独立数据上测量。

实际应用

机器学习超参数选择:scikit-learn的GridSearchCV和RandomizedSearchCV在内部运行K-fold CV来比较每个候选超参数的性能,自动选出最好的。XGBoost、LightGBM的树深度、学习率,岭回归的正则化系数等,几乎所有模型都用这种方法。

代理模型精度评估(CAE):用响应面法或Kriging为真实CAE分析建立代理模型时,用K-fold CV来评估"代理模型在未知设计点的可信度"。如果不先验证精度就用于优化,代理模型的外推会导致完全错误的最优解。

材料试验数据拟合:从少量实验数据拟合屈服曲线或疲劳S-N曲线时,用过复杂的函数会让数据完全通过,但外推会失效。交叉验证帮助选择"不过度记忆数据的复杂度",得到在现场真正有用的本构关系。

时间序列预测评估(时间序列CV):对于股票价格、需求预测等时间序列数据,普通K-fold不能用(会用未来数据学习过去)。要改用"扩展窗CV"或"滑动窗CV",永远保证用过去的数据学习、未来的数据测试。

常见误区和注意事项

最常见的误解是认为"使用CV就能完全避免过学习"。其实CV只是测量过学习程度的工具,不是阻止过学习的方法。如果选择的模型本身太复杂,CV分数也会很高。CV的作用是在多个候选模型中比较和选择,如果候选中没有好模型,CV也无能为力。在模拟器中增大σ就能看到这一点——任何次数的CV MSE都不会显著下降。

另一个常见误区是"K值越大越好"。增大K会让训练数据更多、偏差更小,但每个fold的测试数据变少、评估的波动变大,计算量也线性增长。实践中K=5或K=10是很好的平衡——不会太耗时,又能给出稳定的评估。在模拟器中比较K=2和K=10,会看到后者的CV曲线更光滑。

最后一个常见错误是把"CV选出的模型的CV分数"当成"该模型的真实泛化性能"。在选择过程中存在选择偏差——CV分数会比实际性能更乐观。科研论文和竞赛中这是致命错误。正确做法是预留一个独立的最终测试集,或使用嵌套CV。本工具中d*的CV MSE也不等于它的真实性能。

使用指南

  1. 用滑块设置多项式次数的上限(d_max),通常在1~10范围内选择
  2. 指定K值(分割数),5折或10折是标准配置。数据较小时可用LOOCV(K=n)
  3. 设置噪声标准差(σ)来反映训练数据的观测误差。实际测量中0.5~2.0是典型值
  4. 确定样本数(n),n=50是小规模,n=200是中等规模回归问题
  5. 执行模拟后,观察各次数d的平均CV误差曲线,找到最小值对应的d*
  6. 从训练误差与CV误差的差异评估过学习程度

具体计算示例

n=100样本、σ=1.0、K=5、d_max=8的设置:d=1次(直线)训练MSE=0.85、CV MSE=0.92,过学习比率11%。d=3次时训练MSE=0.18、CV MSE=0.38,过学习比率111%急剧增加。d=5次时训练MSE=0.08、CV MSE=0.41,过学习现象严重。选择最优次数d*=2时,训练MSE=0.48、CV MSE=0.51,过学习比率控制在6%,此时d=2的预测精度最接近真实函数的泛化性能。

实际应用注意事项