演示 KBinsDiscretizer 策略

Beginner

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

简介

在本实验中,我们将探索 Python 的 scikit-learn 库中KBinsDiscretizer类的不同策略。KBinsDiscretizer是一个用于通过对连续数据进行装箱,将连续特征离散化为分类特征的类。我们将通过将不同策略应用于不同数据集来可视化它们。

虚拟机使用提示

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

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

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

导入库

我们将首先导入必要的库。我们将使用numpymatplotlib.pyplotmake_blobs以及sklearn.preprocessing模块中的KBinsDiscretizer

import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import KBinsDiscretizer
from sklearn.datasets import make_blobs

创建数据集

为了便于可视化,我们将创建三个数据集。第一个数据集是一个随机集合,包含 200 个样本,其两个维度均服从 -3 到 3 之间的均匀分布。第二个数据集是使用sklearn.datasets中的make_blobs函数生成的 200 个样本集合。第三个数据集同样使用make_blobs函数生成。

n_samples = 200
centers_0 = np.array([[0, 0], [0, 5], [2, 4], [8, 8]])
centers_1 = np.array([[0, 0], [3, 1]])

X_list = [
    np.random.RandomState(42).uniform(-3, 3, size=(n_samples, 2)),
    make_blobs(
        n_samples=[n_samples // 10, n_samples * 4 // 10, n_samples // 10, n_samples * 4 // 10],
        cluster_std=0.5,
        centers=centers_0,
        random_state=42,
    )[0],
    make_blobs(
        n_samples=[n_samples // 5, n_samples * 4 // 5],
        cluster_std=0.5,
        centers=centers_1,
        random_state=42,
    )[0],
]

应用不同策略

现在,我们将把KBinsDiscretizer中可用的三种不同策略应用于每个数据集。这些策略分别是:

  • “uniform”(均匀):在每个特征上进行均匀离散化,这意味着每个维度上的箱宽度是恒定的。
  • “quantile”(分位数):基于分位数进行离散化,这意味着每个箱中的样本数量大致相同。
  • “kmeans”:离散化基于 KMeans 聚类过程的质心。
strategies = ["uniform", "quantile", "kmeans"]

figure = plt.figure(figsize=(14, 9))
i = 1
for ds_cnt, X in enumerate(X_list):
    ax = plt.subplot(len(X_list), len(strategies) + 1, i)
    ax.scatter(X[:, 0], X[:, 1], edgecolors="k")
    if ds_cnt == 0:
        ax.set_title("Input data", size=14)

    xx, yy = np.meshgrid(
        np.linspace(X[:, 0].min(), X[:, 0].max(), 300),
        np.linspace(X[:, 1].min(), X[:, 1].max(), 300),
    )
    grid = np.c_[xx.ravel(), yy.ravel()]

    ax.set_xlim(xx.min(), xx.max())
    ax.set_ylim(yy.min(), yy.max())
    ax.set_xticks(())
    ax.set_yticks(())

    i += 1
    ## transform the dataset with KBinsDiscretizer
    for strategy in strategies:
        enc = KBinsDiscretizer(n_bins=4, encode="ordinal", strategy=strategy)
        enc.fit(X)
        grid_encoded = enc.transform(grid)

        ax = plt.subplot(len(X_list), len(strategies) + 1, i)

        ## horizontal stripes
        horizontal = grid_encoded[:, 0].reshape(xx.shape)
        ax.contourf(xx, yy, horizontal, alpha=0.5)
        ## vertical stripes
        vertical = grid_encoded[:, 1].reshape(xx.shape)
        ax.contourf(xx, yy, vertical, alpha=0.5)

        ax.scatter(X[:, 0], X[:, 1], edgecolors="k")
        ax.set_xlim(xx.min(), xx.max())
        ax.set_ylim(yy.min(), yy.max())
        ax.set_xticks(())
        ax.set_yticks(())
        if ds_cnt == 0:
            ax.set_title("strategy='%s'" % (strategy,), size=14)

        i += 1

plt.tight_layout()
plt.show()

可视化结果

现在,我们将可视化对数据集应用不同策略后的结果。这些图表展示了离散编码保持恒定的区域。

总结

在本实验中,我们探索了 Python 的 scikit-learn 库中KBinsDiscretizer类可用的不同策略。我们创建了三个数据集,并将三种不同的策略分别应用于每个数据集。然后,我们对离散化的结果进行了可视化。