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

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

第十二章 半监督学习


文章目录

  • [人工智能之核心基础 机器学习](#人工智能之核心基础 机器学习)
    • [12.1 半监督学习概述](#12.1 半监督学习概述)
      • [📌 定义:站在监督与无监督的"中间地带"](#📌 定义:站在监督与无监督的“中间地带”)
    • [12.2 半监督学习的两大核心假设](#12.2 半监督学习的两大核心假设)
      • [假设1:聚类假设(Cluster Assumption)](#假设1:聚类假设(Cluster Assumption))
      • [假设2:流形假设(Manifold Assumption)](#假设2:流形假设(Manifold Assumption))
    • [12.3 半监督算法](#12.3 半监督算法)
    • [12.4 评估指标:兼顾性能与结构](#12.4 评估指标:兼顾性能与结构)
    • [12.5 优缺点与适用场景](#12.5 优缺点与适用场景)
      • [✅ 适用场景](#✅ 适用场景)
      • [❌ 局限性](#❌ 局限性)
    • [12.6 实战案例 + 代码实现(Scikit-learn)](#12.6 实战案例 + 代码实现(Scikit-learn))
    • [🎯 本章总结](#🎯 本章总结)
      • [💡 建议:](#💡 建议:)
  • 资料关注

12.1 半监督学习概述

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

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

核心价值大幅降低标注成本

例如:标注1万条文本需10万元,但用100条+9900条无标签,效果接近全标注。


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

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

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

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


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

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


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

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

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

✅ 应用: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 ) O(n^3) O(n3)),不适合大数据


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

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

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

场景 指标 说明
有测试集标签 准确率、F1、AUC 标准监督指标,衡量预测能力
无测试标签 轮廓系数、CH指数 衡量预测结果是否符合数据聚类结构
综合评估 准确率 + 轮廓系数 既要看预测对不对,也要看是否尊重数据分布

💡 最佳实践

在验证集上同时监控两个指标,避免模型"过拟合标签但违背数据结构"。


12.5 优缺点与适用场景

✅ 适用场景

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

❌ 局限性

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

⚠️ 重要提醒
不要盲目使用半监督!先验证:

  1. 无标签数据是否与标签数据同分布?
  2. 数据是否呈现明显聚类结构?

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 + 标签传播
  • 主动学习 + 半监督:智能选择最有价值样本标注

资料关注

公众号:咚咚王

gitee:https://gitee.com/wy18585051844/ai_learning

《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》

相关推荐
人工智能训练2 小时前
UE5 如何显示蓝图运行流程
人工智能·ue5·ai编程·数字人·蓝图
袁气满满~_~2 小时前
Python数据分析学习
开发语言·笔记·python·学习
deephub2 小时前
构建自己的AI编程助手:基于RAG的上下文感知实现方案
人工智能·机器学习·ai编程·rag·ai编程助手
AI营销干货站2 小时前
工业B2B获客难?原圈科技解析2026五大AI营销增长引擎
人工智能
程序员老刘·2 小时前
重拾Eval能力:D4rt为Flutter注入AI进化基因
人工智能·flutter·跨平台开发·客户端开发
kebijuelun2 小时前
FlashInfer-Bench:把 AI 生成的 GPU Kernel 放进真实 LLM 系统的“闭环引擎”
人工智能·gpt·深度学习·机器学习·语言模型
Deepoch2 小时前
Deepoc具身模型开发板:让炒菜机器人成为您的智能厨师
人工智能·机器人·开发板·具身模型·deepoc·炒菜机器人·厨房机器人
Elastic 中国社区官方博客3 小时前
Elastic:DevRel 通讯 — 2026 年 1 月
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
寻星探路3 小时前
【算法专题】滑动窗口:从“无重复字符”到“字母异位词”的深度剖析
java·开发语言·c++·人工智能·python·算法·ai