LabelSpreading是一种基于图的半监督学习算法,由Zhou等人于2003年提出,通过构建相似性图将已知标签平滑地扩散到未标注样本;适用于标注成本高、标注数据极少而无标签数据丰富(如医学图像、工业检测)的场景,尤其在数据服从流形假设且含一定噪声时,因引入正则化项而比LabelPropagation更鲁棒。

LabelSpreading 是什么,什么时候该用它
LabelSpreading 是 scikit-learn 提供的一种半监督学习算法,核心思想是把已标注样本的标签“扩散”到未标注样本上,通过图模型(相似度图)传播信息。它适合小量标注 + 大量无标注数据的场景,比如你只有几十个带标签的图像,但手头有上万张没标过的同类图像。
它不假设数据服从某种生成式分布(不像 LabelPropagation 那样强制行和为1),而是用带正则项的损失函数优化,对噪声标签稍更鲁棒——但注意:如果已标注样本里混了明显错标的数据,LabelSpreading 仍会把错误扩散出去,这点比你想象中更敏感。
怎么调用 LabelSpreading,关键参数有哪些
直接从 sklearn.semi_supervised 导入即可,接口和监督学习模型几乎一致:
from sklearn.semi_supervised import LabelSpreading from sklearn.datasets import make_classification import numpy as np <p>X, y = make_classification(n_samples=200, n_features=2, n_redundant=0, n_informative=2, n_clusters_per_class=1, random_state=42)</p><h1>假设只给前10个样本打标,其余设为 -1(scikit-learn 半监督算法的约定)</h1><p>y_true = y.copy() y_true[10:] = -1</p><p>model = LabelSpreading(kernel='rbf', gamma=20, alpha=0.2, max_iter=30) model.fit(X, y_true) y<em>pred = model.transduction</em></p>
几个关键参数要注意:
-
kernel:默认'rbf',也可选'knn';用'knn'时必须指定n_neighbors,且对高维稀疏特征更稳定 -
gamma:仅在kernel='rbf'时生效,控制 RBF 核的宽度,值越大,局部相似性越强,容易过拟合小簇 -
alpha:控制标签平滑程度(0~1),值越小,越相信原始标注;值接近 1 会让结果趋近于均匀分布 -
max_iter:默认 30,实际中常需调到 50~100,尤其当alpha较小时收敛慢;若看到ConvergenceWarning,别忽略,要加迭代次数
常见报错和踩坑点
LabelSpreading 表面简单,但实际跑起来容易卡住或结果离谱,多数问题出在预处理和标签格式上:
- 输入
y中未标注样本必须是 -1,不能是np.nan、None或字符串'unknown',否则直接报ValueError: y contains invalid labels - 数据未标准化就用
kernel='rbf':RBF 核对量纲极度敏感,特征尺度差异大时,相似度计算失效,扩散结果基本随机;务必先做StandardScaler或MinMaxScaler - 类别严重不均衡时(比如 95% 是负样本),
LabelSpreading会倾向把未标注样本全判成多数类;可尝试在 fit 前对已标注样本做上采样,或改用LabelPropagation+ 手动调整tol - 调参时别只看训练集上的
score():它的score()方法返回的是对已标注样本的准确率,完全不反映未标注部分质量;真正要看的是model.transduction_和你人工抽查的匹配度
如何评估和导出预测结果
LabelSpreading 不提供概率输出,只给出硬标签预测(存在 transduction_ 属性里)。如果你需要置信度参考,可以:
- 查看
model.labeldistributions:形状为(n_samples, n_classes)的数组,每行是该样本被分配到各类的“软分布”,虽然不是严格概率,但可用于排序筛选高置信预测 - 对未标注样本,提取
model.labeldistributions[10:, :],取最大值对应类别作为预测,再按最大值大小降序排列,挑 top-k 当作“伪标签”喂给下一轮监督训练 - 注意:
labeldistributions的列顺序不一定和原始y的类别顺序一致,建议用model.classes_对齐
半监督不是黑盒魔法,LabelSpreading 的效果高度依赖初始标注质量、特征表达能力和图结构合理性。最容易被忽略的一点是:它默认把所有样本(包括未标注的)都纳入图节点,一旦样本量上万,内存和计算开销会陡增——这时候得考虑降维、子采样,或者换用更轻量的替代方案。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











