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

Beginner

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

简介

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

虚拟机提示

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

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

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

导入所需库并定义常量

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

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 函数生成多标签数据集。我们还学习了如何绘制数据集以及打印类别和特征概率。