想象你正在备战高考。桌上有三样东西:一摞练习册、一沓模拟试卷,以及一个贴着「绝密」标签的信封,里面装着历年高考真题。练习册用来打基础,一遍遍刷题纠错;模拟试卷用来检验复习效果、调整冲刺策略;而那封真题,不到考前你绝不会打开——它代表着对你真实水平的最终裁决。 训练一个机器学习模型,和备战高考如出一辙。喂给模型的练习册叫训练集,用来让模型学习知识;模拟考试叫验证集,用来调参数、选方案;那封绝密真题叫测试集,只在模型真正定型后才揭开面纱。三者的分工、划分比例,以及你对它们的「使用纪律」,直接决定了模型在真实世界中的表现。 本文用这个备考故事,带你彻底搞懂训练集、验证集、测试集的关系,并深入理解数据泄漏、交叉验证、调参纪律等关键概念,帮你建立一套规范的模型评估方法论。

岗位关联

对 AI 从业者来说,三集划分是机器学习的基本功。它决定了你交付的模型是真实可用还是自欺欺人——无论是做业务项目、写论文还是面试,这套方法论都绕不开。

目录
  1. 可视化演示
  2. 三集各司其职
  3. 划分比例
  4. 过拟合警报
  5. 数据泄漏风险
  6. 独立同分布
  7. 交叉验证
  8. 调参纪律
  9. 评估规范
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

本节配有交互动效(进入视口后自动加载,约 3KB)。

数据划分——训练/验证/测试 训练集:拟合模型参数(70%) 验证集:调超参数(15%) 测试集:最终评估(15%) 测试集只用一次,不可反复使用

三集各司其职

回到备战高考的小明。他的书桌上有三样宝贝:练习册、模拟卷,和贴着「绝密」的真题信封。练习册随时翻、随时刷,错了就重刷;模拟卷每周做一次,用来检查本周复习效果、决定下周调整方向;而那封真题,他从来不动——那是高考前一天用来检验真实水平的。三样资料,三种使命,缺一不可。

机器学习模型的开发流程,和小明备考一模一样。我们把收集来的数据切成三份:训练集对应练习册,验证集对应模拟卷,测试集对应高考真题。训练集用来更新模型参数,验证集用来比较不同超参数组合的效果,测试集则用来回答所有人最关心的问题:模型在从未见过的数据上到底表现如何?

三者最根本的要求是互斥:一组数据一旦被划入测试集,就绝不能出现在训练过程中,否则模型就像提前背过答案的考生,测试成绩没有任何参考价值。更严谨地说,我们希望训练集、验证集、测试集都从同一个数据分布中采样,彼此独立、互不重叠。

所以,训练、验证、测试不是可以随意互换的角色。小明永远不会先看真题再做模拟卷,模型训练也一样:练习刷够、模拟考好、最后才打开真题,三场「考试」各就各位,模型成长的每一步都被记录得清清楚楚。

D=Dtrain∪Dval∪Dtest,Dtrain∩Dval=∅,Dtrain∩Dtest=∅\displaystyle D = D_{train} \cup D_{val} \cup D_{test}, \quad D_{train} \cap D_{val} = \emptyset, \quad D_{train} \cap D_{test} = \emptyset
这个公式描述了「三集互斥」的硬性要求:全部数据 D 被分成三份,训练集、验证集、测试集两两之间都没有交集。
  1. 全部数据 DD 表示我们手中所有样本的总和,相当于小明书桌上全部复习资料。
    D\displaystyle D
  2. 训练集 D_train训练集是模型真正接触并学习的部分,就像小明天天翻看的练习册。
    Dtrain\displaystyle D_{train}
  3. 验证集 D_val验证集用于模型选择和调参,如同模拟考试卷,检验复习策略是否有效。
    Dval\displaystyle D_{val}
  4. 测试集 D_test测试集是最终考核依据,模型定型前严禁触碰,如同封存的高考真题。
    Dtest\displaystyle D_{test}
  5. 交集为空任意两个集合的交集都是空集,保证任何一条样本不会同时出现在两个集合里。
    Dtrain∩Dval=∅, Dtrain∩Dtest=∅\displaystyle D_{train} \cap D_{val} = \varnothing, \ D_{train} \cap D_{test} = \varnothing

划分比例

假如小明一共有 100 天复习时间,他会怎么分配?大概率是 70 天刷练习册、20 天做模拟卷、最后 10 天做真题。这个比例不是拍脑袋定的:训练时间太少,知识学不扎实;模拟时间太少,策略调整没依据;真题时间太少,心里完全没底。

这个思路对应数据集的划分比例。机器学习中最经典的划分是 70% 训练、20% 验证、10% 测试,也就是 7:2:1。当数据有几十万甚至上百万条时,验证集和测试集的比例可以进一步缩小,比如 98:1:1——因为此时哪怕 1% 也有上万条样本,足以给出可靠的评估。

但当数据很少,比如只有两三千条样本时,按 7:2:1 划分会让验证集和测试集太小,评估结果波动很大。这时通常会考虑交叉验证,把数据切分成多份轮流当验证集,既维持训练数据量,又让评估更稳定。

比例划分没有绝对正确答案,但有清晰的原则:训练集要足够大,大到模型能学到本质规律;验证集要足够大,大到能区分不同方案的好坏;测试集要足够大,大到评估结果可信。就像高考前的时间分配,每个人各不相同,但科学的分配方式一定经得起推敲。

Ntrain:Nval:Ntest=7:2:1\displaystyle N_{train} : N_{val} : N_{test} = 7 : 2 : 1
这是最经典的样本量分配经验法则,强调在「学得够」和「考得准」之间取得平衡。
  1. 训练集样本数 N_trainN_train 是训练集里的样本数量,对应小明刷题的总天数,越多学得越充分。
    Ntrain\displaystyle N_{train}
  2. 验证集样本数 N_valN_val 是验证集里的样本数量,对应模拟考试次数,太少则调参结果不可靠。
    Nval\displaystyle N_{val}
  3. 测试集样本数 N_testN_test 是测试集里的样本数量,对应最终自测的题量,太少则评估结果方差大。
    Ntest\displaystyle N_{test}
  4. 比例 72:1:训练、验证、测试按 7:2:1 分配,是经验上最常用的起始比例,可随数据规模调整。
    7:2:1\displaystyle 7 : 2 : 1

过拟合警报

小明发现一个奇怪的现象:有些同学练习册上的题目全部会做,考试却一塌糊涂。为什么?因为他们不是在学知识,而是在背题。题目数字稍微变一变,立刻不会做。这就像一个只会背标准答案的模型。

在机器学习里,这个现象叫过拟合:模型把训练数据记得太牢,甚至把噪声和偶然性都背了下来,导致它在训练集上表现出色,一遇到新数据就原形毕露。过拟合是模型评估的头号敌人。

如何发现过拟合?靠验证集。训练过程中我们可以记录两条曲线:训练误差和验证误差。正常情况下两条曲线一起下降;但到达某个临界点后,训练误差继续下降,验证误差却开始上扬——模型开始「背题」了。这个临界点就是最佳训练停止位置,对应技术叫早停法。

验证集就是过拟合的警报器。没有它,我们只看到训练误差节节下降,会误以为模型越来越好,直到上线才发现残酷的真相。每一次模拟考,都是为了避免高考翻车。

过拟合  ⟺  Etrain(t)≪Eval(t) 且 dEvaldt>0\displaystyle \text{过拟合} \iff E_{train}(t) \ll E_{val}(t) \ \text{且} \ \frac{dE_{val}}{dt} > 0
过拟合的判断条件:训练误差远小于验证误差,且验证误差还在上升——模型记住答案但没学会规律。
  1. 训练误差 E_train(t)训练误差衡量模型对训练数据的拟合程度,它持续下降常常会误导我们。
    Etrain(t)\displaystyle E_{train}(t)
  2. 验证误差 E_val(t)验证误差衡量模型对新数据的适应能力,是过拟合的「照妖镜」。
    Eval(t)\displaystyle E_{val}(t)
  3. 远小于符号E_train 远小于 E_val,说明模型在见过的题上表现远好于没见过的题,典型背题症状。
    ≪\displaystyle \ll
  4. 验证误差导数大于零验证误差随时间上升,代表模型越训练反而越糟糕,过拟合已经开始。
    dEvaldt>0\displaystyle \frac{dE_{val}}{dt} > 0

数据泄漏风险

假如小明在考前偷偷拿到了高考真题,并把它当作练习题反复做。高考那天他轻松满分,但所有人都明白:这个分数不代表真实水平。考试的意义被彻底摧毁了。这就是数据泄漏——你无意中把「答案」提前喂给了模型。

数据泄漏有三种常见方式。第一种是预处理泄漏:比如先对全量数据计算均值和方差再做归一化,相当于把测试集的信息带进了训练流程。第二种是时间穿越:用第 7 天的数据预测第 1 天,在时间序列任务中尤其常见。第三种是重复样本:同一份数据因重复采集被同时分入训练集和测试集。

数据泄漏会让模型的评估分数虚高。你以为模型 AUC 到了 0.95,实际部署后可能只有 0.70。这种虚假的信心比模型差更危险,因为你会带着错误预期上线,等到真实环境里才发现问题,已经造成损失。

守住真题的密封性,和备考时守住考卷密封性一样重要。泄漏的每一分答案,都会变成上线后的加倍损失。

Dtrain∩Dtest≠∅⇒R^<Rtrue\displaystyle D_{train} \cap D_{test} \neq \emptyset \Rightarrow \hat{R} < R_{true}
数据泄漏的数学表达:当训练集和测试集出现重叠时,我们估计出来的错误率会低于真实错误率,评估结果虚高。
  1. 训练集与测试集交集D_train ∩ D_test 不为空意味着有一条样本同时出现在训练和测试中,形成泄题。
    Dtrain∩Dtest≠∅\displaystyle D_{train} \cap D_{test} \neq \emptyset
  2. 估计误差 R_hatR_hat 是在有泄漏的数据上测得的误差率,它通常低得诱人但不可信。
    R^\displaystyle \hat{R}
  3. 真实误差 R_trueR_true 是模型在真实无污染数据上的误差率,只有它才反映真实水平。
    Rtrue\displaystyle R_{true}
  4. 小于关系有泄漏时的评估结果总是优于真实水平,这正是数据泄漏最危险的后果。
    R^<Rtrue\displaystyle \hat{R} < R_{true}

独立同分布

高考命题有一个基本前提:考试内容和平时教学必须遵循同一本考纲。练习册里全是微积分题,高考却考线性代数,再努力也白搭。这个前提在机器学习中叫独立同分布。

独立同分布包含两层含义。「独立」指每个样本的采集互不影响,比如小明做第 1 道题和第 2 道题是独立的,不会因为第 1 题不会做就影响第 2 题的答案;「同分布」指训练集和测试集都来自同一个概率分布,训练时见到的题型组合多样,测试时也应当同样多样。

为了保证同分布,最简单也最关键的动作是随机打乱——先把所有样本随机重排,再按比例切分,避免数据按时间或批次排列带来的系统性偏差。对于类别不平衡的数据,还要用分层采样:按类别比例抽取样本,让训练集和测试集的分类比例保持一致。

如果训练集和测试集的分布不一致,比如训练时只有白天的日志,测试时却混入夜晚的数据,模型的评估就会失真。就像用一本超纲练习册去备考,练得再狠,也练不出高考要考的能力。

Ptrain(x,y)=Ptest(x,y)\displaystyle P_{train}(x, y) = P_{test}(x, y)
这条公式要求训练数据和测试数据来自相同的联合分布,是「考纲一致」的数学表达。
  1. 训练分布 P_train(x, y)训练集上样本特征 x 和标签 y 的联合分布,描述练习题的出题规律。
    Ptrain(x,y)\displaystyle P_{train}(x, y)
  2. 测试分布 P_test(x, y)测试集上的联合分布,描述高考真题的出题规律。
    Ptest(x,y)\displaystyle P_{test}(x, y)
  3. 等号成立两个分布相等则说明平时练习和最终考核遵循同一套考纲,模型学到的规律才能迁移。
    =\displaystyle =

交叉验证

备考资料太少怎么办?小明一共只有 5 套模拟卷,却想做 20 次模拟考来检验自己。他舍不得一次全用掉,于是每次只考其中 2 套,其余 3 套用来复习,考完再轮换下一批。这样每套卷子都被考过一次,数据利用率大大提升——这就是交叉验证的思路。

K 折交叉验证把数据集均匀切成 K 份,每次取 1 份作为验证集,其余 K−1 份作为训练集,训练 K 次。验证误差取 K 次结果的平均值,能够有效降低单次随机划分造成的波动。K 通常取 5 或 10,兼顾计算成本和评估稳定性。

当样本量极少,比如只有 20 条时,可以取 K=n,即每次只留 1 条样本验证,其余全部训练,这就是留一法。此外还有分层 K 折(保证每折类别比例一致)和时间序列的滚动切分(按时间顺序切分,防止未来信息泄漏)等变体,分别应对不同场景。

交叉验证不是用来替代测试集的,它更像是把有限的模拟卷反复规划利用。最终,我们仍然需要一个从未参与过任何训练与验证的测试集,来回答最严肃的问题:模型到底行不行?

ECV=1K∑k=1KEk\displaystyle E_{CV} = \frac{1}{K} \sum_{k=1}^{K} E_k
交叉验证误差是 K 次验证误差的平均值,用「多轮模拟考」的平均分代替「一次模拟考」的偶然分。
  1. 折数 KK 表示把数据切成几份,常见取 5 或 10,对应做几轮模拟考试。
    K\displaystyle K
  2. 第 k 折验证误差 E_kE_k 是第 k 次用第 k 份数据做验证时得到的误差。
    Ek\displaystyle E_k
  3. 求和符号把 K 次验证误差全部累加起来,相当于统计全部模拟考的总失分。
    ∑k=1K\displaystyle \sum_{k=1}^{K}
  4. 取平均累加结果除以 K 得到平均验证误差,就是模型稳定表现的综合估计。
    1K\displaystyle \frac{1}{K}

调参纪律

小明给自己定下严格的规矩:模拟卷随便做,做错了可以复盘、重做;但真题信封不到最后一周绝不拆开。因为他清楚,模拟卷的作用就是暴露问题,暴露得越多越好;真题的意义是最终检验,提前拆开等于自欺欺人。

调参纪律同样严格。验证集可以反复使用——你可以在验证集上比较不同的超参数组合,选择表现最好的一组。但测试集只能碰一次:当模型最终定型后,用测试集给出一次最终评估结果。之后不能再回头调整参数再测一次。

为什么如此严格?因为每看一眼测试集,都可能把测试集的某些信息悄悄带入决策过程。虽然主观上没让模型看到测试集,但多次基于测试结果调参,相当于远程「偷看」,最终导致测试误差不断被低估,这就是偷看累积偏差。用数学语言说,我们的参数应当从验证集上选出,而不是从测试集上选出。

纪律看起来死板,但它保护的正是测试集作为「终极裁判」的客观性。没有这份纪律,测试集就不再是测试集,模型评估就变成了一场没有裁判的自嗨。

θ∗=arg⁡min⁡θJval(θ)\displaystyle \theta^* = \arg\min_{\theta} J_{val}(\theta)
最优参数 θ* 是在验证集损失最小的参数,验证集是唯一允许参与调参决策的数据集。
  1. 模型参数 θθ 代表模型的各种可调参数和超参数,相当于小明为高考制定的各种复习策略。
    θ\displaystyle \theta
  2. 验证集损失 J_val(θ)J_val 衡量在验证集上使用当前参数的效果,得分越低说明策略越有效。
    Jval(θ)\displaystyle J_{val}(\theta)
  3. argmin 运算argmin 表示在所有可能的参数组合中找出让验证集损失最小的那一个。
    arg⁡min⁡θ\displaystyle \arg\min_{\theta}
  4. 最优参数 θθ 是最终选定的模型参数,这个选择过程只参考验证集,绝不参考测试集。
    θ∗\displaystyle \theta^*

评估规范

一次模拟考成绩代表不了什么。小明状态好时考 680 分,状态差时只有 630 分,真实水平可能在 650 分上下。老师和家长更关心的不是某一次分数,而是多次考试成绩的均值和波动范围——波动越小,说明复习越扎实。

模型评估也应当多次运行、看统计量。即使数据划分固定,随机初始化、数据顺序、训练过程中的随机性都会让模型产生波动。对多次运行结果取平均值和标准差,并用置信区间表达不确定性,远比报告单次分数更有说服力。

规范的评估流程还要求:统一评估指标(分类看准确率、召回率或 AUC,回归看 MAE 或 MSE),明确数据划分方式,记录预处理步骤和超参数,最终在报告中完整呈现。这样别人才能复现并信任你的结论。

一份扎实的评估报告,就像一份完整的模拟考成绩单:有平均分、有波动范围、有过程记录。它不会承诺模型一定成功,但会让所有人对模型的真实能力心里有底。这才是测试集封存一个项目周期的最终意义。

Eˉ=1M∑m=1MEm,s=1M−1∑m=1M(Em−Eˉ)2\displaystyle \bar{E} = \frac{1}{M}\sum_{m=1}^{M} E_m, \quad s = \sqrt{\frac{1}{M-1}\sum_{m=1}^{M}(E_m - \bar{E})^2}
多次实验的均值决定了模型的平均水平,标准差决定了模型的稳定性,两者结合才是完整的评估结果。
  1. 第 m 次实验误差 E_mE_m 是第 m 次重复训练得到的误差,相当于某一次模拟考的成绩。
    Em\displaystyle E_m
  2. 平均误差 E_bar对 M 次实验误差取平均得到均值,代表模型的平均表现水平。
    Eˉ=1M∑m=1MEm\displaystyle \bar{E} = \frac{1}{M}\sum_{m=1}^{M} E_m
  3. 标准差 s标准差刻画多次实验的波动幅度,值越小说明模型越稳定,像多次模拟考成绩都接近 650 分的孩子。
    s=1M−1∑m=1M(Em−Eˉ)2\displaystyle s = \sqrt{\frac{1}{M-1}\sum_{m=1}^{M}(E_m - \bar{E})^2}

AI 应用场景

信贷风控模型开发

阶段:数据准备与模型选择

解决的问题:金融风控中,如果直接用全量历史数据训练,再用同批数据评估,模型性能会被严重高估。通过训练/验证/测试三集规范流程,可以避免数据泄漏和过拟合,让模型上线前就接受「高考真题」的检验。

具体案例:某银行信贷部门开发违约预测模型,将 168 万条历史客户数据按 7:2:1 划分。训练集用于学习不同客群的还款规律,验证集用于比较逻辑回归与梯度提升树的优劣,测试集则作为最终上线决策的唯一依据。最终模型在测试集上的 AUC 为 0.83,与部署后的真实表现基本一致。

电商推荐系统离线评估

阶段:离线评估与模型迭代

解决的问题:推荐系统的用户行为具有强时间顺序,用随机划分会让模型「用未来预测过去」。按时间切分训练/验证/测试集,才能真实评估推荐效果。

具体案例:某电商平台基于用户过去 90 天行为训练推荐模型,将前 60 天数据作为训练集,中间 15 天作为验证集调参,最后 15 天作为测试集评估。测试集中模型推荐的点击率达到 4.2%,与线上 AB 测试结果相差不到 0.3 个百分点。

医学影像小样本建模

阶段:模型验证与报告

解决的问题:医学影像数据稀缺且类别不平衡,单次随机划分的评估结果方差极大。利用分层 K 折交叉验证可以在验证阶段充分利用数据,最后再用独立测试集给出权威结论。

具体案例:某医院开发肺炎 X 光片识别模型,仅 2000 例影像。团队使用分层 5 折交叉验证选择模型结构,每折保证正负样本比例一致,最终在从未参与调参的独立测试集上报告 AUC = 0.91,并给出了 95% 置信区间。

Python 演示

python48 行
"""三集划分 + 决策树调参, 直观演示过拟合"""from sklearn.datasets import make_classificationfrom sklearn.model_selection import train_test_splitfrom sklearn.tree import DecisionTreeClassifierfrom sklearn.metrics import accuracy_score  def main():    # 1. 生成 3000 条模拟分类数据    X, y = make_classification(        n_samples=3000, n_features=20,        n_informative=8, random_state=42,    )     # 2. 先切出 30% 作为暂存数据(验证+测试)    X_train, X_temp, y_train, y_temp = train_test_split(        X, y, test_size=0.3, random_state=42, stratify=y,    )     # 3. 暂存数据对半分: 一半验证集, 一半测试集    X_val, X_test, y_val, y_test = train_test_split(        X_temp, y_temp, test_size=0.5, random_state=42,        stratify=y_temp,    )    print(f"训练集: {len(X_train)} 样本")    print(f"验证集: {len(X_val)} 样本")    print(f"测试集: {len(X_test)} 样本")     # 4. 在验证集上比较不同深度的决策树    best_depth, best_acc = 1, 0.0    for depth in [2, 5, 10, 20]:        clf = DecisionTreeClassifier(max_depth=depth, random_state=42)        clf.fit(X_train, y_train)        train_acc = accuracy_score(y_train, clf.predict(X_train))        val_acc = accuracy_score(y_val, clf.predict(X_val))        print(f"depth={depth:>2} 训练准确率={train_acc:.3f} 验证准确率={val_acc:.3f}")        if val_acc > best_acc:            best_acc, best_depth = val_acc, depth     # 5. 用测试集做最终评估    final_model = DecisionTreeClassifier(max_depth=best_depth, random_state=42)    final_model.fit(X_train, y_train)    test_acc = accuracy_score(y_test, final_model.predict(X_test))    print(f"最佳深度={best_depth}, 最终测试准确率={test_acc:.3f}")  if __name__ == "__main__":    main()
目的:演示完整的三集划分流程——用训练集训练、验证集调参、测试集终审,并直观展示决策树深度过大时如何引发过拟合。
  1. X, y = make_classification(...)生成 3000 条带标签的模拟数据,相当于准备原始题库。
  2. X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.3, ...)先切出 30% 作为暂存,剩余 70% 留给训练。
  3. X_train, X_temp, y_train, y_temp = train_test_split(X_temp, y_temp, test_size=0.5, ...)将暂存的 30% 对半分成验证集与测试集,实现 7:2:1。
  4. clf.fit(X_train, y_train)模型只接触训练集,类似小明只翻阅练习册。
  5. val_acc = accuracy_score(y_val, clf.predict(X_val))在验证集上打分,找出泛化能力最强的深度。
  6. if val_acc > best_acc:比较各深度在验证集上的成绩,选出最佳方案。
  7. final_model.fit(X_train, y_train)用选定的深度重新训练最终模型。
  8. test_acc = accuracy_score(y_test, final_model.predict(X_test))测试集只碰这一次,给出最终裁决。

常见误区

误区我总觉得测试集是浪费数据。应该多分点给训练集才准确,测试集随便留几百条意思一下就可以了。

正解测试集是用来评估真实泛化能力的,样本太少时评估结果方差极大。比如测试集只有 30 条,正确率 90% 和 60% 可能只差几条样本,纯属噪声。应保证测试集有足够样本量,小样本时可借助交叉验证在验证阶段充分利用数据,而不是压缩测试集。

为何常见:直觉上模型性能主要取决于训练数据量,所以人们会下意识压缩测试集的比例。

误区测试集每次测完把结果反馈给训练,多迭代几次模型只会越来越好,这不就是正常的模型调优吗?

正解每一次看测试集结果,都相当于变相把测试信息泄漏进模型选择过程。反复迭代后,模型会在测试集上过拟合——并非真的泛化到生产环境。正确的纪律是:验证集可以反复用,测试集最终只评估一次。

为何常见:人们把测试集想象成练习卷,忽略了它作为「高考真题」的特殊地位。

误区归一化、标准化只是简单缩放,对全量数据做更稳定,先切分再做反而麻烦。

正解如果先用全量数据算出均值和方差再归一化,测试集的统计信息就已经进入了训练流程,属于典型的数据泄漏。正确做法是:只在训练集上拟合标准化器,再用同一标准化器变换验证集和测试集。

为何常见:预处理被当作「无关紧要的缩放」,没有意识到它也是信息流动的通道。

误区交叉验证误差已经把数据利用率最大化,结果足够可靠,还要测试集干什么?

正解交叉验证是在验证集层面反复利用数据,解决的是「如何选择和调优模型」的问题;但它无法替代一个从未参与过决策的测试集来提供最终客观评估。两者是配合关系,而非替代关系。

为何常见:交叉验证听起来很专业,让人误以为可以一步到位,忽略了它仍然偏重「选择」而非「终审」。

面试题

Q1. 训练集的主要作用是什么?

单选题 · easy

  • A.调整模型的超参数
  • B.学习模型的可训练权重← 正确答案
  • C.选择最佳模型结构
  • D.评估模型最终性能

答案:B。训练集通过反向传播等算法更新模型的权重和偏置,也就是可训练参数。超参数由人工设定,模型结构选择靠验证集,最终性能要靠测试集评估。就像练习册用来学知识,模拟卷用来定策略,高考题用来测水平。

Q2. 验证集的核心职责是什么?

单选题 · easy

  • A.训练模型权重参数
  • B.扩充原始数据规模
  • C.调整参数并选择模型← 正确答案
  • D.部署到生产环境里

答案:C。验证集的作用是帮助我们在多个超参数或模型之间做选择,相当于模拟考。训练集负责学习参数,测试集负责最终评估,部署则是上线阶段的事,都不归验证集直接负责。

Q3. 下列哪一组是经典的三集划分比例?

单选题 · easy

  • A.5:3:2
  • B.7:2:1← 正确答案
  • C.9:1:0
  • D.1:1:1

答案:B。7:2:1 是流传最广的经验比例,70% 用于训练、20% 用于验证、10% 用于最终测试。9:1:0 没有测试集,等于高考不设考卷,无法评估真实水平。

Q4. 过拟合的典型标志是什么?

单选题 · mid

  • A.训练误差低验证误差高← 正确答案
  • B.训练误差高验证误差低
  • C.训练和验证误差都高
  • D.训练和验证误差都在降

答案:A。训练误差低说明模型把训练数据背熟了;验证误差高说明它没学到泛化规律,像只会背题的学生一遇新题就懵。若两者误差都很高往往是欠拟合,两者都在下降则说明训练正常。

Q5. 以下哪些操作属于数据泄漏?

多选题 · mid

  • A.用全量数据计算均值做归一化← 正确答案
  • B.只在训练集上拟合归一化参数
  • C.测试集中的样本同时出现在训练集← 正确答案
  • D.用未来数据预测过去时刻← 正确答案

答案:ACD。A 把测试集统计信息带入了预处理流程,属于泄漏;C 是重复样本泄漏;D 是时间穿越泄漏。B 是正确做法,归一化参数只从训练集学习,验证集和测试集只用同一个参数变换。

Q6. 留一法(LOOCV)本质上是什么?

单选题 · mid

  • A.每次只留一个样本做验证← 正确答案
  • B.训练一次就立即停止
  • C.把测试集当作验证集使用
  • D.随机采样且不切分数据

答案:A。留一法就是 K=T 的交叉验证,T 个样本每次用 T−1 个训练、1 个验证,重复 T 次。它最大化训练数据利用率,但计算开销极大,适合小样本场景。

Q7. 某模型训练准确率 99.5%,测试准确率只有 53%,最可能的原因是什么?

单选题 · hard

  • A.模型此时出现欠拟合
  • B.训练集样本数量太少
  • C.模型已经严重过拟合← 正确答案
  • D.测试集分布出现偏差

答案:C。训练与测试差距悬殊是过拟合的典型特征——模型近乎背下了训练集却完全无法泛化。欠拟合通常训练误差本身就高;样本太少可能同时拉低两边成绩;测试集分布有偏也会影响测试分数,但「训练极高+测试极低」的组合首先指向过拟合。

Q8. 关于测试集的使用纪律,哪些说法正确?

多选题 · mid

  • A.调参阶段禁止触碰测试集← 正确答案
  • B.测试集可以反复用于调参
  • C.模型定型后测试集只评估一次← 正确答案
  • D.测试集可以直接参与训练

答案:AC。测试集的定位是最终裁决,调参阶段必须完全隔离,定型后只评估一次。反复使用测试集等于变相泄漏,参与训练更会彻底毁掉评估的客观性。这就像高考真题绝不能当模拟卷反复刷。

Q9. K=10 折交叉验证,总样本 2000 个,每折验证集有多少样本?

单选题 · hard

  • A.每折验证集有 200 个样本← 正确答案
  • B.每折验证集有 1800 个样本
  • C.每折验证集有 2000 个样本
  • D.每折验证集有 100 个样本

答案:A。K 折验证将数据等分为 K 份,每份就是一组验证集。总样本 2000 除以 10 等于 200,所以每折验证集 200 条,训练集 1800 条。这是交叉验证「轮流坐庄」的基本结构。

Q10. 关于独立同分布假设,哪些说法正确?

多选题 · extreme

  • A.训练集与测试集同分布← 正确答案
  • B.样本之间相互独立← 正确答案
  • C.训练测试样本可重复出现
  • D.分布偏移会损害泛化能力← 正确答案

答案:ABD。独立同分布要求样本独立采样且训练集与测试集来自同一分布,对应「考纲一致」。样本重复出现违反独立性,分布偏移意味着同分布前提被破坏,两者都会让模型评估失真。这正是随机打乱和分层采样存在的原因。