Grid Search en Python

La mayoría de los modelos de aprendizaje automático contienen parámetros que se pueden ajustar para variar la forma en que aprende el modelo. Por ejemplo, el modelo de regresión logística, de sklearn, tiene un parámetro C que controla la regularización, lo que afecta la complejidad del modelo.

¿Cómo elegimos el mejor valor para C? El mejor valor depende de los datos utilizados para entrenar el modelo.

¿Cómo funciona?

Un método es probar diferentes valores y luego elegir el valor que da la mejor puntuación. Esta técnica se conoce como búsqueda en cuadrícula. Si tuviéramos que seleccionar los valores para dos o más parámetros, evaluaríamos todas las combinaciones de los conjuntos de valores formando así una cuadrícula de valores.

Antes de entrar en el ejemplo, es bueno saber qué hace el parámetro que estamos cambiando. Los valores más altos de C le dicen al modelo, los datos de entrenamiento se asemejan a la información del mundo real, colocan un mayor peso en los datos de entrenamiento. Mientras que los valores más bajos de C hacen lo contrario.

Uso de parámetros predeterminados

Primero, veamos qué tipo de resultados podemos generar sin una búsqueda en cuadrícula usando solo los parámetros base.

Para comenzar, primero debemos cargar el conjunto de datos con el que trabajaremos.

from sklearn import datasets
iris = datasets.load_iris()

Luego, para crear el modelo, debemos tener un conjunto de variables independientes X y una variable dependiente y.

X = iris['data']
y = iris['target']

Ahora cargaremos el modelo logístico para clasificar las flores de iris.

from sklearn.linear_model import LogisticRegression

Crear el modelo, establecer max_iter en un valor más alto para garantizar que el modelo encuentre un resultado.

Tenga en cuenta que el valor predeterminado para C en un modelo de regresión logística es 1, lo compararemos más adelante.

En el siguiente ejemplo, observamos el conjunto de datos del iris e intentamos entrenar un modelo con valores variables para C en regresión logística.

logit = LogisticRegression(max_iter = 10000)

Después de crear el modelo, debemos ajustar el modelo a los datos.

print(logit.fit(X,y))

Para evaluar el modelo ejecutamos el método de puntuación.

print(logit.score(X,y))

Ejemplo

from sklearn import datasets
from sklearn.linear_model import LogisticRegression

iris = datasets.load_iris()

X = iris['data']
y = iris['target']

logit = LogisticRegression(max_iter = 10000)

print(logit.fit(X,y))

print(logit.score(X,y))

Con la configuración predeterminada de C = 1, logramos una puntuación de 0,973.

Veamos si podemos hacerlo mejor implementando una búsqueda en cuadrícula con valores de diferencia de 0.973.

Implementación de búsqueda en cuadrícula

Seguiremos los mismos pasos de antes excepto que esta vez estableceremos un rango de valores para C.

Saber qué valores establecer para los parámetros buscados requerirá una combinación de conocimiento y práctica del dominio.

Dado que el valor predeterminado para C es 1, estableceremos un rango de valores a su alrededor.

C = [0.25,0.5,0.75,1,1.25,1.5,1.75,2]

A continuación, crearemos un ciclo for para cambiar los valores de C y evaluar el modelo con cada cambio.

Primero crearemos una lista vacía para almacenar la puntuación dentro.

scores = []

Para cambiar los valores de C, debemos recorrer el rango de valores y actualizar el parámetro cada vez.

for choice in C:
  logit.set_params(C=choice)
  logit.fit(X, y)
  scores.append(logit.score(X, y))

Con las puntuaciones almacenadas en una lista, podemos evaluar cuál es la mejor opción de C.

print(scores)

Ejemplo

from sklearn import datasets
from sklearn.linear_model import LogisticRegression

iris = datasets.load_iris()

X = iris['data']
y = iris['target']

logit = LogisticRegression(max_iter = 10000)

C = [0.25,0.5,0.75,1,1.25,1.5,1.75,2]

scores = []

for choice in C:
  logit.set_params(C=choice)
  logit.fit(X, y)
  scores.append(logit.score(X, y))

print(scores)

Resultados explicados

Podemos ver que los valores más bajos de C funcionaron peor que el parámetro base de 1. Sin embargo, a medida que aumentamos el valor de C a 1,75, el modelo experimentó una mayor precisión.

Parece que aumentar C más allá de esta cantidad no ayuda a aumentar la precisión del modelo.

Nota sobre las mejores prácticas

Calificamos nuestro modelo de regresión logística usando los mismos datos que se usaron para entrenarlo. Si el modelo se corresponde demasiado con esos datos, es posible que no sea muy bueno para predecir datos no vistos. Este error estadístico se conoce como sobreajuste.

Para evitar que las puntuaciones de los datos de entrenamiento nos engañen, podemos dejar de lado una parte de nuestros datos y utilizarlos específicamente con el propósito de probar el modelo. Consulte la lección sobre la división del tren/prueba para evitar ser engañado y sobreajustado.