别再盲目随机抽样了,用不确定性采样给模型做减法

AlexGeek 初级 2026/7/24 584 浏览 8 点赞 约 2 分钟

在处理大规模数据集时,很多团队最容易陷入的误区就是“数据越多越好”。实际上,如果你采用传统的随机抽样交给标注员,大概率会发现 80% 的标注数据在模型训练中是冗余的,因为模型在这些样本上的预测已经足够自信,重复标注并不能带来性能的边际提升。

别再盲目随机抽样了,用不确定性采样给模型做减法

最近我在处理一个半监督学习的分类任务时,通过引入主动学习(Active Learning)策略,显著降低了标注成本。其核心逻辑不是由人决定标什么,而是让模型告诉我们它在哪些样本上感到“困惑”,从而精准筛选出最具信息量的关键点。

在具体实现上,我采用了最经典且高效的“不确定性采样”(Uncertainty Sampling)。判断模型是否困惑的最直接指标就是预测概率分布的熵(Entropy)。当模型对某个样本的预测概率分布非常均匀(例如在二分类中接近 0.5/0.5)时,熵值最高,这意味着模型此时最不确定,该样本的标注价值最高。

为了让大家快速上手,我分享一段基于 NumPy 的核心实现逻辑。这段代码的作用是从未标注池中筛选出模型最不确定的 $n$ 个样本:

import numpy as np

def get_uncertain_samples(model, unlabeled_data, n_samples=10):
    # 获取模型对未标注数据的预测概率分布
    probs = model.predict_proba(unlabeled_data)
    
    # 计算信息熵:Entropy = -sum(p * log(p))
    # 加上 1e-10 是为了防止 log(0) 导致计算报错
    entropy = -np.sum(probs * np.log(probs + 1e-10), axis=1)
    
    # 选取熵值最高(最不确定)的前 n 个样本索引
    uncertain_indices = np.argsort(entropy)[-n_samples:]
    return uncertain_indices

在实际部署这个工作流的过程中,我踩过一个非常深刻的坑:千万不要在模型完全随机初始化时就启动主动学习。如果模型初始状态太差,它挑选出的“困惑样本”往往不是具有代表性的边界案例,而是一些纯粹的噪声或离群值(Outliers)。如果直接基于这些噪声进行迭代,模型很容易在错误的方向上产生偏差,导致训练不收敛。

基于这个教训,我总结了一套经过验证的实操闭环流程,建议大家在落地时参考:

首先,必须进行 Warm-up 阶段。先随机抽取一小部分样本进行初步标注并训练,确保模型能够分清数据的基本面,建立起一个基础的决策边界。

其次,运行上述的不确定性筛选算法。利用 predict_proba 获取概率分布,计算熵值,将最高熵的样本推送给标注员。

接着,将这批高质量的新标注数据合并入原始训练集,重新拟合模型。

最后,重复这个循环。你会发现,随着迭代次数增加,模型性能的提升曲线会比随机抽样快得多,因为你每次喂给模型的数据都是它最需要的“补课资料”。

这种方法在专家标注成本极高的工业场景(比如医学影像识别或复杂法律文本分析)中效果极其明显。与其追求数据集的绝对数量,不如追求样本的“含金量”。

求助
更系统的工具评测汇总在AI工具实测笔记,有不少直接可参考的案例。

全部回复 (3)

早八人码农 专家 2026/7/24
确实,之前盲目标了两万条,结果效果跟标三千条差不多。
0 回复
折腾党阿凯 中级 2026/7/24
直接用伪标签不就完了?搞这套太麻烦,还没效率。
0 回复
副业中测试 中级 2026/7/24
记得得定期刷一遍旧样本,不然模型容易在死胡同里打转。
0 回复

发表回复

支持 Markdown 格式