Cross-Validation
了解交叉验证如何提升模型泛化能力并防止过拟合。探索如何使用 Ultralytics YOLO26 实现 K 折评估,构建稳健的 ML。
交叉验证是一种稳健的统计重采样程序,用于评估机器学习 (ML)模型在有限数据样本上的性能。与将数据拆分为单个训练集和测试集的标准留出法不同,交叉验证会将数据集划分为多个子集,以确保每个数据点都同时用于训练和验证。这项技术对于评估统计分析结果如何推广到独立数据集至关重要,还有助于检测过拟合,即模型可能会记忆训练示例,而不是学习可泛化的模式。
K 折交叉验证的机制#
这项技术最广泛使用的变体是 K 折交叉验证。在此过程中,整个数据集会被随机划分为 k 个大小相等的组,即“折”。随后,训练过程会重复 k 次。在每次迭代中,单个折充当用于测试模型的验证数据,其余 k-1 个折则作为训练数据。
最终性能指标通常通过对每次循环获得的分数取平均值来计算,例如准确率、精确率或平均精度均值 (mAP)。这种方法显著降低了单次训练-测试划分试验所带来的方差,从而更可靠地估计泛化误差。它确保评估不会受到任意选择测试数据的影响。
使用 Ultralytics 实现#
在处理较小的数据集或执行严格的超参数调优时,交叉验证尤其有用。虽然现代深度学习框架(如 PyTorch)能够简化训练循环,但管理各个折仍需要仔细准备数据。
下面的示例演示了如何遍历预先生成的 YAML 配置文件,以使用 YOLO26 model进行 5 折交叉验证实验。这里假设你已经将数据集拆分为五个独立的配置文件。
from ultralytics import YOLO
# List of dataset configuration files representing 5 folds
fold_yamls = [f"dataset_fold_{i}.yaml" for i in range(5)]
for i, yaml_file in enumerate(fold_yamls):
# Load a fresh YOLO26 Nano model for each fold
model = YOLO("yolo26n.pt")
# Train the model, saving results to a unique project directory
results = model.train(data=yaml_file, epochs=20, project="cv_experiment", name=f"fold_{i}")如需深入了解如何自动生成数据划分,请参阅 K 折交叉验证指南。
实际应用#
在数据稀缺、收集成本高昂或需要安全关键型可靠性的行业中,交叉验证不可或缺。
- 医疗诊断: 在医学图像分析中,罕见疾病的数据集通常规模较小。单次验证集划分可能会意外排除困难病例或罕见病理。通过使用交叉验证,开发医疗保健领域的 AI的研究人员可以确保其诊断模型针对每一份可用的患者扫描数据进行测试,从而验证系统能够适用于不同的人口群体和设备类型。
- 精准农业: 户外环境中的条件变化非常大。用于作物病害检测的模型在晴天可能表现良好,但如果阴天图像只出现在训练集中,模型就可能在阴天条件下失效。交叉验证可确保模型能够适应此类变化,帮助农民依靠自动机器学习 (AutoML)工具进行稳定监测,而不受天气条件影响。
模型开发中的战略优势#
将交叉验证集成到AI 开发生命周期中,可以深入了解偏差-方差权衡。
-
稳定性评估: 如果不同折之间的性能指标差异显著,说明模型对用于训练的具体数据点高度敏感,这表明模型具有较高的方差。
-
数据效率: 它最大限度地发挥有限数据的效用,因为每个观测值最终都会同时用于训练和验证。
区分相关概念#
区分交叉验证与其他评估术语非常重要:
- 与留出验证相比: 留出验证涉及一次划分(例如 80/20)。虽然对于 ImageNet 等超大规模数据集来说速度更快且适用,但对于较小的数据集,其统计稳健性不如交叉验证。
- 与自助法相比: 自助法涉及有放回的随机抽样,而 K 折交叉验证则在不放回的情况下划分数据(每个样本恰好属于一个折)。
管理多个折产生的工件、指标和模型可能很复杂。Ultralytics Platform通过提供集中式实验跟踪简化了这一过程,使团队能够比较不同折之间的性能,并轻松可视化模型评估洞察。









