Ajuste de hiperparámetros GridSearchCV y RandomizedSearchCV, explicados

Explorando la optimización de hiperparámetros con GridSearchCV y RandomizedSearchCV

 

Cada modelo de aprendizaje automático que entrenas tiene un conjunto de parámetros o coeficientes de modelo. El objetivo del algoritmo de aprendizaje automático, formulado como un problema de optimización, es aprender los valores óptimos de estos parámetros. 

Además, los modelos de aprendizaje automático también tienen un conjunto de hiperparámetros. Como el valor de K, el número de vecinos, en el algoritmo K-Nearest Neighbors. O el tamaño del lote al entrenar una red neuronal profunda, y más.

Estos hiperparámetros no son aprendidos por el modelo. Sino más bien especificados por el desarrollador. Influyen en el rendimiento del modelo y son ajustables. Entonces, ¿cómo encuentras los mejores valores para estos hiperparámetros? Este proceso se llama optimización de hiperparámetros o ajuste de hiperparámetros.

Las dos técnicas más comunes de ajuste de hiperparámetros son:

  • Búsqueda en cuadrícula
  • Búsqueda aleatoria

En esta guía, aprenderemos cómo funcionan estas técnicas y su implementación en scikit-learn.

 

Entrenamiento de un clasificador SVM de referencia

 

Comencemos entrenando un clasificador SVM simple en el conjunto de datos de vinos. 

Primero, importa los módulos y clases requeridos: 

from sklearn import datasetsfrom sklearn.model_selection import train_test_splitfrom sklearn.svm import SVCfrom sklearn.metrics import accuracy_score

 

El conjunto de datos de vinos es parte de los conjuntos de datos integrados en scikit-learn. Entonces, carguemos las características y las etiquetas objetivo de la siguiente manera:

# Cargar el conjunto de datos de vinowine = datasets.load_wine()X = wine.datay = wine.target

 

El conjunto de datos de vinos es un conjunto de datos simple con 13 características numéricas y tres etiquetas de clase de salida. Es un buen candidato para aprender a manejar problemas de clasificación multi-clase. Puedes ejecutar wine.DESCR para obtener una descripción del conjunto de datos.

  

Luego, divide el conjunto de datos en conjuntos de entrenamiento y prueba. Aquí hemos usado un tamaño_de_prueba de 0.2. Por lo tanto, el 80% de los datos se asigna al conjunto de datos de entrenamiento y el 20% al conjunto de datos de prueba.

# Dividir el conjunto de datos en conjuntos de entrenamiento y pruebaX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=24)

 

Ahora, instancia un clasificador de soporte vectorial y ajusta el modelo al conjunto de datos de entrenamiento. Luego evalúa su rendimiento en el conjunto de prueba.

# Crear un clasificador SVM de referenciabaseline_svm = SVC()baseline_svm.fit(X_train, y_train)y_pred = baseline_svm.predict(X_test)

 

Dado que es un problema simple de clasificación múltiple, podemos ver la precisión del modelo.

# Evaluar el modelo de referenciaaccuracy = accuracy_score(y_test, y_pred)print(f"Precisión SVM de referencia: {accuracy:.2f}")

 

Vemos que la puntuación de precisión de este modelo con los valores predeterminados para los hiperparámetros es aproximadamente 0.78. 

Output >>>Precisión SVM de referencia: 0.78

 

Aquí usamos un random_state de 24. Para un estado aleatorio diferente, obtendrás una división de prueba de entrenamiento diferente y, posteriormente, una puntuación de precisión diferente.

Entonces, necesitamos una mejor manera que una sola división de entrenamiento-prueba para evaluar el rendimiento del modelo. ¿Quizás, entrenar el modelo en muchas divisiones de este tipo y considerar la precisión promedio? ¿Mientras también pruebas diferentes combinaciones de hiperparámetros? Sí, por eso usamos la validación cruzada en la evaluación del modelo y la búsqueda de hiperparámetros. Aprenderemos más en las siguientes secciones.

A continuación, identifiquemos los hiperparámetros que podemos ajustar para este clasificador de máquina de soporte vectorial.

 

Hiperparámetros SVM para ajustar

 

En la afinación de hiperparámetros, buscamos encontrar la mejor combinación de valores de hiperparámetros para nuestro clasificador SVM. Los hiperparámetros comúnmente ajustados para el clasificador de vectores de soporte incluyen:

  • C: Parámetro de regularización, controla el equilibrio entre maximizar el margen y minimizar el error de clasificación.
  • kernel: Especifica el tipo de función de kernel a utilizar (por ejemplo, ‘lineal’, ‘rbf’, ‘poli’).
  • gamma: Coeficiente del kernel para los kernels ‘rbf’ y ‘poli’.

 

Comprensión del papel de la validación cruzada

 

La validación cruzada ayuda a evaluar qué tan bien el modelo generaliza a datos no vistos y reduce el riesgo de sobreajuste a una sola división de entrenamiento-prueba. La validación cruzada de k-fold que se usa comúnmente implica dividir el conjunto de datos en k pliegues de tamaño igual. El modelo se entrena k veces, cada vez utilizando un pliegue como conjunto de validación y los demás pliegues como conjunto de entrenamiento. Entonces, para cada pliegue, obtendremos una precisión de validación cruzada.

Cuando ejecutamos las búsquedas en cuadrícula y aleatorias para encontrar los mejores hiperparámetros, elegiremos los hiperparámetros basados en la mejor puntuación promedio de validación cruzada.

 

¿Qué es la búsqueda en cuadrícula?

 

La búsqueda en cuadrícula es una técnica de ajuste de hiperparámetros que realiza una búsqueda exhaustiva en un espacio de hiperparámetros especificado para encontrar la combinación de hiperparámetros que produce el mejor rendimiento del modelo.

 

Cómo funciona la búsqueda en cuadrícula

 

Definimos el espacio de búsqueda de hiperparámetros como una cuadrícula de parámetros. La cuadrícula de parámetros es un diccionario donde especificamos cada hiperparámetro que queremos ajustar con una lista de valores para explorar.

La búsqueda en cuadrícula explora sistemáticamente todas las combinaciones posibles de hiperparámetros de la cuadrícula de parámetros. Ajusta y evalúa el modelo para cada combinación utilizando validación cruzada y selecciona la combinación que produce el mejor rendimiento.

A continuación, implementemos la búsqueda en cuadrícula en scikit-learn.

 

GridSearchCV en Scikit-Learn

 

Primero, importemos la clase GridSearchCV del módulo model_selection de scikit-learn:

from sklearn.model_selection import GridSearchCV

 

Definamos la cuadrícula de parámetros para el clasificador SVM:

# Definir la cuadrícula de hiperparámetrosparam_grid = {    'C': [0.1, 1, 10],    'kernel': ['lineal', 'rbf', 'poli'],    'gamma': [0.1, 1, 'scale', 'auto']}

 

La búsqueda en cuadrícula explora sistemáticamente todas las combinaciones posibles de hiperparámetros de la cuadrícula de parámetros. Para este ejemplo, evalúa el rendimiento del modelo con:

  • C establecido en 0.1, 1 y 10,
  • kernel establecido en ‘lineal’, ‘rbf’ y ‘poli’, y
  • gamma establecido en 0.1, 1, ‘scale’ y ‘auto’.

Esto resulta en un total de 3 * 3 * 4 = 36 combinaciones diferentes para evaluar. La búsqueda en cuadrícula ajusta y evalúa el modelo para cada combinación utilizando validación cruzada y selecciona la combinación que produce el mejor rendimiento.

Luego, instanciamos GridSearchCV para ajustar los hiperparámetros del baseline_svm:

# Crear el objeto GridSearchCVgrid_search = GridSearchCV(estimator=baseline_svm, param_grid=param_grid, cv=5)# Ajustar el modelo con la cuadrícula de hiperparámetrosgrid_search.fit(X_train, y_train)

 

Ten en cuenta que hemos utilizado validación cruzada de 5 pliegues.

Finalmente, evaluamos el rendimiento del mejor modelo, con los hiperparámetros óptimos encontrados por la búsqueda en cuadrícula, en los datos de prueba:

# Obtener los mejores hiperparámetros y el mejor modelobest_params = grid_search.best_params_best_model = grid_search.best_estimator_# Evaluar el mejor modeloy_pred_best = best_model.predict(X_test)accuracy_best = accuracy_score(y_test, y_pred_best)print(f"Mejor precisión de SVM: {accuracy_best:.2f}")print(f"Mejores hiperparámetros: {best_params}")

 

Como se puede observar, el modelo logra una puntuación de precisión de 0.94 para los siguientes hiperparámetros:

Resultado >>> Mejor precisión de SVM: 0.94Mejores hiperparámetros: {'C': 0.1, 'gamma': 0.1, 'kernel': 'poly'}

 

Pros y Contras de la Búsqueda en Rejilla

 

El uso de la búsqueda en rejilla para la afinación de hiperparámetros tiene las siguientes ventajas:

  • La búsqueda en rejilla explora todas las combinaciones especificadas, asegurando que no se pierdan los mejores hiperparámetros dentro del espacio de búsqueda definido.
  • Es una buena elección para explorar espacios de hiperparámetros más pequeños.

Pero, por otro lado:

  • La búsqueda en rejilla puede ser computacionalmente costosa, especialmente cuando se trata de un gran número de hiperparámetros y sus valores. Puede no ser factible para modelos muy complejos o búsquedas extensas de hiperparámetros.

Ahora vamos a aprender sobre la búsqueda aleatoria.

 

¿Qué es la Búsqueda Aleatoria?

 

La búsqueda aleatoria es otra técnica de afinación de hiperparámetros que explora combinaciones aleatorias de hiperparámetros dentro de distribuciones o rangos especificados. Es particularmente útil cuando se trata de un gran espacio de búsqueda de hiperparámetros.

 

Cómo Funciona la Búsqueda Aleatoria 

 

En la búsqueda aleatoria, en lugar de especificar una rejilla de valores, se pueden definir distribuciones de probabilidad o rangos para cada hiperparámetro. Esto se convierte en un espacio de búsqueda de hiperparámetros mucho más grande.

La búsqueda aleatoria luego selecciona aleatoriamente un número fijo de combinaciones de hiperparámetros de estas distribuciones. Esto permite a la búsqueda aleatoria explorar de manera eficiente un conjunto diverso de combinaciones de hiperparámetros.

 

RandomizedSearchCV en Scikit-Learn

 

Ahora vamos a ajustar los parámetros del clasificador SVM de referencia utilizando la búsqueda aleatoria.

Importamos la clase RandomizedSearchCV y definimos param_dist, un espacio de búsqueda de hiperparámetros mucho más grande:

from sklearn.model_selection import RandomizedSearchCVfrom scipy.stats import uniformparam_dist = {    'C': uniform(0.1, 10),  # Distribución uniforme entre 0.1 y 10    'kernel': ['linear', 'rbf', 'poly'],    'gamma': ['scale', 'auto'] + list(np.logspace(-3, 3, 50))}

 

Similar a la búsqueda en rejilla, creamos una instancia del modelo de búsqueda aleatoria para buscar los mejores hiperparámetros. Aquí, establecemos n_iter en 20; por lo tanto, se muestrearán 20 combinaciones de hiperparámetros aleatorias.

# Creamos el objeto RandomizedSearchCVrandomized_search = RandomizedSearchCV(estimator=baseline_svm, param_distributions=param_dist, n_iter=20, cv=5)randomized_search.fit(X_train, y_train)

 

Luego evaluamos el rendimiento del modelo con los mejores hiperparámetros encontrados mediante la búsqueda aleatoria:

# Obtenemos los mejores hiperparámetros y el mejor modelobest_params_rand = randomized_search.best_paramsbest_model_rand = randomized_search.best_estimator_# Evaluamos el mejor modeloy_pred_best_rand = best_model_rand.predict(X_test)accuracy_best_rand = accuracy_score(y_test, y_pred_best_rand)print(f"Mejor precisión de SVM: {accuracy_best_rand:.2f}")print(f"Mejores hiperparámetros: {best_params_rand}")

 

Los mejores hiperparámetros y su precisión óptima son:

Resultado >>> Mejor precisión de SVM: 0.94Mejores hiperparámetros: {'C': 9.66495227534876, 'gamma': 6.25055192527397, 'kernel': 'poly'}

 

Los parámetros encontrados mediante la búsqueda aleatoria son diferentes de los encontrados mediante la búsqueda en rejilla. El modelo con estos hiperparámetros también alcanza una puntuación de precisión de 0.94.

 

Pros y Contras de la Búsqueda Aleatoria

 

Resumamos las ventajas de la búsqueda aleatoria:

  • La búsqueda aleatorizada es eficiente cuando se trata de una gran cantidad de hiperparámetros o un amplio rango de valores, ya que no requiere una búsqueda exhaustiva.
  • Puede manejar varios tipos de parámetros, incluyendo valores continuos y discretos.

Aquí están algunas limitaciones de la búsqueda aleatorizada:

  • Debido a su naturaleza aleatoria, no siempre encontrará los mejores hiperparámetros. Pero a menudo encuentra buenos rápidamente.
  • A diferencia de la búsqueda en cuadrícula, no garantiza explorar todas las combinaciones posibles.

 

Conclusión

 

Aprendimos cómo realizar la sintonización de hiperparámetros con RandomizedSearchCV y GridSearchCV en scikit-learn. Luego evaluamos el rendimiento de nuestro modelo con los mejores hiperparámetros. 

En resumen, la búsqueda en cuadrícula busca exhaustivamente todas las combinaciones posibles en la cuadrícula de parámetros, mientras que la búsqueda aleatorizada muestrea aleatoriamente combinaciones de hiperparámetros.

Ambas técnicas ayudan a identificar los hiperparámetros óptimos para su modelo de aprendizaje automático, al tiempo que reducen el riesgo de sobreajuste a una división específica de entrenamiento y prueba.

[Bala Priya C](https://twitter.com/balawc27) es una desarrolladora y escritora técnica de India. Le gusta trabajar en la intersección de las matemáticas, la programación, la ciencia de datos y la creación de contenido. Sus áreas de interés y experiencia incluyen DevOps, ciencia de datos y procesamiento del lenguaje natural. Le gusta leer, escribir, programar y tomar café. Actualmente, está trabajando en aprender y compartir su conocimiento con la comunidad de desarrolladores, escribiendo tutoriales, guías prácticas, artículos de opinión y más.

We will continue to update Zepes; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

Inteligencia Artificial

Conoce ConceptGraphs Una representación gráfica estructurada de vocabulario abierto para escenas en 3D

La captura y codificación de información sobre una escena visual, típicamente en el contexto de la visión por computa...

Inteligencia Artificial

Utilizando cámaras en los autobuses de transporte público para monitorear el tráfico

Investigadores de la Universidad Estatal de Ohio monitorearon el tráfico utilizando cámaras ya instaladas en los auto...

Inteligencia Artificial

Este artículo de IA propone un método de generación de memoria recursivo para mejorar la consistencia conversacional a largo plazo en modelos de lenguaje grandes

Los chatbots y otras formas de sistemas de comunicación de dominio abierto han experimentado un aumento de interés e ...

Inteligencia Artificial

¿Cómo sabemos qué tan inteligentes son los sistemas de IA?

Una tradición en IA es someter a los sistemas a pruebas diseñadas para evaluar la inteligencia humana, pero hay varia...

Inteligencia Artificial

Ajuste fino de LLM con técnicas PEFT

Introducción Los modelos de lenguaje, o LLMs en inglés, han revolucionado el procesamiento de lenguaje natural. Son s...