Restricciones monotónicas en el Gradient Boosting

Machine LearningMachine LearningBeginner
Practicar Ahora

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

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

Este es un tutorial paso a paso para demostrar el efecto de las restricciones monotónicas en un estimador de gradient boosting. Gradient boosting es una técnica de aprendizaje automático popular utilizada para tareas de regresión y clasificación. En este tutorial, construiremos un conjunto de datos artificial y usaremos un estimador de gradient boosting para demostrar el efecto de las restricciones monotónicas en las predicciones del modelo.

Consejos sobre la VM

Una vez finalizada la inicialización de la VM, haga clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno y acceder a Jupyter Notebook para practicar.

A veces, es posible que tenga que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de las operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.

Si tiene problemas durante el aprendizaje, no dude en preguntar a Labby. Deje su retroalimentación después de la sesión y resolveremos rápidamente el problema para usted.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/ensemble("Ensemble Methods") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/inspection("Inspection") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/ensemble -.-> lab-49218{{"Restricciones monotónicas en el Gradient Boosting"}} sklearn/inspection -.-> lab-49218{{"Restricciones monotónicas en el Gradient Boosting"}} ml/sklearn -.-> lab-49218{{"Restricciones monotónicas en el Gradient Boosting"}} end

Importar bibliotecas

Comenzaremos importando las bibliotecas necesarias para este tutorial.

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

Generar datos

Generaremos un conjunto de datos artificial donde el valor objetivo está correlacionado positivamente con la primera característica y negativamente con la segunda característica. También agregaremos algo de ruido aleatorio para que los datos sean más realistas.

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

Ajustar un modelo sin restricciones

Ajustaremos un modelo a los datos generados sin ninguna restricción para ver cómo se comporta el modelo sin ninguna limitación.

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

Ajustar un modelo con restricciones monotónicas

Ahora ajustaremos otro modelo a los mismos datos, pero con restricciones monotónicas en las características. Imponeremos una restricción de aumento monotónico en la primera característica y una restricción de disminución monotónica en la segunda característica.

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

Mostrar dependencia parcial

Ahora mostraremos la dependencia parcial de las predicciones en las dos características para ambos modelos.

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

Usar nombres de características para especificar restricciones monotónicas

Si los datos de entrenamiento tienen nombres de características, es posible especificar las restricciones monotónicas pasando un diccionario. Ahora lo demostraremos usando los mismos datos y especificando las restricciones usando nombres de características.

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

Resumen

En este tutorial, demostramos el efecto de las restricciones monotónicas en un estimador de boosting de gradiente. Generamos un conjunto de datos artificiales, ajustamos dos modelos, uno sin ninguna restricción y el otro con restricciones monotónicas, y mostramos la dependencia parcial de las predicciones en las dos características. También demostramos cómo especificar las restricciones monotónicas usando nombres de características.