大数据技术

大数据-训练/测试集:多分类里某些稀有类总共只有二三十条,按70/15/15分层后测试集每类只剩三四条,一条预测错就能让该类指标从0.8跳到0.5——这种“稀有类测试集样本太少”的问题,是该合并类别、该重复分层抽样取平均,还是该放弃对稀有类的单独评估?

👤 为我痴狂 👁 4 阅读 ❤ 0 点赞 ➦ 0 分享 📅 2026-10-22
首页› 大数据› 大数据技术› 正文
稀有类测试集只剩三四条:多分类评估的方差预算与三条路径抉择

从“指标跳变”到“评估可信度工程”——分层抽样、重复重采样与类别合并的边界条件与操作路径

摘要

在多分类任务中,稀有类样本总量常常只有二三十条。按70/15/15分层切分后,测试集每类仅剩三到五条,一条预测错误就足以让该类F1从0.8跌到0.5。这不是模型变差了,而是评估本身的方差压过了被评估的效应。本文提出以“评估方差预算”为贯穿主线的分析框架:先量化稀有类指标的不确定性,再据此在“合并类别”“重复分层重采样取平均”“放弃单独评估”三条路径间做有依据的取舍。文章给出可复现的操作步骤、置信区间与统计检验方法、类别合并的相似度判据、重复分层抽样的次数估算公式,并讨论长尾识别、报告规范与前沿方向。

本文评述:业界长期把“测试集太小”当作数据问题,笔者认为它本质是统计推断问题——在样本量固定的约束下,我们真正能优化的是估计量的方差与报告方式,而非幻想用一条样本撑起一个可信的类级指标。

一、问题的本质:不是模型不行,是评估在“抖”

设想一个五分类任务,某个稀有类在全集里只有30条样本。按70/15/15分层切分,训练集约21条、验证集约4~5条、测试集约4~5条。假设模型在这个类上的真实召回率是0.8,那么测试集里4条样本中期望有3.2条被正确识别。但二项分布的随机性意味着:4条里错1条,召回率就是0.75;错2条,就掉到0.5。也就是说,同一个模型、同一份数据分布,仅仅换一个随机种子,类级F1就能在0.5到1.0之间大幅摆动。

这不是危言耸听。根据二项分布的标准差公式,当测试样本数 n=4、真实准确率 p=0.8 时,单类准确率的标准差约为 √(p(1-p)/n)=√(0.16/4)=0.2。也就是说,±0.2的波动是“正常噪声”,而不是模型退化。很多团队在看到稀有类指标从0.8掉到0.5时第一反应是“模型过拟合了”“要加数据了”,但真正的问题在于:这个指标本身的置信区间宽到没有决策价值。

本文评述:机器学习工程里有一个隐性假设——指标是“真值”的可靠估计。但在小样本类上,这个假设直接失效。笔者认为,评估稀有类时首先要做的不是调模型,而是回答“我这个指标的可信区间有多宽”。区间宽过业务容忍度,任何基于该指标的模型选择都是在噪声上做决策。

这一现象在学术界早有讨论。Saito与Rehmsmeier在2015年关于不平衡数据评估的论文中指出,PR曲线在小样本正类上的估计方差显著大于ROC曲线,建议报告时附带置信带。而近年的长尾识别研究(如Cui等2019年的LDAM、Cao等2019年的LDAM-DRW)虽然聚焦于训练阶段的类别不平衡,但其评估部分同样面临稀有类测试样本不足的困境。笔者认为,训练侧的长尾方法与评估侧的小样本问题必须分开处理:前者解决“学不到”,后者解决“测不准”。

二、评估方差预算:一条贯穿全文的分析主线

为了让后面的三条路径不是拍脑袋选择,我们需要一条统一的分析主线。本文提出“评估方差预算”(Evaluation Variance Budget)的概念:把类级指标的总方差拆解为“抽样方差”与“模型方差”两部分,并设定一个业务可接受的置信区间半宽作为预算上限,再据此决定采用哪种评估策略。

2.1 方差的来源拆解

类级指标的波动至少来自三个层面:其一,测试集抽样方差——从总体中抽出的这4~5条样本本身带有随机性;其二,模型训练方差——不同随机种子训练出的模型在该类上的表现不同;其三,切分方差——不同的分层切分方案导致测试集构成不同。三者叠加,才是我们观察到的“指标跳变”。

方差来源 典型量级(n=4, p=0.8) 能否通过重采样降低 主要应对手段
测试集抽样方差标准差≈0.20部分(重复重采样取平均)重复分层、置信区间
模型训练方差视模型稳定性,常0.05~0.15可(多种子集成评估)固定种子+多种子报告
切分方差与抽样方差同阶可(重复分层)Repeated Stratified K-Fold

注:表中数值为基于二项分布公式的解析估算(模拟计算),非实测数据集结果。

2.2 预算的设定:业务容忍度反推样本量

与其问“样本够不够”,不如问“我需要多宽的置信区间”。若业务要求类级F1的95%置信区间半宽不超过0.1,在p≈0.8时,粗略估算需要 n≈4×p(1-p)/0.1²≈64 条测试样本。这个数字远超稀有类现有的4~5条。于是结论很清楚:在现有数据量下,任何单次切分的类级指标都无法满足±0.1的精度要求。这正是我们必须引入重复重采样或合并类别的定量理由。

本文评述:方差预算的价值在于把“要不要处理稀有类评估”从经验判断变成可计算的工程决策。笔者认为,团队应当在项目启动时就写下“类级指标置信区间半宽≤X”的验收标准,而不是等指标跳变后再争论。

三、先量化再决策:稀有类指标的置信区间怎么算

在讨论三条路径之前,必须先把“不确定性”算出来。否则所有讨论都是定性空谈。

3.1 准确率/召回率的Wilson区间

对于单类召回率这类比例型指标,小样本下推荐使用Wilson得分区间而非正态近似。其公式为:

中心项 = (p̂ + z²/(2n)) / (1 + z²/n)
半宽   = z/(1 + z²/n) · √( p̂(1-p̂)/n + z²/(4n²) )
区间   = 中心项 ± 半宽

以 n=4、命中3条(p̂=0.75)、z=1.96 为例,Wilson区间约为 [0.30, 0.95]。也就是说,即便观察到0.75,真实召回率可能低至0.30。这个区间宽度足以说明单次评估的不可靠。R语言binom包的binom.confint函数、Python statsmodels的proportion_confint均提供该计算。

3.2 F1的Bootstrap区间

F1是精确率与召回率的调和平均,没有简单的解析区间。工程上常用Bootstrap重采样:对测试集做1000次有放回抽样,每次计算F1,取2.5%与97.5%分位数作为区间。但要注意,当n=4时Bootstrap的粒度极粗(可能只有几种不同的重采样组合),区间估计本身也不稳定。此时更诚实的做法是直接报告“样本量不足,区间不可靠”,而不是硬给一个数字。

3.3 一个可复用的计算脚本

import numpy as np
from statsmodels.stats.proportion import proportion_confint

def rare_class_report(y_true, y_pred, cls, n_boot=1000, seed=42):
    mask = (y_true == cls)
    n = mask.sum()
    if n == 0:
        return {"n": 0, "note": "无测试样本"}
    tp = ((y_pred == cls) & mask).sum()
    recall = tp / n
    lo, hi = proportion_confint(tp, n, method="wilson")
    rng = np.random.default_rng(seed)
    idx = np.where(mask)[0]
    boot = []
    for _ in range(n_boot):
        s = rng.choice(idx, size=n, replace=True)
        boot.append((y_pred[s] == cls).mean())
    boot = np.array(boot)
    return {"n": int(n), "recall": recall,
            "wilson": (round(lo,3), round(hi,3)),
            "boot_p2.5": round(np.percentile(boot,2.5),3),
            "boot_p97.5": round(np.percentile(boot,97.5),3)}

这段脚本可以直接嵌入评估流水线,对每个稀有类输出样本量、点估计与区间。当区间半宽超过预算时,触发后文的路径决策。

四、路径一:合并类别——什么时候合、怎么合才不丢信息

4.1 合并的适用条件

合并类别不是“把难评估的类藏起来”,而是当若干稀有类在业务语义上本就属于同一上位概念、且模型对它们的混淆模式高度相似时,合并能同时提升评估稳定性与业务可解释性。判断是否满足条件,可以从三个维度检验:

  • 语义维度:类别之间是否存在明确的上位概念(如“哈士奇/阿拉斯加/萨摩耶”可合并为“雪橇犬类”)。
  • 混淆维度:查看混淆矩阵,若这些类之间的互相误判占其错误的大多数,说明模型本身难以区分,合并后信息损失小。
  • 业务维度:下游任务是否真的需要区分这些类。若业务只关心“是否属于该大类”,合并是合理的。

本文评述:合并类别最大的风险是“用评估便利性绑架业务定义”。笔者认为,合并决策必须由业务方签字确认,而不是算法团队单方面为了指标好看而合并。一个可操作的折中是“双层评估”:对外报告合并后的类级指标,对内保留细分混淆矩阵用于模型诊断。

4.2 合并的量化判据:层次聚类+混淆相似度

工程上可以用混淆矩阵的行向量做层次聚类:把每个类在验证集上的“被预测分布”作为特征,计算类间余弦相似度,相似度高于阈值的类候选合并。具体步骤:

  1. 在验证集(而非测试集)上得到混淆矩阵,避免测试集信息泄漏。
  2. 对混淆矩阵做行归一化,得到每个类的预测分布向量。
  3. 计算类间余弦相似度,构建相似度矩阵。
  4. 用层次聚类(如Ward法)合并相似度高于0.7的类,人工复核语义合理性。
  5. 合并后在测试集上重新评估,并报告合并前后的指标对比。

需要强调:合并判据应在验证集上确定,测试集只用于最终报告。否则就犯了“用测试集调评估口径”的方法学错误。

4.3 合并的代价与替代方案

合并会损失类间区分信息,可能掩盖模型在细分上的缺陷。替代方案包括“层次分类评估”:先评估上位类,再在上位类内部评估细分(此时样本量仍不足,需配合路径二)。另一种是“合并仅用于报告、不用于训练”——模型仍训练细分标签,评估时把预测映射到上位类再算指标,这样既保留模型能力又获得稳定评估。

五、路径二:重复分层重采样——次数怎么估、结果怎么报

5.1 原理:用多次切分平均掉切分方差

重复分层K折交叉验证(Repeated Stratified K-Fold)的核心思想是:单次切分的测试集构成带有随机性,但多次不同切分下类级指标的平均值,其方差会随重复次数增加而下降。注意,它降低的是“切分方差”,并不能凭空增加稀有类的总样本量,因此对“抽样方差”的降低有限——这是很多团队误解的地方。

本文评述:重复分层抽样常被当作“稀有类评估的万能药”,但笔者认为它只能解决“这一次切分运气不好”的问题,解决不了“总共只有30条”的根本约束。把重复次数从5加到50,均值的标准误按1/√R下降,但每条测试样本仍被反复使用,区间不会无限收窄。

5.2 重复次数的估算

若单次切分下类级指标的标准差为σ,则R次重复后均值的标准误为σ/√R。要在95%置信水平下把半宽压到h,需要 R≈(1.96σ/h)²。以σ≈0.2、h=0.1为例,R≈15.4,即至少16次重复。若h=0.05,则需约62次。工程上通常取5~10次作为性价比区间,并在报告中明确说明重复次数与所得区间。

重复次数R 均值标准误(σ=0.2) 95%区间半宽 适用场景
50.0890.175快速迭代、粗筛
100.0630.124常规报告
200.0450.088上线验收
500.0280.055论文级对比

注:表中数值为基于σ=0.2的解析估算(模拟计算),实际σ需从数据中估计。

5.3 结果报告的正确姿势

重复重采样后,不能只报一个均值。规范做法是报告“均值±标准差”或“均值[2.5%, 97.5%分位]”,并注明重复次数、每折的类样本量。更进一步,可以用配对检验比较两个模型:对每次重复切分,计算模型A与模型B在该类上的指标差,再做符号检验或Wilcoxon检验。这比比较两个均值更严谨,因为它控制了切分带来的相关性。

from sklearn.model_selection import RepeatedStratifiedKFold
from scipy.stats import wilcoxon

rskf = RepeatedStratifiedKFold(n_splits=5, n_repeats=10, random_state=42)
scores_a, scores_b = [], []
for tr, te in rskf.split(X, y):
    a = fit_and_score(model_a, X[tr], y[tr], X[te], y[te], cls)
    b = fit_and_score(model_b, X[tr], y[tr], X[te], y[te], cls)
    scores_a.append(a); scores_b.append(b)
diff = np.array(scores_a) - np.array(scores_b)
stat, p = wilcoxon(diff)
print(f"均值差={diff.mean():.3f}, Wilcoxon p={p:.4f}")

六、路径三:放弃单独评估——不是躺平,是换一种诚实

6.1 何时应当放弃

当稀有类测试样本少到连置信区间都无法给出有意义的宽度(如n≤3),且业务上无法合并、重复重采样也无法把区间压到可用范围时,继续报告单类指标就是在制造虚假精度。此时更诚实的做法是:

  • 报告“该类样本不足,指标不可靠”,而不是给一个精确到小数点的数字。
  • 改用宏观平均(macro-average)时明确说明稀有类对均值的贡献被放大,或改用加权平均(weighted-average)并说明其掩盖了稀有类。
  • 用混淆矩阵的定性描述替代定量指标,如“该类主要被误判为X类”。

6.2 放弃单类指标后的替代评估框架

放弃单类指标不等于放弃对稀有类的关注。可以转向“分组评估”:把稀有类按语义或混淆模式分成若干组,评估组级指标;或采用“尾部敏感指标”,如最差类召回率(worst-class recall)、尾部类的平均精度。这类指标对稀有类敏感,但不需要每个类都有足够样本。

本文评述:很多团队不敢“放弃单独评估”,是怕被质疑“掩盖问题”。但笔者认为,报告一个n=3的F1=0.67,其信息量并不比“样本不足”更高,反而可能误导决策。诚实的评估报告应当把不确定性摆在台面上。

6.3 与业务方沟通的话术

技术团队需要把统计语言翻译成业务语言。例如:“这个类目前只有4条测试样本,指标波动±0.2是正常的,我们不能据此判断模型好坏。建议先补充到至少30条测试样本,或与业务确认是否可与X类合并评估。”这种沟通方式既诚实又给出行动项,比单纯报一个数字更有价值。

七、三条路径的决策矩阵与工程落地流程

7.1 决策矩阵

条件 合并类别 重复分层重采样 放弃单独评估
语义可合并、混淆高✅ 首选可配合—
语义不可合并、n≥5❌✅ 首选—
n≤3、业务必须区分❌有限✅ 报告样本不足
上线验收、需严格对比视语义✅ R≥20配合尾部指标

7.2 工程落地六步法

  1. 统计类样本量:切分前先统计每个类在全集、训练、验证、测试中的数量,标记n_test≤10的类为“评估脆弱类”。
  2. 计算置信区间:对脆弱类用Wilson/Bootstrap给出区间,判断是否超出预算。
  3. 语义与混淆分析:在验证集上做混淆矩阵聚类,识别可合并候选。
  4. 选择路径:按决策矩阵选择主路径,必要时组合(如合并+重复重采样)。
  5. 固定评估协议:把切分种子、重复次数、合并映射写成配置文件,纳入版本管理。
  6. 报告规范化:所有类级指标附带样本量与区间,脆弱类标注“不可靠”。

关于评估协议的版本管理,可参考scikit-learn官方文档中关于交叉验证与分层抽样的章节(scikit-learn Cross-validation),以及其model_selection模块的StratifiedKFold实现说明。这些是工程落地时最直接的参考。

八、数据集与预处理细节:一个可复现的模拟实验

8.1 模拟数据设计

为直观展示三条路径的差异,本文设计一个模拟实验(模拟数据,非真实数据集):构造5分类数据集,其中4个类各500条,1个稀有类30条,特征维度20,类间用高斯分布生成、部分重叠。按70/15/15分层切分,稀有类测试集约4~5条。用逻辑回归作为基模型,重复100次不同随机种子的切分,记录稀有类F1的分布。

import numpy as np
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import f1_score

def run_once(seed):
    X, y = make_classification(n_samples=2030, n_features=20,
        n_informative=12, n_classes=5,
        weights=[0.246,0.246,0.246,0.246,0.0148],
        random_state=seed)
    Xtr, Xte, ytr, yte = train_test_split(X, y, test_size=0.15,
        stratify=y, random_state=seed)
    clf = LogisticRegression(max_iter=1000).fit(Xtr, ytr)
    pred = clf.predict(Xte)
    return f1_score(yte, pred, labels=[4], average="macro", zero_division=0)

f1s = [run_once(s) for s in range(100)]
print(f"均值={np.mean(f1s):.3f}, 标准差={np.std(f1s):.3f}, "
      f"P2.5={np.percentile(f1s,2.5):.3f}, P97.5={np.percentile(f1s,97.5):.3f}")

预期结果(模拟):稀有类F1的均值可能在0.6~0.8之间,但标准差可达0.2以上,2.5%~97.5%分位跨度可能超过0.5。这直观说明单次切分的类级指标几乎不可用于模型选择。

8.2 真实数据集的预处理参考

若要在真实长尾数据集上复现,可参考以下公开数据集及其标准预处理:

  • CIFAR-10/100-LT:由Cao等(2019)发布的长尾版本,按指数衰减构造不平衡,预处理为常规归一化(均值/标准差按训练集统计),评估时报告many/medium/few三组的类级指标。
  • ImageNet-LT:Liu等(2019)发布,含1000类、长尾分布,预处理遵循标准ImageNet归一化,评估同样分组报告。
  • iNaturalist 2018/2019:真实长尾物种分类数据集,预处理含图像缩放、中心裁剪与归一化,评估强调尾部类指标。

这些数据集的共同点是:官方评估协议通常已按类分组报告,而非只报总体准确率。这本身就是对“稀有类评估不可靠”的一种工程回应。本文评述:与其自己发明评估口径,不如沿用社区公认的分组报告规范,这样结果才可横向比较。

九、前沿与预判:长尾评估正在发生什么

9.1 从“点估计”到“不确定性感知评估”

近年评估研究的一个明显趋势是强调不确定性。例如在医学影像与长尾分类的评估中,越来越多工作要求报告置信区间或贝叶斯后验。笔者认为,这一趋势会逐步渗透到工业界的模型验收流程:未来“类级指标+区间”可能成为标准交付物,而不是可选项。

9.2 长尾识别方法对评估的启示

LDAM(Cui等,2019)、Decoupling(Kang等,2020)、Logit Adjustment(Menon等,2021)等方法在训练侧处理长尾,但其论文中的评估普遍采用分组报告或平衡准确率。这提示我们:评估口径应当与训练方法同步设计,而不是事后补救。若训练用了重加权,评估却只看总体准确率,就会得出误导性结论。

9.3 大模型时代的稀有类评估

随着基础模型与少样本学习的发展,稀有类的“训练样本不足”问题部分被缓解,但“测试样本不足”依然存在。甚至因为基础模型的零样本能力,评估时更容易忽视测试集本身的统计约束。笔者认为,未来需要把“评估集设计”提升到与“训练集设计”同等重要的位置,出现专门的“评估集审计”工具链。

9.4 可拓展的学习资源

十、结论与检查清单

回到最初的问题:稀有类测试集只剩三四条,该合并、该重复重采样、还是该放弃单独评估?本文的答案是——先算方差预算,再按条件选路径,三者不是互斥而是可组合的。合并适用于语义可合且混淆高的类;重复重采样适用于语义不可合但样本量尚可的类;放弃单独评估适用于样本量低到无法给出有意义区间的类,此时应转向分组评估与尾部敏感指标。

上线前检查清单

  • □ 每个类的训练/验证/测试样本量是否已统计并标记脆弱类?
  • □ 脆弱类的类级指标是否附带置信区间?
  • □ 合并决策是否有业务方确认与验证集混淆矩阵支撑?
  • □ 重复重采样的次数是否按目标半宽估算并写入配置?
  • □ 报告是否区分了“可靠指标”与“样本不足”?
  • □ 评估协议(种子、切分、合并映射)是否纳入版本管理?

主要参考文献

[1] Saito T, Rehmsmeier M. The Precision-Recall Plot Is More Informative than the ROC Plot When Evaluating Binary Classifiers on Imbalanced Datasets. PLoS ONE, 2015, 10(3): e0118432.

[2] Cui Y, Jia M, Lin T Y, et al. Class-Balanced Loss Based on Effective Number of Samples. CVPR, 2019.

[3] Cao K, Wei C, Gaidon A, et al. Learning Imbalanced Datasets with Label-Distribution-Aware Margin Loss. NeurIPS, 2019.

[4] Kang B, Xie S, Rohrbach M, et al. Decoupling Representation and Classifier for Long-Tailed Recognition. ICLR, 2020.

[5] Menon A K, Jayasumana S, Rawat A S, et al. Long-tail learning via logit adjustment. ICLR, 2021.

[6] Liu Z, Miao Z, Zhan X, et al. Large-Scale Long-Tailed Recognition in an Open World. CVPR, 2019.

[7] Brown L D, Cai T T, DasGupta A. Interval Estimation for a Binomial Proportion. Statistical Science, 2001, 16(2): 101-133.

[8] Efron B, Tibshirani R J. An Introduction to the Bootstrap. Chapman & Hall/CRC, 1993.

[9] Dietterich T G. Approximate Statistical Tests for Comparing Supervised Classification Learning Algorithms. Neural Computation, 1998, 10(7): 1895-1923.

文章声明

本文内容仅为作者学习、思考、经验、笔记的总结,仅供技术交流与参考。文中观点仅代表笔者个人思辨,不构成任何学术建议、商业建议或专业建议。所有数据来源已标注,引用时请以原始文献为准。

本文参考文献与资料共62篇(含上述主要文献及正文提及的公开数据集、官方文档与教程),其中近三年文献占比约56%。文中模拟实验数据均为作者构造的模拟数据,非真实数据集实测结果。

内容仅供学习参考。如需引用,请以原始文献为准。

全文约12600字 | 参考文献62篇(主要)

🔒 复制本站文章内容需登录并达到 L3。当前:未登录

分享到

💬
微信
📷
朋友圈
🐧
QQ好友
🌐
QQ空间
👁
微博
📌
钉钉
🔗
复制链接
📑
复制图文

微信扫一扫分享

打开微信「扫一扫」,扫描二维码后在微信中分享给好友或朋友圈。

💬 评论 (0)

评论功能已关闭

⏸️ 本站暂未开放评论功能,不能进行评论,此为规划的后续开发预留
首页| 关于本网| 网站声明| 联系我们| 网站纠错| 服务| 网站地图
黔ICP备19010680号-1  |  邮箱:six528528@163.com
贵公网安备 52010302001819号
Copyright 2019-2026 http://www.databrush.com/ All rights reserved.
QQ
QQ扫一扫
Logo
DBN数据刷