En diversas secciones del tutorial se hará también uso de una librería personalizada que recibe el nombre de "boundaries" y que contiene el siguiente código:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
colors = ListedColormap(["#E67332", "#18B95E", "#326DE6"])
def plot_decision_boundaries(model, X, ax):
"""Muestra las fronteras de decisión de un modelo de clasificación:
* model: Modelo entrenado
* X: Array NumPy conteniendo las muestras sobre las que realizar la predicción
* ax: Conjunto de ejes de matplotlib en el que mostrar el resultado
"""
minX = min(X[:, 0])
maxX = max(X[:, 0])
minY = min(X[:, 1])
maxY = max(X[:, 1])
marginX = (maxX - minX) * 0.1
marginY = (maxY - minY) * 0.1
x = np.linspace(minX - marginX, maxX + marginX, 1000)
y = np.linspace(minY - marginY, maxY + marginY, 1000)
X, Y = np.meshgrid(x, y)
Z = model.predict(np.c_[X.ravel(), Y.ravel()]).reshape(X.shape)
ax.contourf(X, Y, Z, levels = 2,
colors = ["#E3BCAB", "#B0D9CB", "#75B6E6"],
zorder = 0
)
def show_boundaries(model, X_train = None, X_test = None, y_train = None, y_test = None, labels = [], show = True):
"""Muestra las fronteras de decisión de un modelo de clasificación y,
sobre él, las muestras de entrenamiento y de validación:
* model: Modelo entrenado
* X_train: Array NumPy conteniendo las características de entrenamiento
* X_test: Array NumPy conteniendo las características de validación
* y_train: Array NumPy conteniendo las etiquetas de entrenamiento
* y_test: Array NumPy conteniendo las etiquetas de validación
* labels: Array NumPy conteniendo los identificadores de las clases
"""
fig, ax = plt.subplots(figsize = (7, 7))
ax.set_aspect("equal")
if model != None:
plot_decision_boundaries(model, X_train, ax)
# Train dataset
scatter = plt.scatter(
x = X_train[:, 0], y = X_train[:, 1], c = y_train,
cmap = colors, zorder = 2, edgecolor = "#666666"
)
# Test dataset
if not(X_test is None):
scatter = plt.scatter(
x = X_test[:, 0], y = X_test[:, 1], c = y_test,
cmap = colors, zorder = 2, edgecolor = "#FFFFFF"
)
ax.legend(
handles = scatter.legend_elements()[0],
labels = list(labels)
)
ax.grid(color = "#EEEEEE", zorder = 1, alpha = 0.4)
if show:
plt.show()
else:
return fig, ax
Su utilidad quedará explicada en la sección dedicada al Perceptrón. En todo caso, tal y como puede verse en el código anterior, incluye dos funciones: plot_decision_boundaries, que muestra una gráfica con las fronteras de decisión de un modelo de clasificación, y show_boundaries, que invoca a la función anterior y muestra sobre ella un diagrama de dispersión con los datos de entrenamiento y de validación.
Esta librería puede descargarse aquí y, por defecto, el fichero deberá encontrarse en la misma carpeta en la que estemos ejecutando nuestro código.
Se presupone también que, a partir de ahora, se están importando ambas funciones en cualquier libro Jupyter en el que trabajemos con el siguiente código:
(habrá ocasiones en la que queramos invocar la función plot_decision_boundaries directamente)