Scikit-learn的LabelPropagation和LabelSpreading仅能预测未标签样本最可能类别,不能直接用于自动打标;因其依赖图传播、对数据敏感、缺乏可信度阈值且易受噪声污染,需通过标准化、高置信伪标签筛选、闭环重训与人工校验等组合策略才可构建可靠半监督标注流程。

Scikit-learn 本身不提供开箱即用的半监督标注(label propagation / label spreading)“自动打标”流程,它只提供两种半监督学习算法: LabelPropagation 和 LabelSpreading,它们的作用是——在已有少量标签 + 大量未标签样本上,预测未标签样本的**最可能类别**,而非生成可交付的标注结果集。
为什么不能直接用 LabelPropagation 当标注工具?
这两个模型本质是图传播算法,依赖样本间相似性构建邻接图,对输入数据敏感、对标签比例和分布高度敏感。实际中常出现:
- 未标签样本预测置信度普遍偏低(
predict_proba输出接近均匀分布) - 微小的数据缩放或距离度量变化(如从欧氏距换为余弦距)导致预测结果大幅抖动
- 训练集里只要混入一个错标样本,就可能通过图边“污染”周边大片未标签点
- 模型不输出“是否可信”的明确阈值接口,
classes_和n_iter_等属性无法判断收敛质量
怎么用 LabelSpreading 做一次靠谱的伪标签生成?
关键不是调用一次 fit,而是构建闭环验证:先预测 → 挑高置信样本 → 加入训练集 → 重训 → 对比变化。实操建议如下:
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 必须先标准化特征:
StandardScaler().fit_transform(X),否则rbf核下的gamma参数毫无意义 - 用
LabelSpreading(kernel='rbf', gamma=20, alpha=0.2)开始试 ——gamma越大,局部相似性越强,适合簇分明数据;alpha控制标签平滑程度,0.1~0.3 是安全区间 - 别信
predict(),改用predict_proba(X_unlabeled),取每行最大概率值,只保留概率 ≥ 0.95 的样本作为伪标签(阈值需根据类别数调整:二分类可设 0.95,5 分类建议 ≥ 0.98) - 每次加入伪标签后,重新训练模型,并检查新模型在原始有标签集上的准确率是否下降 —— 下降说明伪标签引入噪声,应降低阈值或清空本轮伪标
遇到 ConvergenceWarning: Graph is not fully connected 怎么办?
这个警告不是报错,但意味着图被切分成多个连通子图,不同子图间零传播,部分未标签样本永远得不到预测结果(predict 返回 nan)。解决方法只有两个:
- 强制连通:在构造相似性矩阵前,对
rbf_kernel(X, X)结果手动给每行最大值位置补 1(即每个点至少连向自己最近邻),再归一化 - 换表示:放弃原始特征,改用预训练模型(如 Sentence-BERT、ResNet50)提取嵌入向量,再计算余弦相似度 —— 语义空间下图连通性显著提升
- 删样本:用
connected_components(来自scipy.sparse.csgraph)找出孤立子图,直接剔除对应未标签样本(它们本就不该被传播覆盖)
真正难的不是跑通代码,而是判断哪些未标签样本的伪标签能进生产标注流水线。模型输出的“预测类别”只是起点,必须叠加人工校验、跨模型一致性检查(比如再跑一遍 SelfTrainingClassifier)、以及业务规则兜底(例如“所有含‘退款’的文本不得标为‘咨询成功’”)——这些环节 scikit-learn 一句代码都不会帮你做。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










