鸢尾花数据集上的半监督分类器

Machine LearningMachine LearningBeginner
立即练习

This tutorial is from open-source community. Access the source code

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本次实验中,我们将探索鸢尾花数据集上的半监督分类器。我们将比较标签传播、自训练和支持向量机(SVM)在鸢尾花数据集上生成的决策边界。我们将使用流行的 Python 机器学习库 scikit-learn 来实现分类器并可视化决策边界。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签,以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们将立即为你解决问题。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/AdvancedDataAnalysisandDimensionalityReductionGroup(["Advanced Data Analysis and Dimensionality Reduction"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/svm("Support Vector Machines") sklearn/AdvancedDataAnalysisandDimensionalityReductionGroup -.-> sklearn/semi_supervised("Semi-Supervised Learning") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/svm -.-> lab-49282{{"鸢尾花数据集上的半监督分类器"}} sklearn/semi_supervised -.-> lab-49282{{"鸢尾花数据集上的半监督分类器"}} ml/sklearn -.-> lab-49282{{"鸢尾花数据集上的半监督分类器"}} end

加载鸢尾花数据集并划分数据

我们将加载鸢尾花数据集,这是机器学习中广泛用于分类任务的数据集。该数据集包含 150 个鸢尾花样本,每个样本有四个特征:萼片长度、萼片宽度、花瓣长度和花瓣宽度。我们将把数据集划分为输入特征和目标标签。

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets

## 加载鸢尾花数据集
iris = datasets.load_iris()

## 将数据集划分为输入特征和目标标签
X = iris.data[:, :2] ## 为了可视化目的,我们仅使用前两个特征
y = iris.target

设置标签传播分类器

我们将设置三个具有不同百分比标记数据的标签传播分类器:30%、50% 和 100%。标签传播是一种半监督学习算法,它根据标记数据点和未标记数据点之间的相似性,将标签从标记数据点传播到未标记数据点。

from sklearn.semi_supervised import LabelSpreading

## 设置标签传播分类器
rng = np.random.RandomState(0)
y_rand = rng.rand(y.shape[0])
y_30 = np.copy(y)
y_30[y_rand < 0.3] = -1  ## 将随机样本设置为未标记
y_50 = np.copy(y)
y_50[y_rand < 0.5] = -1
ls30 = (LabelSpreading().fit(X, y_30), y_30, "Label Spreading 30% data")
ls50 = (LabelSpreading().fit(X, y_50), y_50, "Label Spreading 50% data")
ls100 = (LabelSpreading().fit(X, y), y, "Label Spreading 100% data")

设置自训练分类器

我们将设置两个具有不同百分比标记数据的自训练分类器:30% 和 50%。自训练是一种半监督学习算法,它在标记数据上训练一个分类器,然后使用该分类器预测未标记数据的标签。将最有把握的预测结果添加到标记数据中,并重复此过程,直到收敛。

from sklearn.semi_supervised import SelfTrainingClassifier
from sklearn.svm import SVC

## 设置自训练分类器
base_classifier = SVC(kernel="rbf", gamma=0.5, probability=True)
st30 = (
    SelfTrainingClassifier(base_classifier).fit(X, y_30),
    y_30,
    "Self-training 30% data",
)
st50 = (
    SelfTrainingClassifier(base_classifier).fit(X, y_50),
    y_50,
    "Self-training 50% data",
)

设置支持向量机分类器

我们将设置一个使用径向基函数(RBF)核的支持向量机分类器。支持向量机是一种监督学习算法,它寻找能将数据分隔到不同类别的最优超平面。

from sklearn.svm import SVC

## 设置支持向量机分类器
rbf_svc = (SVC(kernel="rbf", gamma=0.5).fit(X, y), y, "SVC with rbf kernel")

可视化决策边界

我们将创建一个覆盖输入特征空间的点的网格,并使用每个分类器预测网格中点的标签。然后,我们将绘制决策边界和标记的数据点。

## 创建一个用于绘制的网格
h = 0.02
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))

## 为标签定义一个颜色映射
color_map = {-1: (1, 1, 1), 0: (0, 0, 0.9), 1: (1, 0, 0), 2: (0.8, 0.6, 0)}

## 设置分类器
classifiers = (ls30, st30, ls50, st50, ls100, rbf_svc)

## 为每个分类器绘制决策边界和标记的数据点
for i, (clf, y_train, title) in enumerate(classifiers):
    ## 绘制决策边界
    plt.subplot(3, 2, i + 1)
    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])

    ## 将结果放入颜色图中
    Z = Z.reshape(xx.shape)
    plt.contourf(xx, yy, Z, cmap=plt.cm.Paired)
    plt.axis("off")

    ## 绘制标记的数据点
    colors = [color_map[y] for y in y_train]
    plt.scatter(X[:, 0], X[:, 1], c=colors, edgecolors="black")

    plt.title(title)

plt.suptitle("未标记的点为白色", y=0.1)
plt.show()

总结

在本实验中,我们在鸢尾花数据集上探索了半监督分类器。我们比较了标签传播、自训练和支持向量机在鸢尾花数据集上生成的决策边界。我们使用 scikit-learn 来实现分类器并可视化决策边界。我们发现,即使只有少量标记数据,标签传播和自训练也能学习到良好的决策边界。