Las clases GridSearchCV
y RandomizedSearchCV
de Scikit-learn pueden ser utilizadas para automatizar la selección de los parámetros de un modelo. Aplicando para ello la técnica de validación cruzada. Partiendo de un modelo y un conjunto de sus parámetros prueba múltiples combinaciones para identificar aquella que ofrece mayor rendimiento. Proceso que se ha visto en una entrada anterior dedicada a GridSearchCV
. En muchas situaciones puede ser necesario identificar también qué modelo funciona mejor. Lo que se puede conseguir utilizando la clase Pipeline
junto alguna de las anteriores. En esta entrada se va a explicar cómo seleccionar automáticamente los modelos en Python con GridSearchCV
y Pipeline
.
Utilización básica de GridSearchCV
GridSearchCV
permite seleccionar los valores de los hiperparametros para un modelo y conjunto de datos. Para ellos, se ha de crear un objeto GridSearchCV
donde el modelo es el primer parámetro y un diccionario de los parámetros es el segundo. Por ejemplo, en el siguiente trozo de código se muestra un ejemplo.
from sklearn.datasets import load_diabetes from sklearn.linear_model import Ridge from sklearn.model_selection import GridSearchCV dataset = load_diabetes() X = dataset.data y = dataset.target model = Ridge() params = {'alpha': [1, 0.1, 0.01, 0.001, 0.0001]} grid = GridSearchCV(model, params, cv=10, iid=False) grid.fit(X, y) grid.best_estimator_.get_params()
En este código inicialmente se importar el conjunto de datos de diabetes disponibles en Scikit-learn. La variable objetivo de este es una medida cuantitativa de la progresión de la enfermedad un año después del resto de registros. Por lo que se puede crear un modelo de regresión. En el ejemplo se utiliza un modelo Ridge en el que se prueban diferentes valores de alpha
que se evalúan con GridSearchCV
. Una vez entrenado el modelo se puede consultar con qué valor de alpha
se obtienen los mejores rendimientos. En este caso el valor es de 0,1.
Las posibilidades de esta clase y RandomizedSearchCV
se pueden ver en mayor profundidad en la entrada GridSearchCV
.
Evaluación de otro modelo
Una vez obtenido el resultado anterior se puede probar con otro modelo, por ejemplo, con ElasticNet
. Para lo que se puede emplear el siguiente código.
from sklearn.linear_model import ElasticNet model = ElasticNet() params = {'alpha': [1, 0.1, 0.01, 0.001, 0.0001], 'l1_ratio': [1, 0.1, 0.01, 0.001, 0.0001]} grid = GridSearchCV(model, params, cv=10, iid=False) grid.fit(X, y) grid.best_estimator_.get_params()
A diferencia del caso anterior se puede probar con diferentes valores para alpha
y l1_ratio
. Mediante el mismo proceso se pueden obtener los mejores hiperparametros para este modelo y conjunto de datos. En esta ocasión es son alpha
igual a 0,001 y l1_ratio
igual a 0,001.
Uso de Pipeline
para seleccionar automáticamente los modelos en Python
En las dos secciones anteriores se ha visto cómo seleccionar los parámetros de un modelo. Pero en muchas aplicaciones prácticas lo que se busca es seleccionar el modelo. Lo que se puede conseguir con el uso de la clase Pipeline
. La cual se ha utilizado en una entrada anterior para automatizar el procesado de datos.
El procedimiento es crear una tubería con un modelo. Posteriormente se pueden utilizar diferentes objetos con modelos como parámetros de la tubería. Al mismo tiempo que se pueden incluir los parámetros de los modelos. Esto es lo que se muestra en el siguiente código.
from sklearn.pipeline import Pipeline from sklearn.linear_model import Lasso pipe = Pipeline([('model', Ridge())]) params = [{'model': [Ridge()], 'model__alpha': [1, 0.1, 0.01, 0.001, 0.0001]}, {'model': [Lasso()], 'model__alpha': [1, 0.1, 0.01, 0.001, 0.0001]}, {'model': [ElasticNet()], 'model__alpha': [1, 0.1, 0.01, 0.001, 0.0001], 'model__l1_ratio': [1, 0.1, 0.01, 0.001, 0.0001]}] grid = GridSearchCV(pipe, params, cv=10, iid=False) grid.fit(X, y) grid.best_estimator_.get_params()['model']
En este ejemplo se han probado tres modelos diferentes en un único proceso: Ridge, Lasso y ElasticNet. Evaluando diferentes modelos en cada uno de ellos. Obteniéndose como resultado el modelo y parámetros que mejor funcionan para este conjunto de datos. En este caso, el modelo resultante ha sido ElasticNet
con alpha
igual a 0,001 y l1_ratio
igual a 0,001.
Conclusiones
En esta entrada se ha visto cómo utilizar GridSearchCV
y Pipeline
para seleccionar automáticamente los modelos en Python. La combinación de estas dos herramientas permite automatizar procesos tediosos como es el hecho de probar diferentes tipos de modelos y comparar. Poniendo de manifiesto la potencia que ofrecen la unión de ambas. Lo que ya se había visto en una entrada anterior en la que se automatiza el procesado de datos.
Imágenes: Pixabay (Pete Linforth)
Deja una respuesta