Python

Seleccionar automáticamente los modelos en Python con GridSearchCV

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)

¿Te ha parecido de utilidad el contenido?

Daniel Rodríguez

Share
Published by
Daniel Rodríguez

Recent Posts

De la Regresión Logística al Scorecard: La Transformación Matemática

En un entrada previa explicamos qué son el WOE y el IV y por qué…

23 horas ago

Analytics Lane lanza la versión 1.1 del laboratorio con nuevas suites de CLV y Scoring

Seguimos evolucionando el laboratorio de Analytics Lane y hoy lanzamos la versión 1.1, disponible en:…

2 días ago

Interés compuesto: la fuerza que multiplica tu dinero (y los errores que la anulan)

“El interés compuesto es la octava maravilla del mundo. El que lo entiende lo gana…

6 días ago

Cómo comparar datos con barras en Matplotlib: agrupadas, apiladas y porcentuales

Tienes los datos de ventas de tres productos en dos años distintos y quieres saber…

1 semana ago

Costes hundidos en ciencia de datos: cuándo mantener un modelo y cuándo migrar

Imagina la situación. Tu equipo lleva tres años con un modelo en producción. No es…

2 semanas ago

WOE e IV: La Base Matemática del Credit Scoring

Cuando un banco evalúa una solicitud de crédito necesita responder a una pregunta aparentemente simple:…

2 semanas ago

This website uses cookies.