KBinsDiscretizer戦略の実証

Machine LearningMachine LearningBeginner
今すぐ練習

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

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Pythonのscikit - learnライブラリのKBinsDiscretizerクラスに利用可能なさまざまな戦略を調べます。KBinsDiscretizerは、連続データをビン分割することで、連続的な特徴をカテゴリカルな特徴に変換するためのクラスです。異なるデータセットに適用することで、さまざまな戦略を可視化します。

VMのヒント

VMの起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebookを使って練習しましょう。

Jupyter Notebookが読み込み終わるまで数秒待つことがあります。Jupyter Notebookの制限により、操作の検証は自動化できません。

学習中に問題がある場合は、Labbyにお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/DataPreprocessingandFeatureEngineeringGroup(["Data Preprocessing and Feature Engineering"]) sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/DataPreprocessingandFeatureEngineeringGroup -.-> sklearn/preprocessing("Preprocessing and Normalization") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/preprocessing -.-> lab-49114{{"KBinsDiscretizer戦略の実証"}} sklearn/datasets -.-> lab-49114{{"KBinsDiscretizer戦略の実証"}} ml/sklearn -.-> lab-49114{{"KBinsDiscretizer戦略の実証"}} end

ライブラリのインポート

必要なライブラリをインポートして始めましょう。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

データセットの作成

可視化の目的で3つのデータセットを作成します。最初のデータセットは、両次元ともに - 3から3の一様分布からの200個のサンプルのランダムなセットです。2番目のデータセットは、sklearn.datasetsからのmake_blobs関数を使用して生成された200個のサンプルのセットです。3番目のデータセットも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に用意されている3つの異なる戦略を各データセットに適用します。戦略は以下の通りです。

  • '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クラスに用意されているさまざまな戦略を調べました。3つのデータセットを作成し、それぞれに対して3つの異なる戦略を適用しました。その後、ディスクリート化の結果を可視化しました。