¿Qué es GridSearchCV?

| Última modificación: 16 de abril de 2024 | Tiempo de Lectura: 3 minutos

Algunos de nuestros reconocimientos:

Premios KeepCoding

¿Sabes qué es GridSearchCV, cómo usarlo y cuáles son sus funcionalidades?

En otro artículo hemos visto cómo escoger el valor óptimo de n_neighbors por medio de un ejercicio práctico. Concluimos que el mejor método para hacer esto es la validación cruzada, un método que consiste en subdividir los datos de train en diversas partes iguales, de forma que se utilizan k – 1 para hacer train y el bloque k = 1 restante se usa para evaluar las prestaciones en función de los parámetros libres.

Este es un bucle que se repite hasta que se barran todos los bloques y se promedian los resultados.

En este post, veremos cómo acortar el paso a paso del ejercicio anteriormente mencionado por medio del gridSearchCV.

¿Que es GridSearchCV?

GridSearchCV es una técnica de validación cruzada incluida en el paquete de scikit learn. Lo que hace es ejecutarse a través de los diferentes parámetros que se introducen en la cuadrícula de parámetros y extraer los mejores valores y combinaciones de parámetros.

Aplicar GridSearchCV en un ejercicio de validación cruzada

Con gridSearchCV pasamos de esto:

from sklearn.model_selection import StratifiedKFold

X_train, X_test, y_train, y_test = train_test_split (X3, y3, test_size = 0.3, shuffle = True, random_state = 0)

nFolds = 5
kf = StratifiedKFold (n_splits = nFolds, shuffle = True, random_state = 0)
nVecinos = range (1, 16)

j = 0
for n in nVecinos:

knn = KNeighborsClassifier (n_neighbors = n)

i = 0
for idxTrain, idxVal in kf.split (X_train, y_train):

Xt = X_train [idxTrain, :]
yt = y_train [idxTrain]
Xv = X_train [idxVal, :]
yv = y_train [idxVal]

knn.fit (Xt, yt)
accMatriz [i, j] = knn.score (Kv, yv)

i+ = 1
j+ = 1

accVector = np.mean (accMatriz, axis = 0)
accStd = np.std (accMatriz, axis = 0)
idx = np.argmax (accVector)
N0pt = nVecinos [idx]

plt.plot (nVecinos, accVector, '-o')
plt.plot (nVecinos [idx], accVector [idx], 'rs')
plt.title ('El número óptimo de vecinos es: %d' % n0pt)
plt.xlabel ('# vecinos')
plt.ylabel ('5-Fold ACC')
plt.grid ()
plt.show ()

A esto:

from sklearn.model_selection import GridSearchCV

X train, X_test, y_train, y_test = train_test_split (X3, y3, test size = 0.3, shuffle = True, random_state = 0)

param_grid = {'n_neighbors': list (range(1, 16))}
grid = GridSearchCV (KNeighborsClassifier(), scoring = accuracy, param_grid = param_grid, cv = 5)
grid.fit (x_train, y train)
print ("best mean cross-validation score: {:. 3f}".format (grid.best_score_))
print ("best parameters: {}".format (grid.best_params_))

scores = np.array (grid.cv_results ['mean_test_score']
stdvalues = np.array (grid.cv_results_ ['std_test_score'])
plt.plot (nVecinos, scores, '-0')
plt.errorbar (nVecinos, scores, yerr = stdvalues, ecolor = 'g')
plt.xlabel ('# vecinos')
plt.ylabel ('5-Fold ACC')
plt.grid ()
plt.show ()

print ("acc (test): {:.2f).format (grid.score (X_test, y_test)))
GridSearchCV resultado

GridSearchCV hace una búsqueda exhaustiva. Por tanto, si le decimos al algoritmo que n_neighbors es una lista del 1 al 15 (n_neighbors’: list (range(1, 16))), con esta funcionalidad se va a entrenar el algoritmo para cada una de estas funciones, es decir, con 1, con 2, con 3 y así hasta 15.

Podrás estar pensando que esto es exactamente lo mismo que hemos hecho con el for. En parte, tienes razón; no obstante, hay una pequeña diferencia que hace grandes cambios: en este caso el modelo solo tiene un parámetro libre. Tiene más, pero solo estamos probando con el número de vecinos.

¿Cómo funciona el GridSearchCV?

Para entender mejor cómo funciona el GridSearchCV, expliquemos el ejercicio que acabamos de hacer. Tenemos un único parámetro. ¿Cómo funciona? Le pasamos el estimador, que en este caso es un KNeighborsClassifier, sin número dentro de los paréntesis, ya que este paso se encarga de hacerlo gridSearchCV por nosotros.

Luego, le pasamos el scoring, que en este caso es el accuracy; le pasamos el paramgrid, que es un diccionario, y a ese paramgrid le ponemos el nombre del parámetro (n_neighbors). Por último, añadimos la lista de valor. En este último punto es importante resaltar que es necesario que sea una lista o bien un vector, un array de numpy… Debe ser algo que simule una lista, un objeto sobre el que se pueda iterar. Para terminar, le pasamos el cv = 5.

Nuestra recomendación es que a esta línea de código le añadas un verbose = 1 o 2, ya que lo que hace esta función es ir logueando las celdas. Esto se hace para verificar la funcionalidad del array.

¿Qué sigue?

Si quieres seguir aprendiendo y descubrir cómo evitar cometer errores a la hora de crear un array, te invitamos a que te inscribas en nuestro Big Data, Inteligencia Artificial & Machine Learning Full Stack Bootcamp, una formación intensiva en la que aprenderás todo lo necesario para triunfar en este mercado laboral en pocos meses. ¡Anímate a cambiar tu vida y solicita más información!

Sandra Navarro

Business Intelligence & Big Data Advisor & Coordinadora del Bootcamp en Data Science, Big Data & Machine Learning.

Posts más leídos

¡CONVOCATORIA ABIERTA!

Big Data, IA & Machine Learning

Full Stack Bootcamp

Clases en Directo | Profesores en Activo | Temario 100% actualizado