跳到正文

验证集分布:以部署目标为准

验证集应代表部署目标;结合分层、按组和按时间切分,避免数据泄漏与评估偏差

原题:在构建机器学习模型时,验证集的类别分布应如何设计?它应当与训练集、测试集保持怎样的关系?为什么?

项目与经历 · 字节真题

回答与解析

先确定验证集要代表什么

验证集不是机械地复制训练集分布,而是用来选择模型、阈值和超参数,因此应尽量代表部署时要优化的目标分布

  • 如果线上样本近似独立同分布,可在按类别分层后随机切分,使训练、验证和测试的类别比例接近。
  • 如果同一用户、设备、病例或文档会产生多条样本,应按组切分,避免同一实体跨集合造成泄漏。
  • 如果任务存在时间演化,应按时间切分:用过去训练、较新的时间窗验证、更晚的时间窗测试。
  • 如果要声明跨域泛化能力,可以有意让验证集或测试集来自新地区、新设备或新业务域。

三个集合的关系

训练集用于拟合参数;验证集用于方案选择;测试集只用于最后一次或受控次数的泛化声明。验证集可以与训练集不同分布,但必须贴合要优化的部署目标。测试集是否与验证集同分布取决于最终声明范围;二者同分布本身不是泄漏,只有把测试样本、标签或测试结果用于调参和方案选择才是测试污染。

类别不均衡时,不应只追求三个集合比例完全相同。先保证每个关键类别有足够的验证样本,再按业务代价选择 macro-F1、PR-AUC、召回率、校准或分组指标。切分后还要检查重复样本、时间穿越、实体交叉和预处理统计量泄漏;标准化、特征选择和重采样只能在训练折内拟合。

口语版讲法(约3分钟)

  • 先从部署目标反推验证分布
  • 按随机、时间、组和域外任务选择切分
  • 区分模型选择与最终测试
  • 检查类别覆盖和数据泄漏

这道题我不会先回答“验证集一定要和训练集同分布”,因为真正的问题是:我们希望用验证集替哪一种未来场景做决策。验证集会参与模型、超参数和阈值选择,所以它首先要代表部署时要优化的目标分布。

如果线上样本近似独立同分布,我会先按类别分层,再随机切分,让训练、验证和测试的类别比例大致可比。但只看类别比例不够。如果同一用户、设备、病例或者文档能产生很多相似样本,就要按组切分,不能让同一个实体同时出现在训练集和验证集里,否则指标会虚高。时间序列或内容推荐场景则应按时间切分,用过去训练、较新的时间窗验证、再用更晚的窗口测试。这样验证集与训练集本来就会有分布差异,而这正是我们想模拟的部署漂移。若目标是跨地区或跨设备泛化,也可以专门保留一个域外验证集。

三个集合的职责要分清。训练集用来拟合参数,验证集用来选择方案,测试集只用于最终泛化声明。验证集和测试集来自相同目标分布并不等于测试泄漏;真正的泄漏是反复看测试结果调参数,或者把测试样本和标签间接带进训练流程。标准化、特征选择、缺失值填补和重采样也必须只在训练折上拟合,再应用到验证折。

类别不均衡时,我不会为了让比例完全一致而牺牲关键类别的样本量。我会先保证少数类有足够样本,再根据业务代价看 macro-F1、PR-AUC、召回率或校准,而不是只看 accuracy。验证集大小也要支持稳定决策:我会给关键指标算置信区间,按类别和用户群分桶,避免几条少数类样本就决定模型版本。若要反复迭代很多次,还会保留一个不参与日常调参的二级验证集,防止团队逐渐对主验证集过拟合。最后我会检查近重复样本、实体交叉、时间穿越和预处理统计泄漏,并把切分规则固化成可复现代码。

所以我的判断标准不是“验证集像不像训练集”,而是它能不能可靠回答:这个模型在我们准备上线的目标分布上,是否值得被选中。

真正落地时,我会先画出样本生成链路,标出用户、时间、设备和内容来源几个可能造成相关性的轴,再决定切分键。这样比拿到表格后直接随机抽样更可靠。切分完成后,我还会做一张审计表:每个实体是否跨集合、特征统计量在哪个集合拟合、标签延迟是否造成时间穿越、近重复样本是否被拆开。任何一项命中,都先修切分再看模型分数。

还有一个容易忽略的点是阈值。模型结构可以在验证集上选,业务决策阈值也可以在验证集上定,但测试集跑完后不能因为某个群体指标不好看又回头调阈值。若目标分布变化,就重新定义版本和评测窗口,而不是继续消费旧测试集。这样验证集承担日常决策,测试集保留最终裁判职责,结论才经得住复现。

关键一句:验证集应随部署目标设计,但切分规则必须固定并持续监测线上分布漂移。

核验来源

  1. scikit-learn: Cross-validation evaluating estimator performance
  2. scikit-learn: TimeSeriesSplit

面试官还可能这样问

  1. 问法 1 · 场景切入

    假设现在训练数据与未来部署流量的类别比例不同。你会怎样设计验证集,使模型选择真正针对部署目标,而不是机械复制训练集?

  2. 问法 2 · 层层追问

    IID 场景怎样分层切分?……同一用户或文档跨集合有什么风险?……存在时间漂移时怎么切?……验证集与测试集同分布就是泄漏吗?

  3. 问法 3 · 直球技术

    请说明验证集类别分布的设计原则,以及它与训练集、测试集、部署分布的关系;覆盖随机分层、组切分、时间切分、域外评测和不均衡指标。

同模块相关题目