Scikit-learn 中文教程

第二部分:Scikit-learn 核心基础
第 3 章 Scikit-learn 核心设计与 API 体系
第 4 章 数据集模块与数据划分
第三部分:数据预处理与特征工程
第 5 章 数据预处理核心模块(sklearn.preprocessing)
第 6 章 特征工程:提取、选择与构建
第四部分:模型评估与验证
第 7 章 模型评估指标(按任务类型划分)
第 8 章 模型验证与超参数调优
第五部分:Scikit-learn 核心算法模块
第 9 章 有监督学习:分类算法
第 10 章 有监督学习:回归算法
第 11 章 无监督学习:聚类与密度算法
第 12 章 半监督学习与其他常用算法
第八部分:性能优化与问题解决
第 18 章 Scikit-learn 性能优化
第 19 章 Scikit-learn 常见问题与解决方案

12.1 半监督学习算法

Scikit-learn半监督学习入门:LabelPropagation和LabelSpreading分类算法

Scikit-learn 中文教程

本教程章节详细介绍Scikit-learn中的半监督学习算法,包括LabelPropagation和LabelSpreading,适用于少量标注数据的场景。提供从理论到实操的完整指南,包括代码示例和效果评估方法,帮助新手快速上手。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

Scikit-learn半监督学习教程:基于图的分类算法

引言

半监督学习是机器学习中一个重要的分支,它巧妙结合少量标注数据和大量未标注数据来训练模型,特别适用于标注成本高昂或数据标注困难的场景。在Scikit-learn库中,半监督分类算法以基于图的方法为主,其中LabelPropagation和LabelSpreading是两个核心工具,能有效利用数据间的相似性传播标签信息。

半监督学习的适用场景

半监督学习的最大优势在于它能利用未标注数据来增强模型性能,主要适用于以下场景:

  • 少量标注数据,大量未标注数据:例如,在医疗诊断、自然语言处理或图像识别中,标注需要专家知识,成本高。
  • 数据分布复杂:未标注数据可以帮助模型捕捉数据的底层结构,提高泛化能力。
  • 资源有限环境:在数据收集初期或标注资源不足时,半监督学习能加速模型开发。

LabelPropagation和LabelSpreading算法

这两种算法基于图论思想,将数据点表示为图中的节点,相似度高的点相连。通过迭代传播标签,逐步预测未标注数据的类别。

  • LabelPropagation:使用图的邻接矩阵来传播标签,基于相似度更新未知节点标签。假设相似点应有相同标签,通过迭代收敛。
  • LabelSpreading:是LabelPropagation的改进版本,引入平滑参数(如α)来控制标签传播的强度,减少噪声干扰,提高稳定性。在Scikit-learn中,它们都继承自BaseEstimator,易于使用和扩展。

Scikit-learn实操指南

下面通过一个完整示例演示如何在Scikit-learn中使用半监督学习。我们将生成一个二分类数据集,模拟少量标注数据的场景。

步骤1:导入必要库

import numpy as np
import matplotlib.pyplot as plt
from sklearn.semi_supervised import LabelPropagation, LabelSpreading
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report

步骤2:准备数据

使用make_classification生成示例数据,并模拟只有10%数据有标签的情况。

# 生成1000个样本的二维数据集
X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=42)

# 随机选择100个样本作为标注数据(标签为0或1),其余设置为未标注(-1)
n_labeled = 100
labeled_indices = np.random.choice(len(y), n_labeled, replace=False)
unlabeled_indices = [i for i in range(len(y)) if i not in labeled_indices]
y_semi = np.copy(y)
y_semi[unlabeled_indices] = -1

# 分割训练集和测试集,测试集仅使用有标签部分进行评估
X_train, X_test, y_train, y_test = train_test_split(X, y_semi, test_size=0.2, random_state=42)

步骤3:训练模型

分别初始化LabelPropagation和LabelSpreading模型,并训练。

# 创建模型实例
lp = LabelPropagation()
ls = LabelSpreading()

# 训练模型,未标注部分(-1)不参与损失计算
lp.fit(X_train, y_train)
ls.fit(X_train, y_train)

步骤4:预测与评估

在测试集上进行预测,并使用标注部分评估模型性能。

# 预测测试集
X_test_labeled = X_test[y_test != -1]  # 仅取有标签部分
y_test_labeled = y_test[y_test != -1]

y_pred_lp = lp.predict(X_test_labeled)
y_pred_ls = ls.predict(X_test_labeled)

# 计算准确率
accuracy_lp = accuracy_score(y_test_labeled, y_pred_lp)
accuracy_ls = accuracy_score(y_test_labeled, y_pred_ls)
print(f"LabelPropagation Accuracy: {accuracy_lp:.2f}")
print(f"LabelSpreading Accuracy: {accuracy_ls:.2f}")

# 输出详细分类报告
print("LabelPropagation Classification Report:")
print(classification_report(y_test_labeled, y_pred_lp))
print("LabelSpreading Classification Report:")
print(classification_report(y_test_labeled, y_pred_ls))

效果评估

评估半监督学习模型时,需注意以下几点:

  • 使用独立标注数据集测试:避免数据泄露,确保测试集完全是新数据。
  • 与监督学习对比:可与逻辑回归等监督模型比较,观察半监督方法在有限标注下的提升。
  • 参数调优:通过网格搜索调整gamma(相似度参数)或kernel类型以优化性能。
  • 可视化分析:绘图展示标签传播过程,例如使用PCA降维后可视化数据点和预测标签。

总结

半监督学习为处理标注数据稀缺问题提供了有效方案。通过Scikit-learn的LabelPropagation和LabelSpreading,新手可以快速入门。建议在实际项目中,结合数据清洗、特征工程和交叉验证,以获得最佳效果。半监督学习不仅是学术热点,也在工业应用中展现出巨大潜力,助力更智能的机器学习系统构建。

开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包