Librería boundaries

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:

from boundaries import plot_decision_boundaries, show_boundaries

(habrá ocasiones en la que queramos invocar la función plot_decision_boundaries directamente)