Gradient Boosting Monotonic Constraints

Machine LearningMachine LearningBeginner
Jetzt üben

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

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

Dies ist ein Schritt-für-Schritt-Tutorial, um die Auswirkungen von monotonen Einschränkungen auf einen Gradientenboosting-Schätzer zu demonstrieren. Gradientenboosting ist eine beliebte maschinelle Lerntechnik, die für Regressions- und Klassifizierungstasks verwendet wird. In diesem Tutorial werden wir einen künstlichen Datensatz erstellen und einen Gradientenboosting-Schätzer verwenden, um die Auswirkungen von monotonen Einschränkungen auf die Vorhersagen des Modells zu demonstrieren.

VM-Tipps

Nachdem die VM gestartet ist, klicken Sie in der oberen linken Ecke, um zur Registerkarte Notebook zu wechseln und Jupyter Notebook für die Übung zu nutzen.

Manchmal müssen Sie einige Sekunden warten, bis Jupyter Notebook vollständig geladen ist. Die Validierung von Vorgängen kann aufgrund der Einschränkungen in Jupyter Notebook nicht automatisiert werden.

Wenn Sie bei der Lernphase Probleme haben, können Sie Labby gerne fragen. Geben Sie nach der Sitzung Feedback, und wir werden das Problem für Sie prompt beheben.

Bibliotheken importieren

Wir beginnen mit dem Import der erforderlichen Bibliotheken für dieses Tutorial.

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

Daten generieren

Wir werden einen künstlichen Datensatz generieren, bei dem der Zielwert positiv mit der ersten Eigenschaft und negativ mit der zweiten Eigenschaft korreliert ist. Wir werden auch etwas zufälliges Rauschen hinzufügen, um die Daten realistischer zu machen.

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

Ein Modell ohne Einschränkungen anpassen

Wir werden ein Modell auf den generierten Daten ohne jegliche Einschränkungen anpassen, um zu sehen, wie das Modell ohne jegliche Beschränkungen performt.

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

Ein Modell mit monotonen Einschränkungen anpassen

Wir werden nun ein weiteres Modell auf den gleichen Daten anpassen, jedoch mit monotonen Einschränkungen für die Merkmale. Wir werden eine monoton steigende Einschränkung für das erste Merkmal und eine monoton fallende Einschränkung für das zweite Merkmal auferlegen.

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

Anzeige der partiellen Abhängigkeit

Wir werden nun die partielle Abhängigkeit der Vorhersagen von den beiden Merkmalen für beide Modelle anzeigen.

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()

Verwendung von Merkmalsnamen zur Angabe von monotonen Einschränkungen

Wenn die Trainingsdaten Merkmalsnamen haben, ist es möglich, die monotonen Einschränkungen durch Angabe eines Wörterbuchs anzugeben. Wir werden dies nun demonstrieren, indem wir die gleichen Daten verwenden und die Einschränkungen mit Hilfe von Merkmalsnamen angeben.

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)
)

Zusammenfassung

In diesem Tutorial haben wir die Auswirkungen von monotonen Einschränkungen auf einen Gradientenboosting-Schätzer demonstriert. Wir haben einen künstlichen Datensatz erzeugt, zwei Modelle angepasst, eines ohne jegliche Einschränkungen und das andere mit monotonen Einschränkungen, und die partielle Abhängigkeit der Vorhersagen von den beiden Merkmalen dargestellt. Wir haben auch gezeigt, wie man die monotonen Einschränkungen mit Hilfe von Merkmalsnamen angibt.