想象你是班主任李老师,想摸清班级的真实水平,于是组织模拟月考。你定下规矩:先把学生分成两拨,一拨留在教室“训练”——做经典例题、对答案;另一拨去考场当“考生”。麻烦来了:班里好几对兄妹来自同一个家庭。如果哥哥分在训练组,妹妹分在考数组,哥哥回家一对答案,妹妹的分数就“虚高”了。你以为是教学有效,其实只是兄妹互通了信息。机器学习里的交叉验证也一样:标准K折把样本随机分成K份轮流验证,可如果同一个病人的两张CT、同一天的股票数据,一张进了训练集、一张进了验证集,模型就等于“见过答案”,评估结果乐观得不真实。怎么办?李老师想出一招:按家庭分考场,保证同一个家庭的孩子绝不跨考场。这就是本文主角——Group交叉验证。它把“组”当作最小分割单元,让训练集与验证集在组级互斥,得到真正可信的泛化能力。

岗位关联

Group CV 是 AI 工程师在没有“标准答案”的真实数据里判断模型能否落地的关键技能。学会它,你才能在医学影像、风控和推荐系统中避免“纸面高分、上场翻车”的尴尬。

目录
  1. 可视化演示
  2. 标准K折的暗礁
  3. 分组核心思想:家庭是底线
  4. 分组算法原理:教务系统的秘密
  5. 典型应用场景:现实中的三种“家庭”
  6. 工具代码实践:三行代码换一个诚实的评估
  7. 对比分析:三种分考场的方案
  8. 避坑指南:考务老师的三个粗心时刻
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示数据泄漏问题、Group K折分组划分机制、标准K折与Group CV对比。切换模式理解分组数据评估的核心原理。

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

同组数据泄漏问题 标准K折随机划分,同组样本可能同时出现在训练集和测试集,造成信息泄漏 同组样本特征高度相关,泄漏导致评估过于乐观,模型泛化能力被高估 leakage: same_group ∩ (train ∩ test) ≠ ∅ 数据泄漏是ML评估中最隐蔽的错误来源

标准K折的暗礁

李老师第一次组织月考,图省事就按学号随机把学生分成两拨:单号去考场当考生,双号留在教室翻书复习。结果哥哥单号在考场,妹妹双号在教室,哥哥一出考场就把答案透给妹妹。月考成绩出来,全班平均分高得离谱,可区里统考立刻现了原形。

机器学习里的标准K折交叉验证,就像这位图省事的李老师:把数据集随机均分成K份,每次取一份做验证、其余K-1份做训练,轮流K次取平均。它默认一个前提——样本之间“互不相识”,也就是独立同分布。但真实数据里,很多样本是“一家人”:同一个患者不同时刻拍的CT、同一个用户在一天内的点击、同一台传感器连续采集的信号。这些样本在特征空间里高度相似,模型在训练时见过了哥哥,验证时遇到妹妹,等于提前拿到了答案。

这种“信息串门”有一个专门的名字:数据泄露(Data Leakage)。泄漏会让验证损失被严重低估,评估指标比真实水平高出几个百分点。我们用下面的式子刻画第 $k$ 折的泄漏量:

李老师后来想明白了:月考分数虚高、统考翻车,不是因为学生笨,而是考场安排允许“兄妹传答案”。要评估真实水平,必须首先解决“一家人被拆散”的问题。

leakk=∑i∈Vk1[ ∃j∈Tk: gj=gi ]\displaystyle \mathrm{leak}_k = \sum_{i \in V_k} \mathbb{1}\left[\ \exists j \in T_k:\ g_j = g_i\ \right]
  1. 指示函数(打卡器)方括号里的条件成立时函数值为1,否则为0。它像一个打卡器,验证集里每出现一个“在训练集有亲戚”的样本,就“滴”地记一笔。
    1[条件]={1,条件为真0,条件为假\displaystyle \mathbb{1}[\text{条件}] = \begin{cases} 1, & \text{条件为真} \\ 0, & \text{条件为假} \end{cases}
  2. 存在性判断$\exists j \in T_k$ 表示在训练集 $T_k$ 里至少存在一个样本 $j$,与验证集里的样本 $i$ 共享同一个组标签 $g$。
    ∃j∈Tk, gj=gi\displaystyle \exists j \in T_k,\ g_j = g_i
  3. 求和累加把验证集 $V_k$ 中所有“泄题”的样本数加起来,得到第 $k$ 折的泄漏总量。Group CV 的终极目标就是让每个折的 $\mathrm{leak}_k$ 都等于 0。
    leakk=∑i∈Vk1[∃j∈Tk, gj=gi]\displaystyle \mathrm{leak}_k = \sum_{i \in V_k} \mathbb{1}[\exists j \in T_k,\ g_j = g_i]

分组核心思想:家庭是底线

李老师召开考务会,宣布新规定:同一个家庭的孩子,必须分进同一个考场;不同考场之间,不允许有任何亲戚关系。 孩子本身可以千差万别,但家庭是不可拆分的最小单元。这样一来,考场上没人能提前知道训练教室里的答案。

机器学习的术语里,这个“家庭”就是组(Group)。一个组由若干个共享同一个组标签的样本组成,比如一个患者的全部影像、一个用户的历史行为序列、一个小时的传感器读数。Group CV 的核心思想也很简单:以组为单位做划分,而不是以样本为单位。 训练集与验证集之间没有共同的组,信息就无法跨集合传播。

我们先把数据集的组结构数学化。设样本全集为 $\mathcal{D}$,它被划分成若干互不相交的组 $G_1, G_2, \ldots, G_m$:

回到李老师的考场:只要保证考场之间“无血缘”,哪怕兄妹俩在同一考场里互相讨论也没关系——因为同一个考场本就属于同一份训练或验证数据,不会污染评估。Group CV 把“家庭完整”作为一道红线,彻底堵住了信息串门的通道。

⋃j=1mGj=D,Gi∩Gj=∅ (i≠j)\displaystyle \bigcup_{j=1}^{m} G_j = \mathcal{D}, \qquad G_i \cap G_j = \varnothing\ (i \neq j)
  1. 组的定义每个组是“有共同户口”的样本集合,组标签 $g_i$ 给每个样本分配户口编号 $j$。
    Gj={xi∣gi=j},j=1,2,…,m\displaystyle G_j = \{ x_i \mid g_i = j \}, \quad j = 1, 2, \ldots, m
  2. 并集覆盖全集所有组拼在一起,恰好等于整个数据集,一个样本都不能漏。
    ⋃j=1mGj=D\displaystyle \bigcup_{j=1}^{m} G_j = \mathcal{D}
  3. 两两互斥任意两个组之间没有公共样本,一个人不可能同时属于两个家庭。这正是“训练集与验证集组间互斥”的前提。
    Ga∩Gb=∅,a≠b\displaystyle G_a \cap G_b = \varnothing, \quad a \neq b

分组算法原理:教务系统的秘密

李老师把这个方案交给教务系统执行。系统先给每个学生登记“家庭编号”,再把家庭编号做成纸条放进箱子里抽签,抽中哪个家庭,这个家庭的全体成员就整整齐齐地进入对应考场。整个过程,家庭从未被拆散。

对应的算法叫作 GroupKFold。它和标准 KFold 的差别只在一处:切分的对象从样本变成了组 ID。 具体分三步走。第一步,提取数据集中所有唯一的组标签,得到一个“家庭清单” $\{G_1, \ldots, G_m\}$;第二步,对这个家庭清单做一次普通 K 折,得到每个折对应哪些家庭;第三步,把家庭的 ID 展开回样本索引,同属一个家庭的样本自动被分进同一折。数学上,第 $k$ 折的验证集和训练集分别是:

教务系统还有一个贴心细节:折数平衡。每个家庭的“人口”可能不一样,有的家庭5个孩子,有的家庭50个孩子。GroupKFold 会按组大小排序后做贪心分配,尽量让每个折包含的总样本数接近。这就像李老师要求各考场人数大致相当,避免某个考场挤了半个年级、另一个考场只有三个人。

Dkval=⋃Gj∈VkGj,Dktrain=D∖Dkval\displaystyle D_k^{\mathrm{val}} = \bigcup_{G_j \in \mathcal{V}_k} G_j, \qquad D_k^{\mathrm{train}} = \mathcal{D} \setminus D_k^{\mathrm{val}}
  1. 抽中家庭集合$\mathcal{V}_k$ 是第 $k$ 折被抽中当验证组的“家庭子集”,它从全集家庭清单中按折选出。
    Vk⊆{G1,G2,…,Gm}\displaystyle \mathcal{V}_k \subseteq \{G_1, G_2, \ldots, G_m\}
  2. 验证集由组拼成把所有抽中家庭的全部样本并起来,就是这一折的验证集。注意单位是“整个家庭”,不是单个学生。
    Dkval=⋃Gj∈VkGj\displaystyle D_k^{\mathrm{val}} = \bigcup_{G_j \in \mathcal{V}_k} G_j
  3. 训练集取补集全集 $\mathcal{D}$ 减去验证集后,剩下的家庭全部进入训练集。因为两边在组层面没有交集,所以信息无法跨考场传递。
    Dktrain=D∖Dkval\displaystyle D_k^{\mathrm{train}} = \mathcal{D} \setminus D_k^{\mathrm{val}}

典型应用场景:现实中的三种“家庭”

医学影像科的张主任来请教李老师:他们科室有几百个病人的CT数据,想训练一个自动检测肺结节的AI。张主任原本按影像文件随机划分训练集和验证集,结果模型在验证集上准确率高达95%,可一到新病人身上就掉到88%。李老师一眼看出问题:同一个病人的上百张CT切片,在文件层面被当成了“别人”,但它们明明是一家人!正确的做法是把病人ID作为组标签,保证同一个患者的影像全部在训练集或全部在验证集里,这就是医学影像分组。

第二种常见的“家庭”是时间窗。金融风控模型要预测未来是否违约,如果用随机划分,模型会在训练时“偷看未来”——验证集里出现了训练集之后才发生的欺诈模式。把数据按天、按周分成连续的时间段,再以时间段为组做 Group CV,让模型真的用过去预测未来,评估结果才对得起上线后的表现。

第三种“家庭”是用户ID。推荐系统要评估“给新用户推荐”的效果,如果同一个用户的点播记录一部分在训练集、一部分在验证集,模型等于“认识了老用户”,离线指标会远好于冷启动的真实体验。按用户ID分组后,每个用户的行为数据完整落在同一边,才能诚实地回答“我根本不认识这个用户时,推荐效果如何”。

这三种场景的共同点,是样本之间存在着真实的信息依赖。只要依赖存在,标准K折的“随机抓人进考场”就是一场事故。Group CV 先把这些隐形的家庭关系识别出来,再决定怎么分考场,评估才能从“自欺欺人”变成“脚踏实地”。

工具代码实践:三行代码换一个诚实的评估

李老师把这套方案做成了考务手册,对AI工程师来说,它对应的就是 scikit-learn 里的 GroupKFold。它的用法几乎和普通 KFold 一样,唯一的区别是 split 方法要多传一个 groups 参数:

groups 就是我们说的“户口本”——每个样本属于哪个家庭(患者ID、周编号、用户ID)。把 groups 传进去之后,GroupKFold 保证每一次切分出来的训练集和验证集在组级别完全不相交。完整的评估流程通常是:初始化 GroupKFold,循环每一折,在训练折上拟合模型,在验证折上预测并记录指标,最后汇总均值和标准差。

一个容易忽略的参数是 n_splits。标准K折我们习惯设成5或10,但 Group CV 有一个硬性约束:折数不能大于组数。如果数据只有5个病人却要分10折,无异于把一家人拆散,GroupKFold 会直接报错。所以动手前先数一数有多少个唯一的组ID,再决定折数。

评估整合时,建议在每折循环里加一行“组互斥断言”,用代码自动检查训练组与验证组没有交集。这相当于考场的安检门——万一某天有人不小心把组标签传错,程序会在第一时间报警,而不是让一个虚高的分数蒙混过关。完整可运行的示例见后文 Python 演示。

python3 行
gkf = GroupKFold(n_splits=5)for train_idx, val_idx in gkf.split(X, y, groups):    ...

对比分析:三种分考场的方案

李老师发现,市面上至少流行三种“分考场”方案,各有各的脾气。第一种是标准K折,只按学生学号随机分,完全不看家庭关系。它的优点是简单、数据利用率高;缺点是一遇到“一家人”就泄题,评估偏乐观。第二种是分层K折(StratifiedKFold),它管的是另一件事:保证每个折里好学生、中等生、差等生的比例和全班一致,避免某个考场全是尖子生。分层管的是“类别比例”,对“家庭关系”视而不见。

第三种就是本文主角 Group CV,它只盯一件事:同组样本绝不跨折。它更保守——为了隔离组关系,每折的训练集可能失去一些“看起来相似”的样本,模型训练得更艰难,评估方差也可能变大。但换来的是不会作弊的诚实验证分数。三者可以叠加使用,比如 StratifiedGroupKFold 同时照顾类别比例和组完整性,不过它对数据量要求更高。

选哪种方案,取决于数据里有没有“家庭关系”。如果医学影像按患者聚类、电商日志按用户聚类、金融数据按时间聚类,直接上标准K折就是让哥哥妹妹互相抄答案。Group CV 和分层K折并不是竞争关系,而是守护不同的东西:一个守护“血缘隔离”,一个守护“类别均衡”。

组数下限是一个不可逾越的数学边界:

李老师最后总结:没有一种分考场方案是万能的。看清数据里藏着哪种“家庭”,再决定让谁进考场,才是成熟考务官——也是成熟算法工程师的本事。

K≤m=∣G∣\displaystyle K \le m = |\mathcal{G}|
  1. 组的总数$m = |\mathcal{G}|$ 表示数据集里一共有多少个互不相交的组,也就是“家庭清单”的长度。
    m=∣{G1,G2,…,Gm}∣\displaystyle m = |\{G_1, G_2, \ldots, G_m\}|
  2. 折数的天花板折数 $K$ 不能超过组数 $m$。如果只有 5 个家庭却要开 10 个考场,必然有一个家庭被拆散,Group CV 的根基就塌了。
    K≤m\displaystyle K \le m

避坑指南:考务老师的三个粗心时刻

李老师的方案推行一个月后,教务主任反馈了几个翻车案例,全是细节惹的祸,每一个都值得引以为戒。

第一个坑:组ID定义过细。 张主任把同一个病人在不同天拍的CT误标成了不同的患者ID,等于把三胞胎硬说成三个家庭。GroupKFold 照常执行“家庭隔离”,可这个“家庭”其实是兄弟姐妹的个体,模型照样认得出同一个病人的肺,泄漏照旧。组ID的定义必须严格反映信息共享关系:同一个人、同一台设备、同一时间段,才是真正的“家庭户口”。

第二个坑:组大小严重不均。 某个组的样本量占全量的一半,GroupKFold 不管怎么贪心分配,这个大组一旦被分进验证集,那一折的验证分布就完全被它主导;分进训练集,训练集又严重偏向它。最终几折的结果忽高忽低,方差巨大。解决方案是:要么在预处理时对大组做抽样限制,要么改用多次重复的 Group CV 来稳定估计。

第三个坑:忘记核查分割结果。 有些工程师以为调用了 GroupKFold 就万事大吉,从来不检查划分出来的集合是否真的互斥。实际上,如果 groups 传入顺序和 X 不一致,或者中间某一步把数据打乱了但没同步打乱 groups,就会出现“名义上分组、实际全乱套”的静默故障。李老师在考务手册里强调:每折循环开头加一条 assert,检查训练组与验证组是否不相交,用机器代替人眼盯住这条底线。

考场纪律不是写进手册就生效的,要靠每一次考前检查来落实。Group CV 同样需要这样的“安检意识”。

AI 应用场景

医学影像AI的患者级评估

阶段:模型评估与验证

解决的问题:传统K折随机划分时,同一个患者的数百张CT切片被拆进训练集和验证集。模型在训练时见过该患者的其他结节形态,验证时只需“认脸”就能拿高分。而临床真正面对的是从未见过的病人。Group CV 按患者ID分组后,评估结果下降却更接近真实部署表现,帮助团队避免被虚假高指标误导上线。

具体案例:某三甲医院影像科训练肺结节检测模型,2000例患者的50000张CT切片参与评估。标准K折的AUC为0.94,Group CV 的AUC为0.89。科室最终以 Group CV 结果作为上线决策依据,因为只有它回答了“对新患者是否有效”这个临床真问题。

信贷风控中的时间窗隔离

阶段:特征工程与离线评估

解决的问题:信贷申请数据带时间戳,随机K折会让模型“偷看未来”——验证集中出现训练集之后的欺诈模式。这种时序数据泄露会让风控模型的自评估虚高,上线后实际坏账率远超预期。按自然周分组做 Group CV,模拟“用过去预测未来”的真实放贷过程,评估与上线表现高度吻合。

具体案例:某消费金融公司开发反欺诈模型,用过去52周申请数据。建模团队按周编号作为 groups 做5折 Group CV,评估AUC比随机K折低0.03,但上线后模型的实际拦截率与离线评估误差从8%缩减到2%以内。风控委员会随后将 Group CV 写入模型发布强制规范。

短视频推荐的新用户冷启动评估

阶段:离线召回与排序模型评测

解决的问题:推荐模型训练集包含用户历史行为,若同一用户的部分行为进入验证集,模型等于“见过这个用户”,离线指标对老用户友好、对新用户失真。以用户ID为组做 Group CV,能逼真模拟“平台不认识陌生人”的冷启动场景,从而客观评估召回模型的真实泛化能力。

具体案例:某短视频平台评估召回模型,随机K折的离线AUC比 Group CV 高0.05,但新用户线上点击率与 Group CV 预测更一致。团队后将用户级分组评估设为召回模型迭代的默认配置,并改造了特征流水线以保留用户ID维度。

Python 演示

python32 行
import numpy as npfrom sklearn.model_selection import GroupKFoldfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.metrics import accuracy_score, roc_auc_score # 模拟 240 张影像,来自 60 位病人,每位病人 4 张n_patients = 60imgs_per_patient = 4n_samples = n_patients * imgs_per_patientrng = np.random.RandomState(42) X = rng.randn(n_samples, 10)y = (X[:, 0] + X[:, 1] + rng.randn(n_samples) * 0.5 > 0).astype(int)groups = np.repeat(np.arange(n_patients), imgs_per_patient) # 初始化 5 折分组交叉验证gkf = GroupKFold(n_splits=5)model = RandomForestClassifier(n_estimators=50, random_state=42)acc_list, auc_list = [], [] for train_idx, val_idx in gkf.split(X, y, groups):    train_groups = set(groups[train_idx])    val_groups = set(groups[val_idx])    assert train_groups.isdisjoint(val_groups), "Group 泄漏!"    model.fit(X[train_idx], y[train_idx])    proba = model.predict_proba(X[val_idx])[:, 1]    pred = (proba > 0.5).astype(int)    acc_list.append(accuracy_score(y[val_idx], pred))    auc_list.append(roc_auc_score(y[val_idx], proba)) print("Group CV Accuracy: %.3f (+/- %.3f)" % (np.mean(acc_list), np.std(acc_list)))print("Group CV AUC:      %.3f (+/- %.3f)" % (np.mean(auc_list), np.std(auc_list)))
目的:演示 GroupKFold 在患者级数据上的完整评估流程,并用断言自动防止组泄漏。
  1. groups = np.repeat(np.arange(n_patients), imgs_per_patient)生成60个患者ID,每张影像都知道自己属于哪位病人,这就是 Group CV 的“家庭户口本”。
  2. gkf = GroupKFold(n_splits=5)初始化5折分组交叉验证器,折数5小于组数60,满足折数上限约束。
  3. for train_idx, val_idx in gkf.split(X, y, groups):把“家庭”当成最小单位切分,返回训练与验证的样本下标。
  4. assert train_groups.isdisjoint(val_groups), "Group 泄漏!"当场自检两个集合没有同一家人,一旦有亲戚串场立刻报错。
  5. model.fit(X[train_idx], y[train_idx])只在训练集上拟合模型,验证集在拟合阶段全程“装不认识”。
  6. pred = (proba > 0.5).astype(int)把预测概率压成0/1类别,方便计算准确率。
  7. auc_list.append(roc_auc_score(y[val_idx], proba))记录AUC,它对阈值不敏感,比准确率更能反映排序能力。

常见误区

误区我刚开始学交叉验证时,以为 Group CV 就是把 StratifiedKFold 的标签参数换成组标签,本质上还是分层,只是分层依据不同。

正解两者约束方向完全不同。分层K折关注“每个折里类别比例与全集一致”,保证正负样本均匀;Group CV 关注“同一个组的样本绝不拆开”,切断信息传递。一个管“比例”,一个管“血缘”。用考场比喻:分层是让每个考场好中差学生比例相近,分组是让兄妹不跨考场。两者可以叠加使用,但不能互相替代。

为何常见:sklearn 中两者都要额外传一个数组参数,接口长得像,新手容易只看参数不看语义。

误区只要代码里用了 GroupKFold,把 groups 传进去,就不会有数据泄漏了,评估结果一定是准的。

正解GroupKFold 只是执行“组不跨折”的机器,真正关键的是组ID怎么定义。如果同一患者的三次CT被系统分别记为 p1、p2、p3,相当于把三胞胎硬说成三个家庭,模型照样能“认亲戚”。组定义必须反映真实的信息共享关系:同一个人、同一台设备、同一时间段。

为何常见:组ID往往不在现成表格里,需要业务知识手工构造,工程师图省事直接用样本ID当组ID,Group CV 就退化成了普通K折。

误区K折里K越大评估越稳定,所以我把K设成10,即使组数只有5也没关系。

正解GroupKFold 要求折数 K 不能超过组数 m。组数只有5时 K=10,意味着至少有一个组的样本必须同时出现在两个折里,“组不跨折”直接被打破。sklearn 会在这种情况下直接报错。就像只有5个家庭却要开10个考场,总得有一个家庭被拆散。

为何常见:标准K折里 K 习惯于设5或10,换到 Group CV 时延续旧习惯,忘了先数一数组数。

误区离线评估用 Group CV 就够了,线上预测阶段样本不需要分组,直接调用模型接口就行。

正解线上推理阶段同样存在组关系。比如推荐系统训练集包含用户过去30天行为,上线后给同一用户推荐时,模型其实是在“同组内”做预测。如果业务目标是“冷启动新用户”,训练时就要把老用户行为按用户ID隔离,否则离线指标会比新用户体验乐观得多。

为何常见:评估和部署被拆成两个团队,数据血缘信息没有传递到线上特征管线,导致离线指标口径与线上场景脱节。

面试题

Q1. Group交叉验证中的“组”指的是什么?

单选题 · easy

  • A.一个独立的样本个体
  • B.同一类别标签的集合
  • C.共享组标签的全体样本← 正确答案
  • D.同在一个折里的样本

答案:C。组是一组共享同一个组标签的样本,比如同一个病人的所有CT、同一个用户的所有行为。单个样本太小,类别标签是分层关心的事,同一折里的样本也未必同组。只有C准确描述了“家庭”的完整含义。

Q2. 标准K折与Group CV的本质区别是什么?

单选题 · easy

  • A.一个划分样本,另一个划分组← 正确答案
  • B.折数不同,前者K更小后者更大
  • C.前者无验证集,后者有验证集
  • D.前者有训练集,后者没有训练集

答案:A。标准K折以单个样本为最小切分单元,Group CV 以“组”为最小切分单元,这是两者本质区别。折数、是否有训练集或验证集都不是核心差异,两种方法都有训练集和验证集。

Q3. 以下哪些场景适合使用Group CV?

多选题 · mid

  • A.同患者多次CT影像切片组← 正确答案
  • B.同用户多次点击行为序列← 正确答案
  • C.完全独立同分布的数据样本
  • D.同一周的金融时序数据流← 正确答案

答案:ABD。患者、用户、时间段都是典型的“家庭关系”,样本之间存在信息依赖,适合Group CV。完全独立同分布的数据没有组依赖,用标准K折即可,强行分组反而降低数据利用率。

Q4. GroupKFold 在内部先对什么执行K折切分?

单选题 · mid

  • A.按样本索引直接切分
  • B.按特征维度做整体切分
  • C.按唯一组ID列表做切分← 正确答案
  • D.按标签列分组后切分

答案:C。GroupKFold 先把数据集压缩成唯一的组ID清单,对这个清单做普通K折,再把组ID展开回样本索引。它不是直接切样本,也不是按标签或特征切分。

Q5. 数据泄露会让模型的评估结果发生什么变化?

单选题 · easy

  • A.评估分数偏低甚至崩溃
  • B.评估分数虚高过于乐观← 正确答案
  • C.对最终评估结果没有影响
  • D.只提升训练集上的分数

答案:B。当训练集和验证集出现同组样本时,模型相当于提前见到了验证集的“亲戚”,验证误差被低估,评估指标虚高。它不会让分数偏低,也不是无影响,而是系统性偏乐观。

Q6. 关于Group CV的使用,以下哪些做法是正确的?

多选题 · hard

  • A.折数不能大于组数的上限← 正确答案
  • B.同组样本不跨训练与验证← 正确答案
  • C.删除样本上的组标签字段
  • D.训练集与验证集的组互斥← 正确答案

答案:ABD。折数必须不超过组数,同组样本不跨集合,训练与验证组互斥,这三条是Group CV的基石。删除组标签字段会让算法失去“户口本”,无法完成分组,属于错误操作。

Q7. Group CV 与分层交叉验证的主要区别是什么?

单选题 · mid

  • A.分层按类别比,分组按组完整← 正确答案
  • B.分组按类别比,分层按组完整
  • C.两种方法本质上完全等价相同
  • D.分层方法完全不需要真实标签

答案:A。分层K折保证每个折的类别比例与全集一致,Group CV 保证每个组不被拆散。两者目标不同,不是等价关系;分层需要真实标签来算类别比例,无法脱离标签工作。

Q8. 以下哪种情况会让 Group CV 的评估失效?

单选题 · hard

  • A.数据样本量太大导致显存不够
  • B.特征维度过高引发维度灾难
  • C.组标签定义错误导致组被拆散← 正确答案
  • D.线性模型表达能力不足以拟合

答案:C。组标签定义错误是Group CV失效的头号原因——同一患者的影像被标记成不同患者ID,家庭关系被切断,信息照常泄漏。样本量、维度、模型能力只是常规建模问题,与分组隔离是否生效无关。

Q9. 当数据集中组的大小严重不均时,以下哪些说法正确?

多选题 · hard

  • A.大组样本会主导所在折的分布← 正确答案
  • B.各折样本数量差异变得很明显← 正确答案
  • C.最终评估结果的方差会变大← 正确答案
  • D.一定让评估结果变得更加精确

答案:ABC。大组进入哪一折,哪一折的样本分布就被它主导,导致折间样本量失衡、评估方差变大。这不是让评估更精确,而是让结果更不稳定,需要通过重复多次评估或约束大组规模来缓解。

Q10. 在按时间分组的风控场景中,同一秒的样本被分到不同折,这是什么问题?

单选题 · mid

  • A.这是合理且精细的时间段划分
  • B.组定义过细导致信息跨集泄漏← 正确答案
  • C.组定义过粗导致评估太过保守
  • D.对模型评估结果没有任何影响

答案:B。同一秒内的样本高度相关,把它们拆到不同折,相当于把一家人分开,模型会通过时间临近性“偷看”验证集信息。按时间分组时,组粒度应覆盖有效的信息依赖范围,比如按周或按天,而不是精确到秒。