modAL主动学习核心是让人工标注聚焦于模型最不确定、最有提升潜力的样本,以20%标注量达90%全量效果;初始化ActiveLearner必须提供初始训练数据X_training/y_training(至少3–5个/类),否则estimator_未创建将报错。

用 modAL 做主动学习,核心不是“代替人工标注”,而是让每次人工标注都落在刀刃上——模型最不确定、最有提升潜力的那几个样本。它不降低单条标注难度,但能让你用 20% 的标注量达到 90% 的全量训练效果。
初始化 ActiveLearner 时必须传入初始训练数据
很多人卡在第一步:调用 ActiveLearner 后直接 query() 报错 AttributeError: 'ActiveLearner' object has no attribute 'estimator_' 。这是因为 estimator 模型尚未拟合——modAL 要求你显式提供 X_training 和 y_training(哪怕只有 5–10 条),它才会内部调用 fit() 初始化模型。
- 不能只传
estimator就调用query();必须带X_training/y_training或后续手动调用fit() - 初始数据太少(如仅 1 个样本)会导致预测概率不稳定,建议至少 3–5 个/类
- 若用 Keras 模型,需确保
estimator已编译(model.compile()),且teach()传入的标签格式匹配(如 one-hot)
uncertainty_sampling 和 entropy_sampling 的区别不只是公式
两者都属于不确定性采样,但对模型输出的利用方式不同,直接影响选样倾向:
-
uncertainty_sampling只看最大预测概率:1 - max(proba),适合二分类或类别置信度差异明显的场景 -
entropy_sampling计算完整概率分布的香农熵:-sum(p * log(p)),对多分类更鲁棒,尤其当模型在多个类别间“犹豫不决”时(如 [0.4, 0.4, 0.2])会比uncertainty_sampling更敏感 - 如果你用的是
RandomForestClassifier且predict_proba返回校准不足的概率,entropy_sampling可能过早放大噪声;此时先用CalibratedClassifierCV包一层更稳妥
批量采样必须用 uncertainty_batch_sampling,不能循环调用 query()
想一次标 10 个样本?别写 10 次 learner.query()。那样选出来的极可能是高度相似的“邻近困惑点”,缺乏多样性,等效于重复标注同一类难例。
立即学习“Python免费学习笔记(深入)”;
-
uncertainty_batch_sampling在modAL.batch模块中,它内部做了两件事:先按不确定性排序,再用贪心策略剔除相似样本(基于特征空间距离或嵌入相似度) - 必须传入未标注池
X_pool和当前模型learner.estimator,不能只传learner - 默认 batch size 是 1;要批量选,得显式指定
n_instances=10参数 - 如果
X_pool是高维(如图像 embedding),记得提前降维或用余弦相似度替代欧氏距离,否则性能骤降
委员会查询(Committee)容易因模型同质化失效
当你用 Committee 构建多个模型投票选样本时,如果所有基模型都是 RandomForestClassifier 且参数相同,它们的预测会高度一致——结果是“委员会”形同虚设,选出的样本和单模型没区别。
- 务必让委员模型有差异:比如一个用
RandomForest,一个用SVC(probability=True),一个用LogisticRegression - 避免全部使用同种树模型+相同
random_state;至少打乱一个的max_features或max_depth -
Committee内存开销大,每轮 query 都要跑 N 个模型的predict_proba;小数据集上不如不确定性采样轻量
真正决定效果的往往不是策略本身,而是你如何定义“未标注池”——它不能是随机切分的测试集,而应尽可能覆盖真实线上数据的分布偏移。一旦池子失真,再聪明的查询也会指向错误方向。


















