首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >人工智能之核心基础 机器学习 第十二章 半监督学习

人工智能之核心基础 机器学习 第十二章 半监督学习

原创
作者头像
咚咚王
发布2026-01-13 00:07:57
发布2026-01-13 00:07:57
2680
举报

人工智能之核心基础 机器学习

第十二章 半监督学习


12.1 半监督学习概述

📌 定义:站在监督与无监督的“中间地带”

  • 输入
    • 少量带标签数据:$(x_1, y_1), (x_2, y_2), \dots, (x_l, y_l)$
    • 大量无标签数据:$x{l+1}, x{l+2}, \dots, x_{l+u}$ (通常 $u \gg l$)
  • 目标:利用全部数据训练一个比仅用标签数据更好的预测模型

核心价值大幅降低标注成本! 例如:标注1万条文本需10万元,但用100条+9900条无标签,效果接近全标注。


12.2 半监督学习的两大核心假设

算法有效的前提:数据必须满足以下至少一种结构特性。

假设1:聚类假设(Cluster Assumption)

同类样本倾向于聚集在一起

e8a22efb-0ac2-4ea2-809c-fe6ce4fc94ed.png
e8a22efb-0ac2-4ea2-809c-fe6ce4fc94ed.png

图:红蓝点自然成簇,即使只有两个标签,也能推断整簇类别

✅ 应用:K-Means、Label Propagation 都依赖此假设


假设2:流形假设(Manifold Assumption)

高维数据实际分布在低维“弯曲曲面”(流形)上,相近点应有相同标签

3c986ec4-6dd5-41be-9177-9ef65f1e393d.png
3c986ec4-6dd5-41be-9177-9ef65f1e393d.png

图:瑞士卷数据,欧氏距离远的两点在流形上其实很近

✅ 应用:Label Spreading、图神经网络(GNN)利用此结构

💡 通俗理解: 就像地球表面是2D流形,虽然北京和纽约在3D空间很远,但在地表路径上可连通。


12.3 半监督算法

算法1:伪标签法(Pseudo-Labeling)

🧠 思路:
  1. 少量标签数据训练一个初始模型
  2. 用该模型预测无标签数据,取高置信度预测作为“伪标签”
  3. 把伪标签数据加入训练集,重新训练模型
  4. 可迭代多次

✅ 优点:实现简单,兼容任何分类器(如SVM、神经网络) ❌ 缺点:若初始模型差,会传播错误标签(“垃圾进,垃圾出”)


算法2:标签传播(Label Propagation) & 标签扩散(Label Spreading)

🧠 思路:
  • 构建样本相似性图(每个点连到最近邻居)
  • 标签像“墨水”一样从已知点扩散到未知点
  • Label Propagation:只保留原始标签不变
  • Label Spreading:允许原始标签也微调(更鲁棒)

✅ 优点:天然利用聚类假设,无需训练模型 ❌ 缺点:计算复杂度高($O(n^3)$),不适合大数据


算法3:自训练(Self-Training)——伪标签的迭代版

  • 与伪标签类似,但强调多轮迭代
    • 每轮只加最自信的几个样本
    • 动态调整阈值
  • 是现代深度半监督(如FixMatch)的基础

12.4 评估指标:兼顾性能与结构

场景

指标

说明

有测试集标签

准确率、F1、AUC

标准监督指标,衡量预测能力

无测试标签

轮廓系数、CH指数

衡量预测结果是否符合数据聚类结构

综合评估

准确率 + 轮廓系数

既要看预测对不对,也要看是否尊重数据分布

💡 最佳实践: 在验证集上同时监控两个指标,避免模型“过拟合标签但违背数据结构”。


12.5 优缺点与适用场景

✅ 适用场景

  • 标注成本极高:医学影像、法律文书、专业领域文本
  • 已有大量无标签数据:用户行为日志、网页爬虫数据
  • 标签稀疏但结构清晰:社交网络(少数人有标签,朋友关系明确)

❌ 局限性

  • 对数据分布敏感:若不满足聚类/流形假设,效果可能比纯监督还差
  • 噪声放大风险:伪标签错误会累积
  • 调参复杂:如何选伪标签阈值?何时停止迭代?

⚠️ 重要提醒: 不要盲目使用半监督!先验证:无标签数据是否与标签数据同分布? 数据是否呈现明显聚类结构?


12.6 实战案例 + 代码实现(Scikit-learn)

案例1:半监督文本分类(新闻主题)

代码语言:python
复制
import numpy as np
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.semi_supervised import LabelPropagation, LabelSpreading
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split

# 加载新闻数据
categories = ['alt.atheism', 'soc.religion.christian', 'comp.graphics', 'sci.med']
news = fetch_20newsgroups(subset='all', categories=categories, remove=('headers', 'footers'))

X_text = news.data
y_true = news.target

# 向量化
vectorizer = TfidfVectorizer(max_features=5000, stop_words='english')
X = vectorizer.fit_transform(X_text)

# 模拟:仅用1%数据有标签
np.random.seed(42)
n_total = len(y_true)
n_labeled = int(0.01 * n_total)  # 1%有标签

# 随机选择有标签样本
labeled_indices = np.random.choice(n_total, size=n_labeled, replace=False)
y_semi = np.full(n_total, -1)  # -1 表示无标签
y_semi[labeled_indices] = y_true[labeled_indices]

# 方法1:伪标签法(用逻辑回归)
lr = LogisticRegression(max_iter=1000)
lr.fit(X[labeled_indices], y_true[labeled_indices])

# 预测无标签数据,取高置信度(>0.95)
proba = lr.predict_proba(X)
pseudo_labels = lr.predict(X)
high_conf = np.max(proba, axis=1) > 0.95

# 构建新训练集
X_train_pseudo = X[np.concatenate([labeled_indices, np.where(high_conf)[0]])]
y_train_pseudo = np.concatenate([y_true[labeled_indices], pseudo_labels[high_conf]])

# 重新训练
lr_pseudo = LogisticRegression(max_iter=1000)
lr_pseudo.fit(X_train_pseudo, y_train_pseudo)

# 方法2:Label Spreading
ls = LabelSpreading(kernel='knn', n_neighbors=10, max_iter=100)
ls.fit(X, y_semi)

# 评估(用完整测试集)
test_indices = np.setdiff1d(np.arange(n_total), labeled_indices)
y_test = y_true[test_indices]

print("=== 伪标签法 ===")
print(classification_report(y_test, lr_pseudo.predict(X[test_indices])))

print("\n=== Label Spreading ===")
print(classification_report(y_test, ls.predict(X[test_indices])))

📊 典型结果(1%标签):纯监督(仅1%):准确率 ~60% 伪标签法:~75% Label Spreading:~78%


案例2:半监督客户分群(结合少量标签优化聚类)

代码语言:python
复制
from sklearn.datasets import make_classification
from sklearn.semi_supervised import LabelSpreading
from sklearn.cluster import KMeans
from sklearn.metrics import adjusted_rand_score as ARI

# 模拟客户数据(收入、消费、活跃度)
X, y_true = make_classification(n_samples=1000, n_features=3, n_redundant=0, 
                               n_clusters_per_class=1, n_classes=3, random_state=42)

# 仅10个客户有标签(业务专家标注)
labeled_idx = np.random.choice(1000, size=10, replace=False)
y_semi = np.full(1000, -1)
y_semi[labeled_idx] = y_true[labeled_idx]

# 1. 纯无监督:K-Means
kmeans = KMeans(n_clusters=3, random_state=42)
y_km = kmeans.fit_predict(X)

# 2. 半监督:Label Spreading
ls = LabelSpreading(kernel='rbf', gamma=10)
ls.fit(X, y_semi)
y_ls = ls.predict(X)

# 评估(假设我们知道真实标签)
print("K-Means ARI:", ARI(y_true, y_km))
print("Label Spreading ARI:", ARI(y_true, y_ls))

# 可视化(前两维)
plt.figure(figsize=(12, 4))
plt.subplot(131)
plt.scatter(X[:, 0], X[:, 1], c=y_true, cmap='tab10')
plt.title("真实标签")

plt.subplot(132)
plt.scatter(X[:, 0], X[:, 1], c=y_km, cmap='tab10')
plt.title("K-Means (无监督)")

plt.subplot(133)
plt.scatter(X[:, 0], X[:, 1], c=y_ls, cmap='tab10')
plt.title("Label Spreading (半监督)")

plt.show()

💡 业务价值: 即使只有10个专家标注,半监督结果显著优于纯聚类,且能对齐业务定义的类别!


🎯 本章总结

方法

原理

优点

缺点

适用场景

伪标签法

高置信预测作标签

简单、通用

错误传播

文本、图像分类

Label Propagation

图上标签扩散

利用局部结构

计算慢

小规模结构化数据

Label Spreading

正则化标签扩散

更鲁棒

同上

同上,推荐优先用

💡 建议:

  1. 先试伪标签法:快速集成到现有流程
  2. 小数据用Label Spreading:效果稳定
  3. 务必验证假设:画t-SNE图看是否有清晰聚类
  4. 控制伪标签质量:宁少勿错(阈值设高些)

📘 延伸方向

  • 深度半监督:FixMatch、Mean Teacher
  • 图半监督:GCN + 标签传播
  • 主动学习 + 半监督:智能选择最有价值样本标注

资料关注

公众号:咚咚王

《Python编程:从入门到实践》

《利用Python进行数据分析》

《算法导论中文第三版》

《概率论与数理统计(第四版) (盛骤) 》

《程序员的数学》

《线性代数应该这样学第3版》

《微积分和数学分析引论》

《(西瓜书)周志华-机器学习》

《TensorFlow机器学习实战指南》

《Sklearn与TensorFlow机器学习实用指南》

《模式识别(第四版)》

《深度学习 deep learning》伊恩·古德费洛著 花书

《Python深度学习第二版(中文版)【纯文本】 (登封大数据 (Francois Choliet)) (Z-Library)》

《深入浅出神经网络与深度学习+(迈克尔·尼尔森(Michael+Nielsen)》

《自然语言处理综论 第2版》

《Natural-Language-Processing-with-PyTorch》

《计算机视觉-算法与应用(中文版)》

《Learning OpenCV 4》

《AIGC:智能创作时代》杜雨+&+张孜铭

《AIGC原理与实践:零基础学大语言模型、扩散模型和多模态模型》

《从零构建大语言模型(中文版)》

《实战AI大模型》

《AI 3.0》

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 人工智能之核心基础 机器学习
    • 12.1 半监督学习概述
      • 📌 定义:站在监督与无监督的“中间地带”
    • 12.2 半监督学习的两大核心假设
      • 假设1:聚类假设(Cluster Assumption)
      • 假设2:流形假设(Manifold Assumption)
    • 12.3 半监督算法
      • 算法1:伪标签法(Pseudo-Labeling)
      • 算法2:标签传播(Label Propagation) & 标签扩散(Label Spreading)
      • 算法3:自训练(Self-Training)——伪标签的迭代版
    • 12.4 评估指标:兼顾性能与结构
    • 12.5 优缺点与适用场景
      • ✅ 适用场景
      • ❌ 局限性
    • 12.6 实战案例 + 代码实现(Scikit-learn)
      • 案例1:半监督文本分类(新闻主题)
      • 案例2:半监督客户分群(结合少量标签优化聚类)
    • 🎯 本章总结
      • 💡 建议:
  • 资料关注
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档