勾配ブースティングの単調制約

Machine LearningMachine LearningBeginner
今すぐ練習

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

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

はじめに

このドキュメントは、勾配ブースティング推定器に対する単調制約の効果を示すステップバイステップのチュートリアルです。勾配ブースティングは、回帰と分類タスクに使用される人気のある機械学習手法です。このチュートリアルでは、人工的なデータセットを作成し、勾配ブースティング推定器を使用して、単調制約がモデルの予測に与える影響を示します。

VMのヒント

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

Jupyter Notebookの読み込みには数秒かかる場合があります。Jupyter Notebookの制限により、操作の検証は自動化できません。

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/ensemble("Ensemble Methods") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/inspection("Inspection") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/ensemble -.-> lab-49218{{"勾配ブースティングの単調制約"}} sklearn/inspection -.-> lab-49218{{"勾配ブースティングの単調制約"}} ml/sklearn -.-> lab-49218{{"勾配ブースティングの単調制約"}} end

ライブラリのインポート

このチュートリアルで必要なライブラリをインポートして始めましょう。

from sklearn.ensemble import HistGradientBoostingRegressor
from sklearn.inspection import PartialDependenceDisplay
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

データの生成

目的値が最初の特徴量と正の相関関係を持ち、2番目の特徴量と負の相関関係を持つ人工的なデータセットを生成します。また、データをより現実的にするためにいくつかのランダムノイズを追加します。

rng = np.random.RandomState(0)

n_samples = 1000
f_0 = rng.rand(n_samples)
f_1 = rng.rand(n_samples)
X = np.c_[f_0, f_1]
noise = rng.normal(loc=0.0, scale=0.01, size=n_samples)

y = 5 * f_0 + np.sin(10 * np.pi * f_0) - 5 * f_1 - np.cos(10 * np.pi * f_1) + noise

制約なしでモデルをフィットさせる

制約なしで生成されたデータにモデルをフィットさせ、制約なしでモデルがどのように機能するかを確認します。

gbdt_no_cst = HistGradientBoostingRegressor()
gbdt_no_cst.fit(X, y)

単調制約付きでモデルをフィットさせる

今度は同じデータに対して、特徴量に単調制約を加えた別のモデルをフィットさせます。最初の特徴量には単調増加制約を、2番目の特徴量には単調減少制約を課します。

gbdt_with_monotonic_cst = HistGradientBoostingRegressor(monotonic_cst=[1, -1])
gbdt_with_monotonic_cst.fit(X, y)

偏回帰係数の表示

ここでは、両方のモデルに対して予測値の偏回帰係数を2つの特徴量について表示します。

fig, ax = plt.subplots()
disp = PartialDependenceDisplay.from_estimator(
    gbdt_no_cst,
    X,
    features=[0, 1],
    feature_names=(
        "First feature",
        "Second feature",
    ),
    line_kw={"linewidth": 4, "label": "unconstrained", "color": "tab:blue"},
    ax=ax,
)
PartialDependenceDisplay.from_estimator(
    gbdt_with_monotonic_cst,
    X,
    features=[0, 1],
    line_kw={"linewidth": 4, "label": "constrained", "color": "tab:orange"},
    ax=disp.axes_,
)

for f_idx in (0, 1):
    disp.axes_[0, f_idx].plot(
        X[:, f_idx], y, "o", alpha=0.3, zorder=-1, color="tab:green"
    )
    disp.axes_[0, f_idx].set_ylim(-6, 6)

plt.legend()
fig.suptitle("Monotonic constraints effect on partial dependences")
plt.show()

特徴量名を使って単調制約を指定する

学習データに特徴量名がある場合、辞書を渡すことで単調制約を指定することができます。ここでは、同じデータを使って特徴量名を使って制約を指定することを示します。

X_df = pd.DataFrame(X, columns=["f_0", "f_1"])

gbdt_with_monotonic_cst_df = HistGradientBoostingRegressor(
    monotonic_cst={"f_0": 1, "f_1": -1}
).fit(X_df, y)

np.allclose(
    gbdt_with_monotonic_cst_df.predict(X_df), gbdt_with_monotonic_cst.predict(X)
)

まとめ

このチュートリアルでは、単調制約が勾配ブースティング推定器に与える影響を示しました。人工的なデータセットを生成し、制約なしのモデルと単調制約のあるモデルの2つをフィットさせ、予測値の偏回帰係数を2つの特徴量について表示しました。また、特徴量名を使って単調制約を指定する方法も示しました。