Nota
Haz clic aquí para descargar el código completo del ejemplo o para ejecutar este ejemplo en tu navegador a través de Binder
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.
Nota
Ver también Curva ROC con 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)
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"})
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")
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()
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()
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"})
Tiempo total de ejecución del script: (0 minutos 5.812 segundos)