交叉验证是一种评估机器学习模型的技术,它通过将数据集分成子集,在某些子集上训练模型,并在其他子集上验证模型。其主要目标是评估模型在未见过的数据上的泛化能力,同时最大限度地减少过拟合。交叉验证不是依赖于单个训练-测试集划分,而是多次重复此过程,从而提供更可靠的模型性能估计。这种方法在使用有限数据时特别有用,因为它最大限度地利用可用样本进行训练和评估。
一种常用的方法是 k 折交叉验证。在这里,数据集被分成 k 个大小相等的子集(折叠)。模型被训练 k 次,每次使用 k−1 个折叠进行训练,并使用剩余的折叠进行验证。例如,当 k=5 时,数据集被分成五个部分。在第一次迭代中,折叠 1-4 训练模型,折叠 5 测试模型。此过程重复进行,直到每个折叠都充当过一次测试集。最终的性能指标(例如,准确率)是所有 k 次迭代的平均值。像 scikit-learn 这样的库简化了这个过程:使用 KFold
拆分数据,使用 cross_val_score
自动化训练和评分。对于类别不平衡的分类任务,分层 k 折交叉验证 确保每个折叠都保持与原始数据集相同的类别分布。
应用交叉验证时,请考虑实际的权衡。较大的 k 值(例如,k=10)会降低偏差,但会增加计算时间。较小的 k 值(例如,k=3)速度更快,但可能导致性能估计的方差更高。对于时间序列数据,使用 时间序列分割 来保持时间顺序,防止未来的数据泄漏到训练中。此外,避免直接使用交叉验证分数进行超参数调整;相反,将数据分成单独的训练集、验证集和测试集,以防止过拟合。如果计算资源有限,留出验证(单个训练-测试集划分)可能足以用于初始实验。始终确保数据在每个折叠内被打乱(除非顺序很重要)和预处理(例如,缩放),以防止数据泄漏。