labelspreading在小样本下易失效,因rbf核gamma敏感,需手动调参(1e-3起)、减小n_neighbors、标准化特征;selftrainingclassifier更鲁棒,应降低threshold至0.6~0.65、用简单基模型、控制max_iter、剔除离群未标注点并分簇处理,且标注样本代表性比算法选择更重要。

半监督学习在标注数据极少时确实有用,但直接套用经典算法(比如 LabelPropagation 或 LabelSpreading)往往效果差——不是模型不行,而是默认配置和数据预处理没对上。
为什么 LabelSpreading 在小样本下容易失效
这个 sklearn 实现默认使用 RBF 核,其 gamma 参数对样本间相似度极度敏感。当标注样本只有 5–10 个时,gamma 稍大就会让未标注点几乎只受最近 1–2 个标签影响,传播失效;稍小又导致图结构过平滑,边界模糊。
- 务必手动调
gamma:从1e-3开始试,配合max_iter=3000防止早停 -
n_neighbors别用默认值 10——标注点都不到 10 个,邻居数应设为min(5, len(labeled_indices)) - 输入特征必须标准化:
StandardScaler比MinMaxScaler更稳,否则欧氏距离失真
用 SelfTrainingClassifier 包裹一个弱分类器更靠谱
比起图模型,自训练对极小标注集更鲁棒,关键是控制“伪标签”的质量门槛。sklearn 的实现默认用 threshold=0.75,但在标注极少时,这个阈值常过高,导致几轮后就无新样本加入。
- 把
threshold降到0.6~0.65,尤其当类别不平衡时,可加estimator__class_weight='balanced' - 选基模型:用
DecisionTreeClassifier(max_depth=1)比RandomForest更合适——简单模型泛化强,不易过拟合噪声伪标签 - 必须设
max_iter(比如 10),否则可能陷入“低置信伪标签反复被选中”的死循环
别忽略未标注数据的分布偏移问题
真实场景里,未标注样本常比标注样本覆盖更广的特征空间。如果直接喂给半监督算法,模型会强行把边缘样本也分出标签,拖垮整体精度。
- 先用
IsolationForest或LocalOutlierFactor剔除离群未标注点(contamination=0.05足够) - 对剩余未标注数据做 KMeans(
n_clusters=3),再按簇分别做半监督——不同簇内分布更一致,传播更可信 - 检查伪标签的置信度分布:若多数伪标签集中在
[0.55, 0.65],说明模型没学出区分能力,该换特征或加人工校验
最麻烦的不是算法选哪个,而是标注样本是否真的有代表性。哪怕只多标 3 个难例(比如靠近决策边界的样本),常比调十次 gamma 更有效。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











