Skip to content
Tutoriales
Data-Science
Randomized Search Verbose: Mastering Hyperparameter Tuning in Scikit-learn

Randomized Search Verbose: Dominando la Sintonización de Hiperparámetros en scikit-learn

La sintonización de hiperparámetros es un aspecto crucial del aprendizaje automático que puede influir significativamente en el rendimiento de un modelo. El proceso implica ajustar los parámetros de un modelo para optimizar sus predicciones. Un método popular para la sintonización de hiperparámetros es la búsqueda aleatoria, especialmente en la biblioteca scikit-learn. En este artículo, profundizaremos en el concepto de búsqueda aleatoria, cómo hacerla detallada en scikit-learn y la diferencia entre la búsqueda aleatoria y la búsqueda en cuadrícula. También exploraremos algunas mejores prácticas para la sintonización de hiperparámetros utilizando la búsqueda aleatoria y cómo interpretar su salida.

La búsqueda aleatoria en scikit-learn es una herramienta poderosa para la sintonización de hiperparámetros. A diferencia de la búsqueda en cuadrícula, que prueba exhaustivamente todas las combinaciones posibles de parámetros, la búsqueda aleatoria selecciona combinaciones aleatorias de parámetros para probar, lo que puede ser más eficiente. Este método puede ser particularmente útil cuando se trata de un gran número de parámetros, ya que te permite controlar la cantidad de configuraciones de parámetros que se prueban.

¿Qué es la Búsqueda Aleatoria en scikit-learn?

La búsqueda aleatoria en scikit-learn se implementa a través de la clase RandomizedSearchCV. Esta clase realiza una búsqueda sobre valores de parámetros especificados para un estimador, pero en lugar de probar cada combinación posible de parámetros (como GridSearchCV), muestrea un número determinado de candidatos de un espacio de parámetros con una distribución especificada. Este enfoque puede ser más eficiente que una búsqueda en cuadrícula para la optimización de hiperparámetros, especialmente cuando se trata de un gran número de parámetros o cuando el tiempo requerido para entrenar un modelo es alto.

Aquí tienes un ejemplo sencillo de cómo usar RandomizedSearchCV:

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import randint as sp_randint
 
## inicializa el clasificador
clf = RandomForestClassifier(n_jobs=-1)
 
## especifica los parámetros y las distribuciones para muestrear
param_dist = {"max_depth": [3, None],
              "max_features": sp_randint(1, 11),
              "min_samples_split": sp_randint(2, 11),
              "bootstrap": [True, False],
              "criterion": ["gini", "entropy"]}
 
## ejecuta la búsqueda aleatoria
n_iter_search = 20
random_search = RandomizedSearchCV(clf, param_distributions=param_dist,
                                   n_iter=n_iter_search, cv=5)
 
random_search.fit(X, y)

En este ejemplo, RandomizedSearchCV muestreará 20 candidatos del espacio de parámetros y realizará una validación cruzada de 5 pliegues para cada uno.

Haciendo la Búsqueda Aleatoria Detallada

La verbosidad de la búsqueda aleatoria en scikit-learn se puede controlar utilizando el parámetro verbose. Cuanto mayor sea el valor, más mensajes se imprimirán durante el proceso de ajuste. Por ejemplo, configurar verbose=10 imprimirá la mayor cantidad de mensajes, brindando información detallada sobre el proceso de ajuste. Esto puede ser particularmente útil al ejecutar trabajos grandes, ya que te permite supervisar el progreso de la operación.

Aquí te mostramos cómo hacer que la búsqueda aleatoria sea detallada:

random_search = RandomizedSearchCV(clf, param_distributions=param_dist,
                                   n_iter=n_iter_search, cv=5, verbose=10)

Con verbose=10, scikit-learn imprimirá mensajes para cada tarea que se inicia y se completa, como

Búsqueda Aleatoria vs Búsqueda en Cuadrícula en scikit-learn

Tanto la búsqueda aleatoria como la búsqueda en cuadrícula son métodos utilizados para la optimización de hiperparámetros en scikit-learn. Si bien exploran el mismo espacio de parámetros, la forma en que operan es fundamentalmente diferente.

La búsqueda en cuadrícula, implementada en scikit-learn como GridSearchCV, prueba exhaustivamente todas las combinaciones posibles de parámetros. Esto significa que si tienes una lista de 10 valores para un parámetro y 10 valores para otro, la búsqueda en cuadrícula probará las 100 combinaciones. Esto puede ser computacionalmente costoso y llevar mucho tiempo, especialmente cuando se trata de un gran número de parámetros o cuando el modelo tarda mucho en entrenar. Por otro lado, la búsqueda aleatorizada, implementada como RandomizedSearchCV, selecciona aleatoriamente un número dado de candidatos del espacio de parámetros. Esto significa que puedes controlar el número de configuraciones de parámetros que se prueban, lo que puede ser mucho más eficiente que probar todas las combinaciones, especialmente cuando se trata de un gran número de parámetros.

Los resultados en la configuración de parámetros entre la búsqueda aleatorizada y la búsqueda en cuadrícula son bastante similares, pero el tiempo de ejecución para la búsqueda aleatorizada es drásticamente menor. Esto hace que la búsqueda aleatorizada sea la elección preferida cuando se trata de un gran número de parámetros y cuando los recursos computacionales son limitados.

Aquí hay un ejemplo de cómo usar GridSearchCV para hacer una comparación:

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
 
## inicializar el clasificador
clf = RandomForestClassifier(n_jobs=-1)
 
## especificar los parámetros y distribuciones para muestrear
param_grid = {"max_depth": [3, None],
              "max_features": [1, 3, 10],
              "min_samples_split": [2, 3, 10],
              "bootstrap": [True, False],
              "criterion": ["gini", "entropy"]}
 
## ejecutar la búsqueda en cuadrícula
grid_search = GridSearchCV(clf, param_grid=param_grid, cv=5)
 
grid_search.fit(X, y)

En este ejemplo, GridSearchCV probará todas las combinaciones de parámetros y realizará una validación cruzada de 5 pliegues en cada una.

Si bien ambos métodos tienen sus ventajas, la elección entre la búsqueda aleatorizada y la búsqueda en cuadrícula dependerá de tus necesidades y recursos específicos. Si tienes muchos recursos computacionales y tiempo, y quieres asegurarte de encontrar los parámetros óptimos, es posible que la búsqueda en cuadrícula sea la opción correcta. Sin embargo, si quieres ahorrar tiempo y recursos, y estás conforme con encontrar un conjunto de parámetros que sea lo suficientemente bueno, entonces la búsqueda aleatorizada podría ser una mejor opción.

Mejores prácticas para la sintonización de hiperparámetros utilizando la búsqueda aleatorizada

Cuando utilices la búsqueda aleatorizada para la sintonización de hiperparámetros, hay varias mejores prácticas que pueden ayudarte a aprovechar al máximo este método.

En primer lugar, es importante tener un buen entendimiento de los hiperparámetros del modelo con el que estás trabajando y el rango de valores que pueden tomar. Esto te permitirá definir un espacio de parámetros significativo para que la búsqueda aleatorizada pueda muestrear.

En segundo lugar, considera utilizar una validación cruzada en k pliegues estratificada en lugar de una simple división de entrenamiento-prueba. Esto asegura que cada pliegue de los datos tenga la misma proporción de muestras de cada clase, lo que puede conducir a resultados más confiables, especialmente cuando se trabaja con conjuntos de datos desequilibrados.

En tercer lugar, recuerda establecer un estado aleatorio para la búsqueda aleatorizada para asegurarte de que tus resultados sean reproducibles. Esto puede ser especialmente útil cuando quieras comparar el rendimiento de diferentes modelos o diferentes conjuntos de hiperparámetros.

Por último, no olvides usar el parámetro verbose para monitorear el progreso de la búsqueda. Esto puede ser especialmente útil cuando se ejecutan tareas grandes, ya que te permite realizar un seguimiento de la operación y diagnosticar posibles problemas.

Interpretación de la salida de la búsqueda aleatorizada en Scikit-learn

La salida de una búsqueda aleatorizada en scikit-learn es un objeto RandomizedSearchCV ajustado. Este objeto contiene información sobre los mejores parámetros encontrados durante la búsqueda, los resultados de la validación cruzada para cada combinación de parámetros y el modelo ajustado con los mejores parámetros.

Puedes acceder a los mejores parámetros utilizando el atributo best_params_, de la siguiente manera:

best_params = random_search.best_params_

Esto devolverá un diccionario con los nombres de los parámetros como claves y los mejores valores como valores.

Los resultados de la validación cruzada se pueden acceder utilizando el atributo cv_results_. Esto devuelve un diccionario con varias claves relacionadas con el proceso de validación cruzada, como la media y la desviación estándar de la puntuación de prueba para cada combinación de parámetros.

El modelo ajustado con los mejores parámetros se puede acceder utilizando el atributo best_estimator_. Puedes usar este modelo para hacer predicciones sobre nuevos datos.

Preguntas frecuentes

¿Cuál es la diferencia entre la búsqueda aleatorizada y la búsqueda en cuadrícula en Scikit-learn?

La búsqueda aleatorizada y la búsqueda en cuadrícula son ambos métodos de optimización de hiperparámetros en scikit-learn. La principal diferencia entre ellos es que la búsqueda en cuadrícula prueba exhaustivamente todas las posibles combinaciones de parámetros, mientras que la búsqueda aleatorizada muestrea aleatoriamente un número dado de candidatos del espacio de parámetros. Esto hace que la búsqueda aleatorizada sea más eficiente que la búsqueda en cuadrícula cuando se trata de un gran número de parámetros o cuando el modelo tarda mucho tiempo en entrenar.

¿Cómo puedo hacer que la búsqueda aleatorizada sea verbosa en Scikit-learn?

La verbosidad de la búsqueda aleatorizada en scikit-learn se puede controlar mediante el parámetro verbose. Cuanto mayor sea el valor, más mensajes se imprimirán durante el proceso de ajuste. Por ejemplo, establecer verbose=10 imprimirá la máxima cantidad de mensajes, proporcionando información detallada sobre el proceso de ajuste.

¿Cuáles son algunas mejores prácticas para la sintonización de hiperparámetros utilizando la búsqueda aleatorizada?

Algunas mejores prácticas para la sintonización de hiperparámetros utilizando la búsqueda aleatorizada incluyen tener un buen entendimiento de los hiperparámetros y su rango de valores, utilizar validación cruzada en k pliegues estratificada, establecer un estado aleatorio para la reproducibilidad y hacer uso del parámetro verbose para monitorear el progreso de la búsqueda.