Graficación Avanzada Con Dependencia Parcial

La función plot_partial_dependence devuelve un objeto PartialDependenceDisplay que puede utilizarse para graficar sin necesidad de recalcular la dependencia parcial. En este ejemplo, mostramos cómo trazar gráficos de dependencia parcial y cómo personalizar rápidamente el gráfico con la API de visualización.

print(__doc__)

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_diabetes
from sklearn.neural_network import MLPRegressor
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline
from sklearn.tree import DecisionTreeRegressor
from sklearn.inspection import plot_partial_dependence

Entrenar modelos en el conjunto de datos de diabetes

Primero, entrenamos un árbol de decisión y un perceptrón multicapa en el conjunto de datos de diabetes.

diabetes = load_diabetes()
X = pd.DataFrame(diabetes.data, columns=diabetes.feature_names)
y = diabetes.target

tree = DecisionTreeRegressor()
mlp = make_pipeline(StandardScaler(),
                    MLPRegressor(hidden_layer_sizes=(100, 100),
                                 tol=1e-2, max_iter=500, random_state=0))
tree.fit(X, y)
mlp.fit(X, y)

Out:

/home/mapologo/miniconda3/envs/sklearn/lib/python3.9/site-packages/scikit_learn-0.24.1-py3.9-linux-x86_64.egg/sklearn/neural_network/_multilayer_perceptron.py:614: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet.
  warnings.warn(

Pipeline(steps=[('standardscaler', StandardScaler()),
                ('mlpregressor',
                 MLPRegressor(hidden_layer_sizes=(100, 100), max_iter=500,
                              random_state=0, tol=0.01))])

Gráfico de la dependencia parcial para dos características

Graficamos curvas de dependencia parcial para las características «age» y «bmi» (índice de masa corporal) para el árbol de decisión. Con dos características, plot_partial_dependence espera trazar dos curvas. Aquí la función de graficación coloca una cuadrícula de dos graficos usando el espacio definido por ax .

fig, ax = plt.subplots(figsize=(12, 6))
ax.set_title("Decision Tree")
tree_disp = plot_partial_dependence(tree, X, ["age", "bmi"], ax=ax)
Decision Tree

Las curvas de dependencia parcial pueden ser graficadas para el perceptrón multicapa. En este caso, line_kw se pasa a plot_partial_dependence para cambiar el color de la curva.

fig, ax = plt.subplots(figsize=(12, 6))
ax.set_title("Multi-layer Perceptron")
mlp_disp = plot_partial_dependence(mlp, X, ["age", "bmi"], ax=ax,
                                   line_kw={"color": "red"})
Multi-layer Perceptron

Gráfico de la dependencia parcial de los dos modelos juntos

Los objetos tree_disp y mlp_disp PartialDependenceDisplay contienen toda la información calculada necesaria para recrear las curvas de dependencia parcial. Esto significa que podemos crear fácilmente gráficos adicionales sin necesidad de volver a calcular las curvas.

Una forma de representar las curvas es colocarlas en la misma figura, con las curvas de cada modelo en cada fila. Primero, creamos una figura con dos ejes dentro de dos filas y una columna. Los dos ejes se pasan a las funciones plot de tree_disp y mlp_disp. Los ejes dados serán utilizados por la función de graficación para dibujar la dependencia parcial. El gráfico resultante coloca las curvas de dependencia parcial del árbol de decisión en la primera fila y el perceptrón multicapa en la segunda.

fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 10))
tree_disp.plot(ax=ax1)
ax1.set_title("Decision Tree")
mlp_disp.plot(ax=ax2, line_kw={"color": "red"})
ax2.set_title("Multi-layer Perceptron")
Decision Tree, Multi-layer Perceptron

Out:

Text(0.5, 1.0, 'Multi-layer Perceptron')

Otra forma de comparar las curvas es graficarlas una encima de la otra. Aquí, creamos una figura con una fila y dos columnas. Los ejes se pasan a la función plot como una lista, que trazará las curvas de dependencia parcial de cada modelo en los mismos ejes. La longitud de la lista de ejes debe ser igual al número de gráficos dibujados.

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 6))
tree_disp.plot(ax=[ax1, ax2], line_kw={"label": "Decision Tree"})
mlp_disp.plot(ax=[ax1, ax2], line_kw={"label": "Multi-layer Perceptron",
                                      "color": "red"})
ax1.legend()
ax2.legend()
plot partial dependence visualization api

Out:

<matplotlib.legend.Legend object at 0x7f2c1fd6cee0>

tree_disp.axes_ es un arreglo numpy que contiene los ejes utilizados para dibujar los gráficos de dependencia parcial. Esto se puede pasar a mlp_disp para tener el mismo efecto de dibujar los gráficos uno encima del otro. Además, mlp_disp.figure_ almacena la figura, lo que permite redimensionar la figura después de invocar a plot. En este caso, tree_disp.axes_ tiene dos dimensiones, por lo que plot sólo mostrará la etiqueta y y las marcas en el gráfico más a la izquierda.

tree_disp.plot(line_kw={"label": "Decision Tree"})
mlp_disp.plot(line_kw={"label": "Multi-layer Perceptron", "color": "red"},
              ax=tree_disp.axes_)
tree_disp.figure_.set_size_inches(10, 6)
tree_disp.axes_[0, 0].legend()
tree_disp.axes_[0, 1].legend()
plt.show()
plot partial dependence visualization api

Gráfico de la dependencia parcial de una característica

Aquí, trazamos las curvas de dependencia parcial para una sola característica, «age», en los mismos ejes. En este caso, tree_disp.axes_ se pasa a la segunda función de graficación.

tree_disp = plot_partial_dependence(tree, X, ["age"])
mlp_disp = plot_partial_dependence(mlp, X, ["age"],
                                   ax=tree_disp.axes_,
                                   line_kw={"color": "red"})
plot partial dependence visualization api

Tiempo total de ejecución del script: (0 minutos 5.812 segundos)

Galería generada por Sphinx-Gallery