• Saltar al contenido principal
  • Skip to secondary menu
  • Saltar a la barra lateral principal
  • Saltar al pie de página
  • Inicio
  • Secciones
    • Ciencia de datos
    • Criptografía
    • Herramientas
    • Machine Learning
    • Noticias
    • Opinión
    • Productividad
    • Programación
      • JavaScript
      • Julia
      • Matlab
      • Python
      • R
  • Programación
    • JavaScript
    • Julia
    • Matlab
    • Python
    • R
  • Noticias
  • Boletín
  • Contacto
  • Tienda
    • Libros
    • Equipamiento de oficina
    • Equipamiento en movilidad
    • Tiendas afiliadas
      • AliExpress
      • Amazon
      • Banggood
      • GeekBuying
      • Lenovo

Analytics Lane

Ciencia e ingeniería de datos aplicada

  • Ciencia de datos
  • Machine Learning
  • Python
  • Pandas
  • NumPy
  • Matlab
  • Julia
  • JavaScript
  • Excel

GridSearchCV

julio 2, 2018 Por Daniel Rodríguez 1 comentario
Tiempo de lectura: 6 minutos

Puntos

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.

Publicidad


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.linear_model import Lasso
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.

Publicidad


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.

Publicidad


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.

¿Te ha parecido de utilidad el contenido?

¡Puntúalo entre una y cinco estrellas!

Puntuación promedio 4.7 / 5. Votos emitidos: 3

Ya que has encontrado útil este contenido...

¡Síguenos en redes sociales!

¡Siento que este contenido no te haya sido útil!

¡Déjame mejorar este contenido!

Dime, ¿cómo puedo mejorar este contenido?

Publicaciones relacionadas

  • Entrenamiento, validación y test con Scikit-learn
    Entrenamiento, validación y test con Scikit-learn
  • Seleccionar las mejores características para un modelo con Scikit-learn
    Seleccionar las mejores características para un modelo con…
  • Interpretación de las predicciones de los árboles de regresión y Random Forest
    Interpretación de las predicciones de los árboles de…
  • Implementación del método descenso del gradiente en Python
    Implementación del método descenso del gradiente en Python
  • Fijar la semilla de números aleatorios en Python
    Fijar la semilla de números aleatorios en Python
  • Gráfico de Hexbin para el conjunto de 3000 datos
    Gráficos de Hexbin: alternativa a los gráficos de dispersión…

Publicado en: Python Etiquetado como: Scikit-Learn

Interacciones con los lectores

Comentarios

  1. Cristian dice

    octubre 16, 2019 a las 7:07 pm

    Muy didactico el artículo y bastante claro, se agrade compartir esta información

    Responder

Deja una respuesta Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

I accept the Terms and Conditions and the Privacy Policy

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Publicidad




Barra lateral principal

Suscríbete a nuestro boletín

Suscríbete al boletín semanal para estar al día de todas las publicaciones.

Política de Privacidad

Analytics Lane en redes sociales

  • Amazon
  • Facebook
  • GitHub
  • Instagram
  • Pinterest
  • RSS
  • Twitter
  • Tumblr
  • YouTube

Publicidad

Entradas recientes

El método de Hare-Niemeyer y su implementación en Python

septiembre 29, 2023 Por Daniel Rodríguez

Redimensionar una partición de disco LVM con espacio no asignado en Linux

septiembre 27, 2023 Por Daniel Rodríguez

¿Cómo saber la versión de Pandas o cualquier otra librería en Python?

septiembre 25, 2023 Por Daniel Rodríguez

Publicidad

Es tendencia

  • Unir y combinar dataframes con pandas en Python publicado el septiembre 10, 2018 | en Python
  • Duplicado Eliminar registros duplicados en pandas publicado el junio 20, 2018 | en Python
  • Enviar mensajes de WhatsApp con Python publicado el marzo 7, 2022 | en Python
  • Ecuaciones multilínea en Markdown publicado el septiembre 14, 2022 | en Herramientas
  • ¿Cómo eliminar columnas y filas en un dataframe pandas? publicado el marzo 25, 2019 | en Python

Publicidad

Lo mejor valorado

4.9 (22)

Seleccionar filas y columnas en Pandas con iloc y loc

4.7 (12)

Operaciones de filtrado de DataFrame con Pandas en base a los valores de las columnas

4.6 (15)

Archivos JSON con Python: lectura y escritura

4.5 (10)

Diferencias entre var y let en JavaScript

4.3 (12)

Ordenación de diccionarios en Python mediante clave o valor

Publicidad

Comentarios recientes

  • Daniel Rodríguez en ¿Cómo eliminar columnas y filas en un dataframe pandas?
  • Miguel en ¿Cómo eliminar columnas y filas en un dataframe pandas?
  • alberto en Resolver problema de credenciales en Bitbucket
  • Pablo en Aplicar el método D’Hondt en Excel
  • Agapito en Creación de un EXE desde un archivo Python en Windows

Publicidad

Footer

Analytics Lane

  • Acerca de Analytics Lane
  • Boletín de noticias
  • Contacto
  • Libros
  • Lo más popular
  • Noticias
  • Tienda
  • Tiendas afiliadas

Secciones

  • Ciencia de datos
  • Criptografía
  • Herramientas
  • Machine Learning
  • Opinión
  • Productividad
  • Programación
  • Reseñas

Sobre de Analytics Lane

En Analytics Lane tratamos de explicar los principales conceptos de la ciencia e ingeniería de datos con un enfoque práctico. Los principales temas tratados son ciencia de datos, ingeniería de datos, inteligencia artificial, machine learning, deep learning y criptografía. Además, también se habla de los principales lenguajes de programación y herramientas utilizadas por los científicos e ingenieros de datos.

Copyright © 2018-2023 Analytics Lane ·Términos y condiciones ·Política de Cookies ·Política de Privacidad ·Herramientas de privacidad ·Contacto