Ultralytics YOLO27: 加入候补名单。
获取 YOLO 许可
返回 Ultralytics 术语表

Cross-Validation

交叉验证会在同一数据集的 k 个轮换划分上训练并评估模型,以估算泛化能力。介绍 K 折交叉验证的步骤、变体、数据泄漏和代码。

交叉验证通过在同一数据集的不同划分上多次训练和评估模型,并汇总各次评分,来估计模型在未见数据上的表现。在 k 折交叉验证中,数据会被分成 k 个大小相等的部分,称为折;每一折都会轮流作为验证数据,模型则在其余 k − 1 折上训练。k 次评分的均值用于估计模型性能,而评分的离散程度则显示该估计受哪些样本恰好进入验证集的影响有多大。当数据过少,无法通过单次留出划分得到可靠评分时,交叉验证是标准评估方法;在不使用测试数据的情况下比较算法和调优超参数时,也广泛使用交叉验证。

K 折交叉验证的工作原理#

数据集会先随机打乱一次,然后分成 k 折,通常为 5 折或 10 折。在 k 轮中的每一轮,模型都会在 k − 1 折上重新训练,并在剩余的一折上评分,因此每个样本恰好用于验证一次、用于训练 k − 1 次。随后计算 k 次评分的平均值,并报告其标准差。交叉验证选出模型或一组超参数后,通常会使用这些设置在全部训练数据上重新训练最终模型。留一交叉验证是 k 等于样本数的极端情况;这种方法会在每一轮中尽可能多地使用数据进行训练,但需要训练的模型数量与样本数相同。

解读交叉验证评分#

各折之间的离散程度与均值同样具有参考价值。下面的 scikit-learn脚本使用内置的乳腺癌数据集运行 5 折交叉验证:

from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import StratifiedKFold, cross_val_score
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler

# 569 labeled tumor samples with 30 features each
X, y = load_breast_cancer(return_X_y=True)

# The scaler sits inside the pipeline, so each round fits it on that round's training folds only
model = make_pipeline(StandardScaler(), LogisticRegression(max_iter=1000))

# 5 stratified folds: each sample is validated exactly once
folds = StratifiedKFold(n_splits=5, shuffle=True, random_state=0)
scores = cross_val_score(model, X, y, cv=folds)
print("Fold accuracies:", scores.round(3))
print(f"Mean {scores.mean():.3f} +/- {scores.std():.3f}")

五折的准确率介于 0.956 和 1.000 之间,均值为 0.979,标准差为 0.014。如果只进行一次 80/20 划分,报告的会是这五个数字中的任意一个,最大相差 4.4 个百分点。将缩放器放在流水线中,可以确保验证折不会参与数据预处理统计;如果先缩放整个数据集,就会导致每个验证折中的信息泄漏到训练过程中。

选择交叉验证变体#

普通 k 折假设样本彼此独立且可以互换。如果事实并非如此,随机划分就会泄漏信息,或产生无法代表任务的折:

  • 分层 k 折:使每一折中的类别比例与整个数据集相同;如果稀有类别可能在某一折中缺失,这一点就很重要。
  • 分组 k 折:将同一组的所有示例(例如同一名患者、同一段视频或同一采集地点的数据)放在同一个折中,确保模型不会在与训练图像近重复的样本上进行验证。分层分组 k 折会同时满足这两项约束。
  • 时间序列划分:每一轮只使用过去的数据进行训练,并在随后时间段的数据上验证,同时逐轮扩展训练窗口,因为打乱按时间排序的数据会让模型看到未来信息。
  • 嵌套交叉验证:在每个外层折中运行内层交叉验证循环来调优超参数,因此外层评分不会因为在同一批折上调优和评估而虚高。

深度学习中的交叉验证#

将深度网络训练 k 次会使计算成本增加 k 倍,因此 ImageNet和 COCO等大型数据集会使用固定的验证集划分,因为其规模已经足以得到稳定评分。对于只有几百到几千张图像的小型视觉数据集,交叉验证很有价值,因为单个验证集划分中每个类别的样本可能少得可怜。Ultralytics K 折交叉验证指南使用 scikit-learn 的 KFold将检测数据集分成五折,为每一折写入训练和验证图像列表以及数据集 YAML,并在每一折上训练一个 YOLO26模型。由于检测图像通常包含多个类别,因此无法根据单个标签进行分层;该指南还会记录每一折中各类别的验证标签与训练标签之比。

  • 留出验证:只进行一次划分(例如 80/20),并评分一次。它只需进行一次训练,适合大型数据集,但评分取决于哪些样本被分到了验证集。
  • 自助法:通过有放回抽样构造训练集,并在每个模型抽样时未抽中的样本上评分。K 折会在不放回的情况下划分数据,因此每个样本恰好位于一个折中。
  • 测试集评估:交叉验证用于在模型和设置之间进行选择。单独的测试集始终不参与任何折,用于给选出的模型提供最终估计。

探索解决方案

体育领域的计算机视觉

体育领域的计算机视觉

了解 Ultralytics YOLO 如何通过球员和球追踪、表现分析、教练洞察及运动员康复,推动体育视觉技术的发展。
了解详情
航空影像计算机视觉

航空影像计算机视觉

使用 Ultralytics YOLO 将无人机和航空影像转化为农业、水产养殖、保护工作和地理空间分析的实时洞察。
了解详情
航空航天中的计算机视觉

航空航天中的计算机视觉

使用 Ultralytics YOLO 将计算机视觉应用于航空航天领域,包括飞机检查、跑道 FOD 检测、机场地面作业和复合材料缺陷检测。
了解详情
安防领域的计算机视觉

安防领域的计算机视觉

使用 Ultralytics YOLO 模型守护每个场所。视觉 AI 可用于周界监控、威胁检测、车牌识别和工作场所安全。
了解详情
机器人领域的计算机视觉

机器人领域的计算机视觉

使用 Ultralytics YOLO 模型提升智能机器的能力。机器人领域的视觉 AI 可用于自主导航、感知、目标跟踪和实时控制。
了解详情
物流中的计算机视觉

物流中的计算机视觉

借助 Ultralytics YOLO 模型优化物流流程。视觉 AI 可用于包裹检查、分拣、车辆跟踪和仓库安全实时监控。
了解详情
零售中的计算机视觉

零售中的计算机视觉

借助 Ultralytics YOLO 模型重新构想零售。视觉 AI 可用于库存跟踪、货架监控、排队管理和更深入的客户洞察。
了解详情
医疗领域的计算机视觉

医疗领域的计算机视觉

借助 Ultralytics YOLO 模型构建医疗解决方案。医疗领域的视觉 AI 可加快医学影像处理、优化诊断并监测患者。
了解详情
制造业中的计算机视觉

制造业中的计算机视觉

利用 Ultralytics YOLO 模型优化制造流程。视觉 AI 可用于质量控制、缺陷检测、个人防护装备合规检查和装配线自动化。
了解详情
汽车领域的计算机视觉

汽车领域的计算机视觉

利用 Ultralytics YOLO 模型在汽车领域应用计算机视觉。视觉 AI 可提升道路安全、驾驶辅助和车辆自动化水平,让道路更智能。
了解详情
农业中的计算机视觉

农业中的计算机视觉

借助 Ultralytics YOLO 模型,将视觉 AI 引入智慧农业。为作物监测、牲畜追踪和精准农业提供支持,从而提高产量并实现更智能的生产。
了解详情

让我们携手构建 AI 的未来!

开启你的旅程,迎接机器学习的未来