Introducción
Esta práctica demuestra cómo utilizar la Clasificación por Procesos Gausianos (GPC, por sus siglas en inglés) en la biblioteca scikit-learn para Python. El objetivo es mostrar cómo entrenar y probar un modelo GPC, graficar líneas de iso-probabilidad y evaluar el rendimiento de la clasificación.
Consejos sobre la VM
Una vez que se haya iniciado 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 sus comentarios después de la sesión y lo resolveremos rápidamente para usted.
Importar las bibliotecas necesarias
En primer lugar, necesitamos importar las bibliotecas necesarias.
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import cm
from sklearn.gaussian_process import GaussianProcessClassifier
from sklearn.gaussian_process.kernels import DotProduct, ConstantKernel as C
Preparar los datos
Generaremos algunos datos sintéticos para la clasificación. La función a clasificar se define como:
def g(x):
"""La función a predecir (la clasificación consistirá en predecir
si g(x) <= 0 o no)"""
return 5.0 - x[:, 1] - 0.5 * x[:, 0] ** 2.0
Luego, necesitamos crear el diseño de experimentos y las observaciones.
## Unos constantes
lim = 8
## Diseño de experimentos
X = np.array(
[
[-4.61611719, -6.00099547],
[4.10469096, 5.32782448],
[0.00000000, -0.50000000],
[-6.17289014, -4.6984743],
[1.3109306, -6.93271427],
[-5.03823144, 3.10584743],
[-2.87600388, 6.74310541],
[5.21301203, 4.26386883],
]
)
## Observaciones
y = np.array(g(X) > 0, dtype=int)
Entrenar el modelo
Utilizaremos un modelo GPC para clasificar los datos. En primer lugar, necesitamos especificar la función del kernel.
kernel = C(0.1, (1e-5, np.inf)) * DotProduct(sigma_0=0.1) ** 2
Luego, podemos crear un modelo GPC y entrenarlo utilizando los datos.
gp = GaussianProcessClassifier(kernel=kernel)
gp.fit(X, y)
Evaluar el modelo
Evaluaremos el rendimiento de clasificación del modelo GPC entrenado. Generaremos una cuadrícula de puntos y calcularemos las probabilidades predichas para cada punto utilizando el modelo entrenado.
## Evaluar la función real y la probabilidad predicha
res = 50
x1, x2 = np.meshgrid(np.linspace(-lim, lim, res), np.linspace(-lim, lim, res))
xx = np.vstack([x1.reshape(x1.size), x2.reshape(x2.size)]).T
y_true = g(xx)
y_prob = gp.predict_proba(xx)[:, 1]
y_true = y_true.reshape((res, res))
y_prob = y_prob.reshape((res, res))
Graficar los resultados
Graficaremos las líneas de iso-probabilidad y el límite de clasificación del modelo GPC.
## Graficar los valores iso de clasificación probabilística
fig = plt.figure(1)
ax = fig.gca()
ax.axes.set_aspect("equal")
plt.xticks([])
plt.yticks([])
ax.set_xticklabels([])
ax.set_yticklabels([])
plt.xlabel("$x_1$")
plt.ylabel("$x_2$")
cax = plt.imshow(y_prob, cmap=cm.gray_r, alpha=0.8, extent=(-lim, lim, -lim, lim))
norm = plt.matplotlib.colors.Normalize(vmin=0.0, vmax=0.9)
cb = plt.colorbar(cax, ticks=[0.0, 0.2, 0.4, 0.6, 0.8, 1.0], norm=norm)
cb.set_label(r"${\rm \mathbb{P}}\left[\widehat{G}(\mathbf{x}) \leq 0\right]$")
plt.clim(0, 1)
plt.plot(X[y <= 0, 0], X[y <= 0, 1], "r.", markersize=12)
plt.plot(X[y > 0, 0], X[y > 0, 1], "b.", markersize=12)
plt.contour(x1, x2, y_true, [0.0], colors="k", linestyles="dashdot")
cs = plt.contour(x1, x2, y_prob, [0.666], colors="b", linestyles="solid")
plt.clabel(cs, fontsize=11)
cs = plt.contour(x1, x2, y_prob, [0.5], colors="k", linestyles="dashed")
plt.clabel(cs, fontsize=11)
cs = plt.contour(x1, x2, y_prob, [0.334], colors="r", linestyles="solid")
plt.clabel(cs, fontsize=11)
plt.show()
Resumen
En este laboratorio, hemos aprendido cómo utilizar la Clasificación con Procesos Gaussianos (GPC) en la biblioteca scikit-learn para Python. Hemos demostrado cómo entrenar y probar un modelo GPC, graficar líneas de iso-probabilidad y evaluar el rendimiento de clasificación.