Clasificación con Procesos Gaussianos

Machine LearningMachine LearningBeginner
Practicar Ahora

This tutorial is from open-source community. Access the source code

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

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.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/gaussian_process("Gaussian Processes") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/gaussian_process -.-> lab-49141{{"Clasificación con Procesos Gaussianos"}} ml/sklearn -.-> lab-49141{{"Clasificación con Procesos Gaussianos"}} end

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.