GridSearchCV es una clase disponible en scikit-learn que permite evaluar y seleccionar de forma sistemática los parámetros de un modelo. Indicándole un modelo y los parámetros a probar, puede evaluar el rendimiento del primero en función de los segundos mediante validación cruzada. En caso de que se desee evaluar modelos con parámetros aleatorios existe el método RandomizedSearchCV.
Introducción
Entrenar modelos de aprendizaje automático requiere dos tipos de parámetros: los que se aprenden de los datos y los del algoritmo. Los primeros pueden ser, por ejemplo, los parámetros de una regresión lineal. Los segundos son los parámetros de ajuste, también llamados hiperparámetros, como el parámetro de regularización una regresión LASSO.
Muchos de los modelos que se implementan en aprendizaje automático requieren que se fijen los valores de los hiperparámetros durante el entrenamiento. En la mayoría de las ocasiones, la selección de un valor u otro no es una tarea trivial. Pudiendo afectar de forma significativa a los resultados. Por ejemplo, en la regresión LASSO utilizar un valor u otro para alpha
afecta al número de características del modelo resultante. Para la selección de estos valores se puede utilizar algunas de las herramientas disponibles en scikit-learn, como GridSearchCV o RandomizedSearchCV. Ambas clases permiten seleccionar los parámetros más apropiado para un modelo y un conjunto de datos utilizando la técnica de validación cruzada.
Validación cruzada
La validación cruzada es una técnica con la que se puede identificar la existencia de diferentes problemas durante el entrenamiento de los modelos, como la aparición de sobreajuste. Permitiendo así obtener modelos más estables.
En la validación cruzada el conjunto de datos de entrenamiento se divide en grupos de igual tamaño. Una vez realizada la partición se procede a entrenar el modelo una vez por cada uno de los grupos. Utilizando todos los grupos menos el de la iteración para entrenar y este para validar los resultados. Una diferencia importante con la validación fuera de muestra es que en esta ocasión se entrena y valida con todos los datos, cambiando el conjunto de utilizado para la validación en cada iteración. Así es posible identificar si los modelos son inestables o estables, es decir, el resultado depende de los datos utilizados o no. En caso de que los resultados dependan de los datos utilizados, el modelo posiblemente estará siendo siendo sobreajustado. Indicando que el modelo empleado dispone de demasiados grados de libertad.
Este proceso se muestra de forma esquemática en la siguiente figura. En ella se han representado un conjunto de datos que se ha dividido en tres. Posteriormente se entrena tres modelos con los datos en azul y se valida con los datos en color verde.
Selección de parámetros con GridSearchCV
scikit-learn dispone de varias clases que implementan la metodología de la validación cruzada. En el caso de que se desee utilizar para seleccionar los parámetros de entrenamiento de un modelo una de las opciones es GridSearchCV. Siendo uno de los más simples y fáciles de utilizar. El constructor de esta clase se ha de llamar indicándole la instancia de un modelo, los valores a probar y el número de conjuntos en el que se dividen los datos. Esto se realiza mediante los siguientes parámetros:
-
estimator
: el modelo que se ha de evaluar -
param_grid
: un diccionario en que se indicar los parámetros a evaluar como clave y el conjunto elementos como valor -
cv
: el número de conjuntos en los que se divide los datos para la validación cruzada.
Aplicación a una regresión LASSO
Una de las aplicaciones de GridSearchCV es la obtención de los hiperparámetros de los modelos. Para ver cómo utilizar esta clase se puede utilizar una regresión LASSO en la que se ha de fijar un valor para alpha
. Para esto primero se ha de importar un conjunto de datos, como el del precio de las viviendas en Boston que se encuentra disponibles en los ejemplos de scikit-learn. Para esto se puede utilizar el siguiente código:
from sklearn.datasets import load_boston boston = load_boston() X = boston.data y = boston.target
Tras la importación de los datos se puede proceder a la creación de una instancia de la clase GridSearchCV que nos permita realizar la tarea. Para esto es necesario disponer primero de una instancia de la clase LASSO, los valores de alpha
que se desean evaluar y el número de grupos empleados en la validación cruzada. Los valores alpha
se han de inyectar en un diccionario donde la clave es el nombre de la propiedad y el valor es un vector con parámetros que se desean probar. Una vez creada la instancia de la clase simplemente se ha de ajustar con el método fit para obtener los resultados. El proceso completo se puede ver en el siguiente código
import numpy as np from sklearn.model_selection import GridSearchCV alphas = np.array([1, 0.5, 0.2, 0.1, 0.05, 0.02, 0.01]) model = Lasso() grid = GridSearchCV(estimator=model, param_grid=dict(alpha=alphas), cv=3) grid.fit(X, y)
Al finalizar la ejecución del código se puede obtener la información buscada. El parámetro del modelo se puede consultar mediante la propiedad de la clase best_params_
. En el ejemplo el valor devuelto es 0,2. Concluyendo que esta es la mejor opción entre los valores evaluados.
Identificación de múltiples parámetros con GridSearchCV
Además de los visto anteriormente, otra de las ventajas de GridSearchCV es la posibilidad de probar múltiples hiperparámetros de los modelos a la vez. En el ejemplo anterior se pude evaluar además si es mejor un modelo con termino independiente o sin él. Para eso solamente es necesario añadir al diccionario un segundo registro con las opciones que se desean probar. Realizando GridSearchCV la evaluación de todas las combinaciones posibles. Los pasos para realizar esto se puede ver en el siguiente código:
fit_intercept = [True, False] grid = GridSearchCV(estimator=model, param_grid=dict(alpha = alphas, fit_intercept=fit_intercept), cv=3) grid.fit(X, y)
Análogamente al caso anterior los resultados se pueden consultar en la propiedad best_params_
. En esta ocasión se obtiene que los parámetros del modelo que mejor funcionan son 0,05 para alpha
y False
para fit_intercept
.
Valores aleatorios con RandomizedSearchCV
Anteriormente, al utilizar GridSearchCV ha sido necesario indicar el vector con los valores a probar. Una alternativa es utilizar el constructor RandomizedSearchCV junto a una distribución que genere números aleatorios para seleccionar aleatoriamente el valor de los hiperparámetros. Esto es lo que se muestra en el siguiente código:
from scipy.stats import uniform from sklearn.model_selection import RandomizedSearchCV param_grid = dict(alpha = uniform()) grid = RandomizedSearchCV(estimator=model, param_distributions=dict(alpha = uniform()), n_iter=100, cv=3, random_state=0) grid.fit(X, y)
Este constructor requiere un nuevo parámetro ( n_iter
) con el que se indica el número de iteraciones. Por otro lado, para garantizar que los resultados sean repetibles se ha fijado la semilla de los números aleatorios mediante el parámetro random_state
. Una vez ejecutado el código se puede comprobar que el valor de alpha
que mejor funcionan es 0,1433532874090464, un valor que no se encontraba en la lista anterior.
Conclusiones
En esta entrada se ha visto cómo utilizar las clases GridSearchCV y RandomizedSearchCV para determinar los hiperparámetros de los modelos con scikit-learn. Utilizando en ambos casos la validación cruzada. Saber utilizar estas herramientas es clave para poder implementar los modelos de aprendizaje automático más adecuados en cada ocasión.
Queda pendiente para una futura entrada se hablará de las tuberías (pipes). Gracias a las cuales evaluar el efecto al mismo tiempo el efecto de los hiperparámetros utilizados en el preprocesador y entrenamiento de los modelos.