想象你是位经验丰富的数学老师,新学期要带班冲刺期末考。你会怎么使用手头的题库?你绝不会把期末真题直接发给学生当日常练习——那样考出来的分数全是“记忆回放”,毫无参考价值。聪明的做法是把题库拆成三份:一份平时练习册,让学生反复刷题掌握知识点;一份考前模拟卷,帮助学生检查薄弱环节、也帮你调整授课节奏;还有一份严格保密的期末真卷,只在最后时刻亮出来,检验学生这一学期的真实水平。 机器学习模型的训练,正是同一套“考试哲学”。数据集就像老师的题库,模型就像学生。如果让模型把整套题库背下来再回答原题,它当然“满分”,但这只是死记硬背的假象。训练集负责让模型学规律,验证集帮模型调超参数,测试集则全程不参与学习,只在最终评估真实性能。三份数据怎么分、该用哪种策略分、分完如何防止“泄题”与“偏科”,就是本文要展开的核心命题。读完你会发现,数据划分绝不只是“切几刀”的体力活,而是决定模型评估可信度的地基工程。
对 AI 从业者而言,数据划分是简历上最容易被追问的“基本功”——划分方式直接决定模型评估的可信度,一个不慎就会让漂亮的测试指标变成自欺欺人的数字,面试高频、实际工程最易踩坑。
可视化演示
动态演示数据集划分方法与最佳实践的核心机制,通过概览/流程/对比/趋势四种模式展示关键概念与交互流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
数据集划分方法与最佳实践:数据集三 数据集三分法的基本框架 随机划分与分层抽样策略 核心机制可视化 数据集划分方法与最佳实践整体架构与关键组件
三集合角色
老师发试卷从来是分时段的:平时发练习册,让学生刷题掌握知识点;考前发模拟卷,帮助学生适应考试节奏、也让老师判断哪些地方还没讲透;期末最后才发真卷,考查真实水平。三个环节里,练习题用得最多,模拟卷次之,真卷最宝贵——因为它只能考一次,考完就失效了。倘若老师把模拟卷和真卷混着发,学生提前见过了期末真题,那最后分数再高也说明不了真实水平。
机器学习里的三集合划分与此完全同构。训练集像练习册,数据量最大,模型在它上面通过梯度下降一步步“刷题”,学会从输入到输出的映射规律。验证集像模拟卷,模型不在它上面更新参数,但它被用来评估当前模型的泛化能力,指导你选择超参数(如学习率、树的深度)和模型结构。测试集则像严格封存的期末真卷,只允许在模型全部训练完成后使用一次,给出对真实世界性能的无偏估计。
三份数据的分量也有讲究。常见做法是按样本量分配:训练集拿大头,验证集和测试集各拿一块。业界经验是数据量较大时按 7:1.5:1.5 或 6:2:2 划分,数据量较小时验证集和测试集的比例要更克制,免得模型“没题可练”。
回到考试场景:练习册、模拟卷、期末真卷各有不可替代的使命,任何一套被滥用(比如拿真卷天天模拟)都会让最终评分失去意义。三集合各司其职,是数据划分的第一课。
- 总量等式全量数据 D 被拆成三个互不重叠的子集,加起来正好等于原始总量,不多不少。
- 比例分配三个子集的样本数之比近似为 7:1.5:1.5,这是工程上经过大量实践验证的“安全配比”。
划分核心原则
拿到题库之后,这位经验丰富的老师会怎么组卷?首先,练习册里的题目绝不能和期末真卷重复——重复就意味着学生提前背下了答案,互不重叠是底线。其次,模拟卷的难易梯度必须反映真实考试,不能模拟卷全是简单题,期末却全是压轴题,否则练了个寂寞。最后,考题的覆盖范围要代表整个学期的教学目标,不能只考某一章。
这三条朴素经验,对应数据划分的三大原则。第一是互斥性:三个集合之间没有任何重复样本,即任意一个样本只属于训练、验证、测试中的某一个集合。第二是代表性:每个集合都应尽量保持与整体数据相同的分布——类别比例、数值范围、难易占比都要一致。第三是独立同分布假设:我们默认样本是从同一个潜在分布中独立采样的,训练时学到的规律才能在新数据上复现。
一旦违背这些原则,后果会很隐蔽:训练集和测试集有重叠时,测试分数被“背题”虚高;测试集分布和真实场景不一致时,模型上线后性能崩塌。工业界常说“垃圾划分出垃圾评估”,本质上就是这三条原则没守住。
互斥、代表、独立同分布——这三大原则就像试卷的命题纪律。守住它们,模型评估才有说服力;丢失任何一条,后面的所有指标都是沙滩上的城堡。
D_{\text{train}} \cup D_{\text{val}} \cup D_{\text{test}} = D,\qquadD_{\text{train}} \cap D_{\text{val}} = \varnothing,\ \ D_{\text{train}} \cap D_{\text{test}} = \varnothing,\ \ D_{\text{val}} \cap D_{\text{test}} = \varnothing- 并集覆盖三个集合拼在一起还原完整数据集,说明划分没有丢弃任何样本。
- 两两互斥训练集与验证集、训练集与测试集、验证集与测试集之间都没有公共元素,从数学上杜绝“泄题”通道。
随机划分
如果题库里的题目没有隐藏的规律(没有按章节顺序、没有按难度存放),最简单公平的组卷方式是什么?把题库搬到桌上彻底洗牌,然后按份数从上面依次抽取。洗牌动作保证了每份卷子都能混入不同章节、不同难度的题目,不会出现某份卷子恰好全是难题的极端情况。随机性在这里就是公平性。
随机划分正是这个思路。它先把全部样本的顺序打乱(shuffle),再按设定比例依次截取三部分:前 70% 做训练集,中间 15% 做验证集,末尾 15% 做测试集。为了让你每次运行代码得到同一组试卷(方便复现实验),随机划分要设定一个随机种子(random_state)。没有固定种子,同一个模型在不同运行中面对的是不同划分,评估结果会像坐过山车一样忽高忽低,让人分不清改进来自模型还是来自运气。
随机划分的适用条件是数据本身近似独立同分布,且不存在时间先后、组群结构等额外依赖。比如图像分类任务里,上千张猫狗照片没有天然的先后关系,随机洗牌是安全且高效的。但如果样本本身按用户 ID 聚集(同一个人的多张照片),或者按时间戳排列,随机划分就可能在训练与测试之间制造“信息重叠”,需要用后面讲到的更精细方法。
随机划分就像洗牌分卷:简单、公平、可复现。但它默认“题目没有隐藏顺序”——拿到有时间结构的数据还闭眼洗牌,就是这场考试最大的隐患。
N_{\text{train}} = \lfloor p_{\text{train}} \times N \rfloor,\quadN_{\text{val}} = \lfloor p_{\text{val}} \times N \rfloor,\quadN_{\text{test}} = N - N_{\text{train}} - N_{\text{val}}- 训练集取整用训练比例 p_train 乘以样本总数 N 再向下取整,得到训练集样本数。
- 验证集取整同理用验证比例 p_val 计算验证集样本数。
- 测试集补余测试集拿剩下的一切样本,保证总量守恒。
分层抽样
我们再看一个小细节:如果班里有 90 位学生、只有 10 位是学霸,出模拟卷时该让学霸题占多少?答案是维持整体比例——10%。否则模拟卷里学霸题比例过高,全体同学都会被难倒;比例过低,又练不出区分度。聪明的老师会先按“是否学霸”把学生分组,再从每组内各抽 10% 的题目进卷子,保证卷子结构忠于全局。这就是分层抽样的生活原型。
在机器学习中,分层抽样(Stratified Sampling)用于处理类别不平衡问题。假设一个二分类数据集中 90% 是负类、10% 是正类,如果直接随机划分,很可能出现某份子集中正类只剩 3% 的极端情况,造成验证或测试结果失真。分层抽样先按类别标签分层,再从每个类别中分别按比例随机抽取,使得训练集、验证集、测试集中的正负比例都与原始数据保持一致。
分层抽样的关键公式非常直观:第 i 层的抽样数等于计划抽样总数乘以该层在全局中的占比。如果数据还有多层结构(比如先按省份、再按年龄段),可以逐层递归做分层,形成多级分层抽样。它带来的收益是评估稳定性的显著提升——尤其在小数据集或高度不平衡场景下,分层往往比简单随机靠谱得多。
分层抽样就像按比例组卷的“配比师”:每一套卷子的难易结构都和真实考情一致。模型无论拿到哪一份子集,面对的类别环境都和上线后一致,评估自然更可信。
- 类别占比先计算第 i 层的样本数 N_i 在全部样本数 N 中的比例。
- 按比例抽取计划抽取总量 n 乘以此比例,得到该层应抽的样本数 n_i。
时间序列划分
但如果你的题库是“按教学周逐周录入”的,情况就完全不同了。老师出模拟卷时,绝不可能把第 16 周才学到的压轴题提前混进第 8 周的练习册——那样学生提前学习了未来的知识,期末测评就彻底失真。时间把数据刻上了先后顺序,随机洗牌在这里是禁忌。
时间序列数据的划分同样遵循“过去预测未来”的铁律:严格按时间戳切分,训练集只保留某个时间点之前的数据,测试集使用该时间点之后的数据。任何随机打乱都会让模型偷看到“未来信息”,这在现实场景中叫做数据泄漏。比如用 1-11 月销售额预测 12 月销售额,训练集就是 1-11 月的订单,测试集是 12 月的订单,绝不能把 12 月的单子混进训练集。
时序场景也有自己的交叉验证玩法,称为前向链(或滚动窗口验证):把数据切成多个时间段,第一组窗口用早期数据训练、紧邻的后段验证;然后窗口向前滚动,再训练、再验证,反复多次取平均。这种“回测”式评估在金融量化、流量预测、销量预估等领域是标准做法,比单次切分更稳,同时也保留了时间的先后约束。
时间序列划分就是课程表的铁律:练习题永远来自已学章节,期末题永远来自未来内容。忘记这一点,你的模型评估就会像一个提前看过答案的学生,分数高得可笑,实战一塌糊涂。
D_{\text{train}} = \{(x_t, y_t) \mid t \le t_{\text{split}}\},\qquadD_{\text{test}} = \{(x_t, y_t) \mid t > t_{\text{split}}\}- 切分时刻选定一个时间边界 t_split,它是训练与测试的分水岭。
- 训练集取过去所有时间戳不超过 t_split 的样本进入训练集。
- 测试集取未来时间戳大于 t_split 的样本全部归入测试集,模拟“预测未来”。
留出法
回到最朴素的场景:如果时间紧张,老师只想做一次模拟考,那他会怎么做?把题目粗略按“7 份练习题、1 份平时抽查、2 份期末考”差不多的比例直接分三堆,各用各的,考完出个分数。不做多轮轮换,不搞花哨设计——这就是最直觉的留出法(Hold-out),也是许多人第一次划分数据集时随手用的方法。
留出法的技术定义就是:一次性把数据集随机划分成训练集、验证集、测试集三个互斥子集,全程只划一次。它的优点是简单、高效、计算量小,适合数据充足且分布稳定的场景;缺点是单次划分的偶然性大——这次划分恰好把难样本多分到了测试集,模型得分就偏低;下次划分难样本多到了训练集,得分又偏高。数据的“运气”左右了评估结果,这就是常说的方差大。
比例选择上有一些经验值:数据充足时常用 6:2:2,数据很大时可用 8:1:1 甚至 98:1:1,把更多样本留给训练;数据很少时验证和测试各分 10% 甚至更少,但太少会评估不稳。要降低留出法的方差,常见手段是换用下一节的 K 折交叉验证,或者做多次留出后平均——先用不同的随机种子重复划分多次,把多次评估结果平均起来。
留出法就像“只考一次模拟就定志愿”:速度快、操作简单,但一次考试的结果免不了有运气成分。数据量越大,运气的影响越小;数据量越小,就得认真考虑更稳的方案了。
- 设定比例选取合适的留出比例,例如训练 60%、验证 20%、测试 20%。
- 单次切分随机洗牌后按比例一次性生成三个集合,后续不轮换、不调整。
K折交叉验证
既然只考一次模拟卷不放心,经验丰富的老师会怎么做?把题库随机均分成 10 组,第 1 轮拿第 1 组当模拟卷、剩下 9 组当练习册;第 2 轮拿第 2 组当模拟卷……如此轮换 10 轮,最后把 10 次模拟成绩平均。每个题目都有机会当“练习”,也有机会当“考试”,最终分数远比一次模拟稳定——这正是 K 折交叉验证(K-Fold Cross-Validation)。
K 折交叉验证先把完整数据随机均分成 K 个互不重叠的子集(折),每一轮取其中 1 折做验证集,其余 K-1 折合起来做训练集,训练并记录该轮的评估误差 E_k;重复 K 轮(每一折轮流做一次验证)后,把 K 轮误差取平均作为模型的最终性能估计。相比留出法,它的优势是每个样本都被用于训练一次、验证一次,数据利用率高,评估结果方差小;代价是训练 K 次模型,计算成本约为原来的 K 倍。
K 值选择是门手艺:K 太小(如 2、3),每轮训练数据太少,评估偏差大;K 太大(如 20),训练成本高且每折之间差异变小。工程上 K 取 5 或 10 是黄金惯例。极端情形是 K 等于样本总数 N,每轮只留 1 个样本做验证,称为留一法(Leave-One-Out),几乎无偏但计算代价极高,只适合小规模数据。
K 折交叉验证就是“轮流当考生”的组卷智慧:没有谁永远留在舒适区,也没有谁永远被刁难,平均成绩才是真实水平的可靠度量。它几乎成了中小数据集评估的默认选择——除了时序数据,因为时序数据连洗牌都不能做。
- 第 k 折误差第 k 轮把第 k 折留出作为验证集,训练后得到该轮的评估误差 E_k。
- 求平均把 K 轮误差累加并除以 K,得到交叉验证误差 E_CV。
数据泄漏防范
最打击老师的一件事是什么?期末复习时,学生从某个渠道拿到了今年真卷的答案,期末全班满分。你以为是教学成果辉煌,实际上是题目泄漏。更隐蔽的版本是:平时练习册里混入了大量与期末类似的题,学生练出了“熟悉感”而非“真能力”,考试成绩依然虚高,等真正上了考场换了新题型就现出原形。数据泄漏(Data Leakage)正是这类“假成绩”的来源。
机器学习中的数据泄漏通常来自三个渠道。第一,预处理时用了全量数据的统计信息:比如划分前就对所有样本做标准化,相当于把测试集的均值、方差“透露”给了训练过程。第二,重复或高度相似的样本同时出现在训练集与测试集中:比如同一个用户的多条行为记录被随机拆分到两边,测试就变成了“开卷考”。第三,验证集或测试集被反复用于调参:每用一次测试集,模型就多“背诵”了一点测试答案,测试指标越来越好看,真实性能却越来越差。
诊断泄漏的直觉做法是观察训练误差与测试误差的差距:如果训练精度极高、测试精度却显著偏低,除了过拟合,也要警惕泄漏或分布偏移。正确做法是牢记“先划分、后预处理”:只用训练集的统计量拟合标准化器等预处理组件,再把这个已经拟合好的变换应用验证集和测试集。测试集从头到尾只能碰一次。
守住期末考试的秘密,就是守住数据划分的边界:课前不碰期末题,预处理只看训练集,测试集金口难开。唯有如此,最终分数才配得上“真实水平”四个字。
- 训练侧精度模型在训练集上的准确率 Acc_train,通常偏高,代表“记住”的能力。
- 测试侧精度模型在从未见过的测试集上的准确率 Acc_test,代表“泛化”的能力。
- 差值诊断二者相减得到 Δ。差值越大,说明模型从训练集学到的规律在测试集上越不成立。
AI 应用场景
金融风控中的时序划分
阶段:数据准备与评估方案设计
解决的问题:欺诈检测模型需要预测“未来”的欺诈交易,直接用随机划分会让模型偷看未来信息,导致上线后性能断崖式下跌。传统做法全量打乱划分,评估分数虚高;AI 实践采用时间序列划分,以某个时间节点为界,之前做训练、之后做验证和测试,再用滚动窗口做前向链验证,让评估结果贴合真实部署环境。
具体案例:某支付风控团队开发盗刷识别模型,把 2024 年 1-9 月交易做训练,10 月做验证,11 月做测试;优化后模型在 11 月真实数据上的召回率从虚高的 0.93 回落到真实的 0.86,团队据此调整策略,上线后实际拦截率提升 12%。
医疗影像诊断中的分层抽样
阶段:模型评估与发布前验证
解决的问题:肺结节识别数据集中患病样本仅占 8%,若随机划分,验证集可能一折全是阴性,模型评估失真。分层抽样按“患病/健康”标签分层后再划分,保证每折都保持 8% 的患病比例,让召回率、精确率在每轮评估中都稳定可信。
具体案例:某三甲医院与 AI 公司合作开发胸片分类模型,数据集 12000 例、阳性仅 960 例。用 StratifiedKFold(5) 分层五折验证后,模型灵敏度的标准差从随机划分的 ±0.052 缩小到 ±0.013,顺利通过三类医疗器械注册审批答辩。
推荐系统离线评估中的 K 折交叉验证
阶段:模型选型与超参数调优
解决的问题:离线评估推荐算法时,单次留出法的 AUC 波动大,难以区分 A/B 两版算法的真实差异。改用 K 折交叉验证,轮流把 10% 的用户交互数据留出做验证,10 次评估取平均,降低单次划分的“运气”对算法排名的干扰。
具体案例:短视频推荐团队在排序模型迭代中,用 5 折交叉验证对比 DeepFM 与 DIN 两个候选模型,AUC 差从留出法的 0.003(不显著)提升到交叉验证的 0.008(显著),据此确定上线 DIN,视频完播率提升 5%。
Python 演示
import numpy as npfrom sklearn.model_selection import train_test_split, StratifiedKFold, KFoldfrom collections import Counter # 构造不平衡数据:80 个负类、20 个正类rng = np.random.RandomState(42)X = rng.randn(100, 2)y = np.array([0] * 80 + [1] * 20) # 分层留出法:训练/测试都保持 8:2 的类别比例X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42, stratify=y)print("全量正类占比:", y.mean())print("训练集正类占比:", y_train.mean())print("测试集正类占比:", y_test.mean()) # 对比普通 K 折与分层 K 折在类别不平衡时的稳定性print("\n--- 普通 K 折 各折验证集正类占比 ---")plain_kfold = KFold(n_splits=5, shuffle=True, random_state=42)for fold, (_, val_idx) in enumerate(plain_kfold.split(X, y), 1): print(f"Fold {fold}: {y[val_idx].mean():.3f}") print("\n--- 分层 K 折 各折验证集正类占比 ---")strat_kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)for fold, (_, val_idx) in enumerate(strat_kfold.split(X, y), 1): print(f"Fold {fold}: {y[val_idx].mean():.3f}")
train_test_split(..., test_size=0.2, stratify=y)按标签 y 的比例把 20% 的样本留作测试集,保证两侧正类占比都约 20%。y_train.mean()标签是 0/1 整数,均值直接等价于正类样本占比,可用它快速检查划分后的类别比例。KFold(n_splits=5, shuffle=True, random_state=42)创建普通 5 折划分器,每折轮流取 1 份做验证、其余训练。StratifiedKFold(n_splits=5, shuffle=True, random_state=42)创建分层 5 折划分器,每折保持与全量一致的类别比例。enumerate(plain_kfold.split(X, y), 1)遍历每一折返回的 (训练索引,验证索引),从 1 开始计数折号。y[val_idx].mean()只统计验证集索引对应的标签均值,即该折验证集的正类占比。random_state=42固定随机种子,让洗牌和划分结果可以复现,别人重跑代码得到完全相同的 fold。
常见误区
误区模型在训练集上准确率都能到 98%,我觉得模型已经很好了,直接拿去上线。
正解这就好比学生把练习册反复背了十遍,你拿练习册原题考他,当然满分。训练集上的分数衡量的是“记忆水平”而非“学习能力”,只有在没见过的测试集上表现好,才说明模型学到了可泛化的规律。评估模型必须用从未参与训练的测试集。
为何常见:初学阶段习惯用同一份数据既训练又评估,觉得代码简单顺手,没有意识到“背题 vs 理解”的本质区别。
误区测试集分数不够高?我再训几个模型,挨个在测试集上试,选分数最高的那个不就行了。
正解每看一次测试集,相当于让模型多了一次“开卷考”的机会。反复试几十次,模型就在不知不觉中把测试集的信息“背”下来了,测试分数越来越虚高。正确做法是只允许用验证集调参,测试集在全部定稿后只碰一次。
为何常见:数据少时舍不得单独划出验证集,于是把测试集当验证集用,短期看调整方便,长期看评估结果完全失真。
误区反正都是数据,我先把所有历史订单打乱,再按比例切训练集和测试集。
正解时序数据一旦打乱,就相当于让模型提前“看到未来”。比如用 1-11 月数据训练、12 月数据测试,模型学的是真实的因果推进;打乱之后,12 月的数据可能混进训练集,评估分数虚高,上线后模型面对真正的未来立刻失效。时序数据必须按时间先后切分,禁止随机洗牌。
为何常见:惯性思维,认为随机划分是万能的,忽略了时间戳携带的因果顺序信息。
误区先把整个数据集归一化,再划分训练集和测试集,这样数据尺度统一,模型训练更快。
正解全量标准化会用上测试集的均值和方差,等价于考试前把答案的“分布特征”透露给了模型。标准做法是先划分,再只用训练集拟合 StandardScaler,用这个已拟合的变换去处理验证集和测试集。
为何常见:预处理步骤写在前面、划分写在后面是很多教程里顺手的写法,看起来结果一样,实际泄漏已经发生。
误区反正都做 10 折交叉验证了,类别不平衡也没关系,平均一下就平了。
正解10 折平均只能降低随机误差,不能纠正类别比例偏差。如果某几折验证集里恰好几乎没有正类,模型在这几折上评估的召回率就是 0,拉低整体水平。此时应该用 StratifiedKFold,先按类别分层再切折,保证每一折的正负比例与全局一致。
为何常见:混淆了“多轮平均”与“保分布”两个目标,以为平均能自动修复不均衡问题,实际两者互补而非替代。
面试题
Q1. 测试集的主要作用是?
- A.用于模型梯度更新
- B.用于选择超参数
- C.最终评估真实性能← 正确答案
- D.提前指导训练方向
答案:C。测试集像期末真卷,全程不参与训练和调参,只在最终一次性检验模型的泛化能力。A 是训练集的职责,B 是验证集的职责,D 不是任何集合的标准用途。
Q2. 类别不平衡时,哪种划分方法更合适?
- A.随机划分
- B.分层抽样划分← 正确答案
- C.顺序切分
- D.均分切片划分
答案:B。分层抽样先按类别分组,再在每个类别内按比例抽取,保证训练、验证、测试中的类别比例与全量一致,避免某份子集正类样本过少。随机划分可能产生极端比例,顺序切分和均分切片都不考虑类别分布。
Q3. 时间序列数据划分的正确做法是?
- A.随机打乱后切分
- B.按时间先后顺序切分← 正确答案
- C.按类别分层后切分
- D.按特征均值排序切分
答案:B。时序数据蕴含因果先后关系,训练必须使用过去、测试使用未来,才能模拟真实预测场景。随机打乱会让模型“偷看未来”造成数据泄漏,属于时序场景的典型错误。
Q4. K 折交叉验证的最终评估结果通常怎么计算?
- A.取 K 轮误差中的最大值
- B.取 K 轮误差的算术平均← 正确答案
- C.取 K 轮误差的中位数
- D.只取最后一轮误差值
答案:B。K 折交叉验证每一折都会得到一个验证误差 E_k,最终结果对 K 轮误差求平均,以降低单次划分的偶然性。K 轮的误差分布还能顺便观察模型的稳定性,而不应只挑最大、中位或最后一轮。
Q5. 留一法中 K 的值等于?
- A.固定等于 5
- B.固定等于 10
- C.等于样本总数 N← 正确答案
- D.等于特征数量 D
答案:C。留一法(Leave-One-Out)是 K 折交叉验证的极端情况,每折只留 1 个样本做验证,所以折数 K 等于样本数 N。它几乎无偏但计算代价极高,适合小数据集。
Q6. 以下哪项操作会直接导致数据泄漏?
- A.划分前对全量数据做标准化← 正确答案
- B.设定固定随机种子再划分
- C.训练时只读取训练集数据
- D.用验证集对比两个模型的得分
答案:A。划分前对全量数据做标准化,会让测试集的均值和方差提前透露给模型,属于典型泄漏。固定随机种子是为了可复现;只读训练集、用验证集选模型都是正确操作,不会泄漏测试信息。
Q7. 数据泄漏的常见来源有哪些?
- A.预处理时使用全量统计量← 正确答案
- B.重复样本跨集合出现← 正确答案
- C.划分时固定随机种子
- D.测试集反复用于调参← 正确答案
答案:ABD。预处理用全量数据计算均值方差、重复样本同时出现在训练和测试、反复用测试集调参,都会让模型“提前看到答案”。固定随机种子只是让划分可复现,本身不泄漏信息。
Q8. random_state 参数的主要作用是?
- A.自动提升模型精度
- B.保证划分结果可复现← 正确答案
- C.防止训练集数据泄漏
- D.增加训练样本的数量
答案:B。random_state 固定随机数生成器的种子,让每次运行程序时 shuffle 过程和划分结果完全一致,方便复现实验。它不改变模型精度,也不新增样本,更不能替代防泄漏措施。
Q9. 关于留出法的缺点,下列说法正确的是?
- A.单次划分结果方差大← 正确答案
- B.数据量小时浪费样本← 正确答案
- C.一定比 K 折更加可靠
- D.适用于所有数据类型
答案:AB。留出法只划分一次,某次划分的难易样本分配会明显影响评估结果,方差大;小数据集里单独留出验证和测试会减少训练样本,造成浪费。K 折通常更稳,且时序数据不能直接使用随机式留出,所以 C、D 均错。
Q10. 验证集与测试集的正确认识是?
- A.验证集参与模型选择过程← 正确答案
- B.测试集可以反复参与调节
- C.验证集回答最终泛化能力
- D.测试集评估最终真实水平← 正确答案
答案:AD。验证集像模拟卷,用它的反馈来挑选超参数和模型结构,参与开发过程;测试集像密封的期末真卷,只用于最终一次性评估。B 反复使用测试集会造成泄漏,C 把验证集和测试集的职责搞反了。