Scikit-learn的LabelPropagation和LabelSpreading不能直接用于自动打标,因其仅输出最可能类别且无可信度阈值,需结合标准化、高置信伪标签筛选、闭环重训与人工校验才能构建可靠半监督标注流程。

Scikit-learn 的 LabelPropagation 和 LabelSpreading 能直接做标签传播,但默认参数在真实数据上常失效——不是收敛太慢,就是伪标签噪声爆炸。关键不在“能不能用”,而在怎么调参、怎么预处理、怎么验证传播质量。
LabelPropagation vs LabelSpreading:区别不止是正则化
两者都基于图模型,但行为差异明显:
-
LabelPropagation用硬标签更新(类似硬分配),迭代中不引入正则项,对初始标签质量极度敏感;一旦有错标样本,错误会快速扩散 -
LabelSpreading在每步更新后做软归一化 + α 正则(alpha=0.2默认),更鲁棒,适合噪声稍大的半监督场景 - 两者都依赖
kernel='rbf'构建相似度图,但gamma必须手动调:太小 → 图稀疏 → 传播断连;太大 → 全连接 → 标签混杂。建议从gamma=1e-3开始网格搜索
输入数据必须标准化,且不能有缺失值
标签传播本质是距离敏感的图学习,未标准化的特征会让欧氏距离失真,导致相似度计算完全失效。常见报错如 ConvergenceWarning: Graph is not fully connected 往往就源于此。
- 必须用
StandardScaler或MinMaxScaler对所有特征统一缩放(含未标记样本) -
fit_transform()只能作用于训练集(含带标签样本),未标记样本需用同一 scaler 的transform()处理 - 任何
NaN都会导致NearestNeighbors(底层用)报ValueError: Input contains NaN,务必提前用SimpleImputer填充
如何判断传播结果是否可信?别只看准确率
半监督下无法直接算测试集准确率(否则就不是半监督了)。真正该盯的是:
立即学习“Python免费学习笔记(深入)”;
- 传播后每个未标记样本的置信度:用
predict_proba()拿到概率矩阵,检查最大概率值的分布——若大量样本最大概率 - 伪标签一致性:对同一未标记样本,换不同
gamma或不同alpha运行两次,看预测标签是否稳定。不稳定即信号弱 - 人工抽检:随机抽 50 个高置信度伪标签样本,肉眼验证。发现 >10% 错误,就得回退重调图构建策略(比如换
kernel='knn')
最易被忽略的一点:标签传播不输出模型对象,它是一次性图推断。你不能像 fit()/predict() 那样反复用同一个实例预测新样本——新数据必须重新构图、重新传播。


















