KBinsDiscretizerを使った連続特徴量の離散化

Machine LearningMachine LearningBeginner
今すぐ練習

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

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

はじめに

この実験では、Scikit-learnのKBinsDiscretizerクラスを使って連続値の特徴量を離散化する方法を示します。離散化とは、特徴量の値をいくつかのビンに分割することで、連続値の特徴量を離散値の特徴量に変換するプロセスです。これは、線形関係のみをモデル化できる線形モデルを使う場合や、決定木の複雑さを軽減する場合に役立ちます。

VMのヒント

VMの起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、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/DataPreprocessingandFeatureEngineeringGroup(["Data Preprocessing and Feature Engineering"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/linear_model("Linear Models") sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/tree("Decision Trees") sklearn/DataPreprocessingandFeatureEngineeringGroup -.-> sklearn/preprocessing("Preprocessing and Normalization") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/linear_model -.-> lab-49115{{"KBinsDiscretizerを使った連続特徴量の離散化"}} sklearn/tree -.-> lab-49115{{"KBinsDiscretizerを使った連続特徴量の離散化"}} sklearn/preprocessing -.-> lab-49115{{"KBinsDiscretizerを使った連続特徴量の離散化"}} ml/sklearn -.-> lab-49115{{"KBinsDiscretizerを使った連続特徴量の離散化"}} end

必要なライブラリを読み込む

このステップでは、必要なライブラリをインポートします。

import numpy as np
import matplotlib.pyplot as plt

from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import KBinsDiscretizer
from sklearn.tree import DecisionTreeRegressor

データセットを作成する

このステップでは、連続値の入力特徴量と連続値の出力特徴量を持つデータセットを作成します。入力特徴量には numpy.random.RandomState() メソッドを使って乱数を生成し、出力特徴量には numpy.sin() メソッドを使って生成します。

rnd = np.random.RandomState(42)
X = rnd.uniform(-3, 3, size=100)
y = np.sin(X) + rnd.normal(size=len(X)) / 3
X = X.reshape(-1, 1)

データセットを可視化する

このステップでは、散布図を使ってデータセットを可視化します。

plt.scatter(X, y, color='black')
plt.show()

入力特徴量を離散化する

このステップでは、入力特徴量を離散化するためにKBinsDiscretizerクラスを使います。10個のビンを作成し、ワンホットエンコーディングを使ってデータを変換します。

enc = KBinsDiscretizer(n_bins=10, encode="onehot")
X_binned = enc.fit_transform(X)

離散化されたデータセットを可視化する

このステップでは、散布図を使って離散化されたデータセットを可視化します。

plt.scatter(X_binned, y, color='black')
plt.show()

線形回帰モデルを学習する

このステップでは、元のデータセットに対して線形回帰モデルを学習します。

reg = LinearRegression().fit(X, y)

決定木モデルを学習する

このステップでは、元のデータセットに対して決定木モデルを学習します。

reg = DecisionTreeRegressor(min_samples_split=3, random_state=0).fit(X, y)

離散化されたデータセットに対して線形回帰モデルを学習する

このステップでは、離散化されたデータセットに対して線形回帰モデルを学習します。

reg = LinearRegression().fit(X_binned, y)

離散化されたデータセットに対して決定木モデルを学習する

このステップでは、離散化されたデータセットに対して決定木モデルを学習します。

reg = DecisionTreeRegressor(min_samples_split=3, random_state=0).fit(X_binned, y)

結果を可視化する

このステップでは、離散化の前後での線形回帰と決定木モデルの結果を可視化します。

## predict with original dataset
fig, (ax1, ax2) = plt.subplots(ncols=2, sharey=True, figsize=(10, 4))
line = np.linspace(-3, 3, 1000, endpoint=False).reshape(-1, 1)
reg = LinearRegression().fit(X, y)
ax1.plot(line, reg.predict(line), linewidth=2, color="green", label="linear regression")
reg = DecisionTreeRegressor(min_samples_split=3, random_state=0).fit(X, y)
ax1.plot(line, reg.predict(line), linewidth=2, color="red", label="decision tree")
ax1.plot(X[:, 0], y, "o", c="k")
ax1.legend(loc="best")
ax1.set_ylabel("Regression output")
ax1.set_xlabel("Input feature")
ax1.set_title("Result before discretization")

## predict with transformed dataset
line_binned = enc.transform(line)
reg = LinearRegression().fit(X_binned, y)
ax2.plot(
    line,
    reg.predict(line_binned),
    linewidth=2,
    color="green",
    linestyle="-",
    label="linear regression",
)
reg = DecisionTreeRegressor(min_samples_split=3, random_state=0).fit(X_binned, y)
ax2.plot(
    line,
    reg.predict(line_binned),
    linewidth=2,
    color="red",
    linestyle=":",
    label="decision tree",
)
ax2.plot(X[:, 0], y, "o", c="k")
ax2.vlines(enc.bin_edges_[0], *plt.gca().get_ylim(), linewidth=1, alpha=0.2)
ax2.legend(loc="best")
ax2.set_xlabel("Input feature")
ax2.set_title("Result after discretization")

plt.tight_layout()
plt.show()

まとめ

この実験では、Scikit-learnのKBinsDiscretizerクラスを使って連続的な特徴量を離散化する方法を学びました。離散化は、線形モデルを使う際や決定木の複雑さを軽減する際に役立ちます。また、元のデータセットと離散化されたデータセットの両方で線形回帰と決定木モデルを学習する方法と、結果を可視化する方法も学びました。