使用 Scikit-Learn 生成多标签数据集

Machine LearningMachine LearningBeginner
立即练习

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

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

简介

在本实验中,我们将学习如何使用 Scikit-Learn 库的 make_multilabel_classification 函数生成多标签数据集。该函数生成多标签数据的随机样本,其中每个样本有两个特征的计数,这两个特征在两个类别中的每一个中分布不同。

虚拟机提示

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

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

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/datasets -.-> lab-49255{{"使用 Scikit-Learn 生成多标签数据集"}} ml/sklearn -.-> lab-49255{{"使用 Scikit-Learn 生成多标签数据集"}} end

导入所需库并定义常量

首先,我们需要导入所需的库,并定义用于生成多标签数据集的颜色和随机种子常量。

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

COLORS = np.array(
    [
        "!",
        "#FF3333",  ## 红色
        "#0198E1",  ## 蓝色
        "#BF5FFF",  ## 紫色
        "#FCD116",  ## 黄色
        "#FF7216",  ## 橙色
        "#4DBD33",  ## 绿色
        "#87421F",  ## 棕色
    ]
)

## 多次调用 make_multilabel_classification 时使用相同的随机种子,以确保相同的分布
RANDOM_SEED = np.random.randint(2**10)

定义绘图函数

接下来,我们定义一个函数 plot_2d,用于绘制随机生成的多标签数据集。它接受三个参数 n_labelsn_classeslength

def plot_2d(ax, n_labels=1, n_classes=3, length=50):
    X, Y, p_c, p_w_c = make_ml_clf(
        n_samples=150,
        n_features=2,
        n_classes=n_classes,
        n_labels=n_labels,
        length=length,
        allow_unlabeled=False,
        return_distributions=True,
        random_state=RANDOM_SEED,
    )

    ax.scatter(
        X[:, 0], X[:, 1], color=COLORS.take((Y * [1, 2, 4]).sum(axis=1)), marker="."
    )
    ax.scatter(
        p_w_c[0] * length,
        p_w_c[1] * length,
        marker="*",
        linewidth=0.5,
        edgecolor="black",
        s=20 + 1500 * p_c**2,
        color=COLORS.take([1, 2, 4]),
    )
    ax.set_xlabel("Feature 0 count")
    return p_c, p_w_c

此函数使用 make_multilabel_classification 函数并传入指定参数来生成数据集。然后,它使用 Matplotlib 库的 scatter 函数绘制数据集。该函数返回类别概率和特征概率。

绘制数据集

现在,我们使用 plot_2d 函数绘制随机生成的多标签数据集。我们创建一个包含两个子图的图形,并为每个子图调用 plot_2d 函数,传入不同的参数值。

_, (ax1, ax2) = plt.subplots(1, 2, sharex="row", sharey="row", figsize=(8, 4))
plt.subplots_adjust(bottom=0.15)

p_c, p_w_c = plot_2d(ax1, n_labels=1)
ax1.set_title("n_labels=1, length=50")
ax1.set_ylabel("Feature 1 count")

plot_2d(ax2, n_labels=3)
ax2.set_title("n_labels=3, length=50")
ax2.set_xlim(left=0, auto=True)
ax2.set_ylim(bottom=0, auto=True)

plt.show()

打印类别和特征概率

最后,我们使用 plot_2d 函数返回的类别概率和特征概率,打印每个类别的类别和特征概率。

print("The data was generated from (random_state=%d):" % RANDOM_SEED)
print("Class", "P(C)", "P(w0|C)", "P(w1|C)", sep="\t")
for k, p, p_w in zip(["red", "blue", "yellow"], p_c, p_w_c.T):
    print("%s\t%0.2f\t%0.2f\t%0.2f" % (k, p, p_w[0], p_w[1]))

总结

在本实验中,我们学习了如何使用 Scikit-Learn 库的 make_multilabel_classification 函数生成多标签数据集。我们还学习了如何绘制数据集以及打印类别和特征概率。