La optimización de hiperparámetros se refiere a la realización de una búsqueda con el fin de descubrir el conjunto de argumentos de configuración de un modelo específico que dan como resultado el mejor rendimiento del modelo en un conjunto de datos específico.
Hay muchas maneras de realizar la optimización de hiperparámetros, aunque los métodos modernos, como la optimización bayesiana, son rápidos y eficaces. En el sitio web Biblioteca de Scikit-Optimize es una biblioteca Python de código abierto que proporciona una implementación de la Optimización Bayesiana que puede utilizarse para afinar los hiperparámetros de los modelos de aprendizaje de máquinas de la biblioteca Python de scikit-Learn.
Puedes usar fácilmente la biblioteca de Scikit-Optimize para afinar los modelos en tu próximo proyecto de aprendizaje de máquinas.
En este tutorial, descubrirá cómo utilizar la biblioteca Scikit-Optimize para usar la Optimización Bayesiana para la sintonización de hiperparámetros.
Después de completar este tutorial, lo sabrás:
- Scikit-Optimize proporciona un conjunto de herramientas generales para la optimización bayesiana que puede utilizarse para la sintonización de hiperparámetros.
- Cómo usar manualmente la biblioteca Scikit-Optimize para afinar los hiperparámetros de un modelo de aprendizaje de máquina.
- Cómo usar la clase incorporada BayesSearchCV para realizar la sintonización del modelo de hiperparámetros.
Empecemos.
Resumen del Tutorial
Este tutorial está dividido en cuatro partes; son:
- Scikit-Optimize
- Conjunto de datos y modelo de aprendizaje automático
- Ajustar manualmente los hiperparámetros de los algoritmos
- Sintonizar automáticamente los hiperparámetros de los algoritmos
Scikit-Optimize
Scikit-Optimize, o skopt para abreviar, es una librería Python de código abierto para realizar tareas de optimización.
Ofrece algoritmos de optimización eficientes, como la optimización bayesiana, y puede utilizarse para encontrar el mínimo o el máximo de funciones de costo arbitrario.
La optimización bayesiana proporciona una técnica de principios basada en el Teorema de Bayes para dirigir la búsqueda de un problema de optimización global que sea eficiente y eficaz. Funciona construyendo un modelo probabilístico de la función objetiva, denominada función sustitutiva, que se busca luego de manera eficiente con una función de adquisición antes de elegir muestras candidatas para su evaluación en la función objetiva real.
Para más información sobre el tema de la Optimización Bayesiana, vea el tutorial:
Es importante destacar que la biblioteca proporciona apoyo para ajustar los hiperparámetros de los algoritmos de aprendizaje de máquinas que ofrece la biblioteca de aprendizaje de ciencias, la llamada optimización de hiperparámetros. Como tal, ofrece una alternativa eficiente a los procedimientos de optimización de hiperparámetros menos eficientes como la búsqueda en cuadrículas y la búsqueda aleatoria.
La biblioteca de optimización de la ciencia puede ser instalada usando pip, de la siguiente manera:
sudo pip instalar scikit-optimizar |
Una vez instalada, podemos importar la biblioteca e imprimir el número de versión para confirmar que la biblioteca se instaló con éxito y se puede acceder a ella.
El ejemplo completo figura a continuación.
# Reportar el número de versión de Scikit-optimizar importación skopt imprimir(«skopt %s % skopt.La versión…) |
Ejecutando el ejemplo se reporta el número de versión actualmente instalada de scikit-optimize.
Su número de versión debería ser el mismo o más alto.
Para más instrucciones de instalación, vea la documentación:
Ahora que estamos familiarizados con lo que es Scikit-Optimize y cómo instalarlo, exploremos cómo podemos usarlo para afinar los hiperparámetros de un modelo de aprendizaje de una máquina.
Conjunto de datos y modelo de aprendizaje automático
Primero, seleccionemos un conjunto de datos estándar y un modelo para abordarlo.
Usaremos el conjunto de datos de aprendizaje de la máquina de la ionosfera. Se trata de un conjunto de datos estándar de aprendizaje por máquina que comprende 351 filas de datos con tres variables de entrada numéricas y una variable objetivo con dos valores de clase, por ejemplo, la clasificación binaria.
Utilizando un arnés de prueba de validación cruzada estratificada 10 veces con tres repeticiones, un modelo ingenuo puede lograr una precisión de alrededor del 64 por ciento. Un modelo de alto rendimiento puede lograr una precisión en este mismo arnés de prueba de alrededor del 94 por ciento. Esto proporciona los límites del rendimiento esperado en este conjunto de datos.
El conjunto de datos implica la predicción de si las mediciones de la ionosfera indican una estructura específica o no.
Puedes aprender más sobre el conjunto de datos aquí:
No es necesario descargar el conjunto de datos; lo descargaremos automáticamente como parte de nuestros ejemplos de trabajo.
El siguiente ejemplo descarga el conjunto de datos y resume su forma.
# Resumir el conjunto de datos de la ionosfera de pandas importación lea_csv # Cargar conjunto de datos url = ‘https://raw.githubusercontent.com/jbrownlee/Datasets/master/ionosphere.csv’ dataframe = read_csv(url, encabezado=Ninguno) # Dividido en elementos de entrada y salida datos = dataframe.valores X, y = datos[[:, :–1], datos[[:, –1] imprimir(X.forma, y.forma) |
Ejecutando el ejemplo se descarga el conjunto de datos y se divide en elementos de entrada y salida. Como era de esperar, podemos ver que hay 351 filas de datos con 34 variables de entrada.
Podemos evaluar un modelo de máquina de vector de apoyo (SVM) en este conjunto de datos utilizando una validación cruzada estratificada repetida.
Podemos informar del rendimiento medio del modelo en el conjunto de datos promediado en todos los pliegues y repeticiones, lo que proporcionará una referencia para la sintonización del modelo de hiperparámetros realizada en secciones posteriores.
El ejemplo completo figura a continuación.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# Evaluar un SVM para el conjunto de datos de la ionosfera # de numpy importación significa de numpy importación std de pandas importación read_csv de sklearn.model_selection importación puntaje_valor_cruzado de sklearn.model_selection importación RepeatedStratifiedKFold de sklearn.svm importación SVC # Cargar conjunto de datos url = ‘https://raw.githubusercontent.com/jbrownlee/Datasets/master/ionosphere.csv’ dataframe = read_csv(url, encabezado=Ninguno) # Dividido en elementos de entrada y salida datos = dataframe.valores X, y = datos[[:, :–1], datos[[:, –1] imprimir(X.forma, y.forma) # Definir el modelo modelo = SVC() # Definir el arnés de prueba cv = RepeatedStratifiedKFold(n_splits=10, n_repeticiones=3, estado_aleatorio=1) # Evaluar el modelo m_scores = puntaje_valor_cruzado(modelo, X, y, puntuación=«exactitud, cv=cv, n_jobs=–1, error_score=«aumentar) imprimir(«Precisión: %.3f (%.3f) % (significa(m_scores), std(m_scores))) |
Ejecutando el ejemplo primero carga y prepara el conjunto de datos, luego evalúa el modelo SVM en el conjunto de datos.
Nota: Sus resultados pueden variar dada la naturaleza estocástica del algoritmo o el procedimiento de evaluación, o las diferencias en la precisión numérica. Considere ejecutar el ejemplo unas cuantas veces y compare el resultado promedio.
En este caso, podemos ver que el SVM con hiperparámetros por defecto alcanzó una precisión media de clasificación de alrededor del 83,7 por ciento, que es hábil y cercana al rendimiento máximo en el problema del 94 por ciento.
(351, 34) (351,) Precisión: 0,937 (0,038) |
A continuación, veamos si podemos mejorar el rendimiento afinando los hiperparámetros del modelo usando la biblioteca de Scikit-optimize.
Ajustar manualmente los hiperparámetros de los algoritmos
La biblioteca de Scikit-Optimize puede ser usada para afinar los hiperparámetros de un modelo de aprendizaje de una máquina.
Podemos lograrlo manualmente usando las capacidades de optimización bayesiana de la biblioteca.
Esto requiere que primero definamos un espacio de búsqueda. En este caso, estos serán los hiperparámetros del modelo que deseamos afinar, y el alcance o rango de cada hiperparámetro.
Afinaremos los siguientes hiperparámetros del modelo SVM:
- Cel parámetro de regularización.
- núcleoel tipo de núcleo utilizado en el modelo.
- gradoutilizado para el núcleo del polinomio.
- gammaque se usa en la mayoría de los otros núcleos.
Para los hiperparámetros numéricos C y gamma…definiremos una escala de registro para buscar entre un pequeño valor de 1e-6 y 100. Grado es un número entero y buscaremos valores entre 1 y 5. Finalmente, el núcleo es una variable categórica con valores nombrados específicos.
Podemos definir el espacio de búsqueda de estos cuatro hiperparámetros, una lista de tipos de datos de la biblioteca de skopt, de la siguiente manera:
... # Definir el espacio de los hiperparámetros a buscar search_space = lista() search_space.anexar(Real(1e–6, 100.0, «log-uniforme, nombre=‘C’)) search_space.anexar(Categórico([[«lineal, ‘poly’., «rbf, «sigmoidea], nombre=«Núcleo)) search_space.anexar(Integro(1, 5, nombre=«grado»…)) search_space.anexar(Real(1e–6, 100.0, «log-uniforme, nombre=«gamma)) |
Anote el tipo de datos, el rango y el nombre del hiperparámetro especificado para cada uno.
Podemos entonces definir una función que será llamada por el procedimiento de búsqueda. Esta es una función esperada por el procedimiento de optimización más adelante y toma un modelo y un conjunto de hiperparámetros específicos para el modelo, lo evalúa y devuelve una puntuación para el conjunto de hiperparámetros.
En nuestro caso, queremos evaluar el modelo usando la validación cruzada estratificada 10 veces repetida en nuestro conjunto de datos de la ionosfera. Queremos maximizar la precisión de la clasificación, por ejemplo, encontrar el conjunto de hiperparámetros del modelo que den la mejor precisión. Por defecto, el proceso minimiza la puntuación devuelta por esta función, por lo tanto, devolveremos uno menos la precisión, por ejemplo, la habilidad perfecta será (1 – precisión) o 0,0, y la peor habilidad será 1,0.
El evaluate_model() La función a continuación implementa esto y toma un conjunto específico de hiperparámetros.
# definir la función utilizada para evaluar una configuración dada @use_named_args(search_space) def evaluate_model(**params): # Configurar el modelo con hiperparámetros específicos modelo = SVC() modelo.set_params(**params) # Definir el arnés de prueba cv = RepeatedStratifiedKFold(n_splits=10, n_repeticiones=3, estado_aleatorio=1) # Calcular una validación cruzada quíntuple resultado = puntaje_valor_cruzado(modelo, X, y, cv=cv, n_jobs=–1, puntuación=«exactitud) # Calcular la media de las puntuaciones estimación = significa(resultado) # convertir de una puntuación máxima a una puntuación mínima volver 1.0 – estimación |
A continuación, podemos ejecutar la búsqueda llamando al gp_minimize() y pasando el nombre de la función a llamar para evaluar cada modelo y el espacio de búsqueda para optimizar.
... # realizar la optimización resultado = gp_minimize(evaluate_model, search_space) |
El procedimiento se llevará a cabo hasta que converja y devuelva un resultado.
El objeto resultante contiene muchos detalles, pero lo más importante es que podemos acceder a la puntuación de la configuración con mejor rendimiento y a los hiperparámetros utilizados por el mejor modelo de formación.
... # resumiendo el hallazgo: imprimir(‘Mejor Precisión: %.3f’ % (1.0 – resultado.diversión)) imprimir(«Mejores parámetros: %s % (resultado.x)) |
A continuación se muestra el ejemplo completo de la sintonización manual de los hiperparámetros de un SVM en el conjunto de datos de la ionosfera.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
# Sintoniza manualmente los hiperparámetros del modelo Svm usando el conjunto de datos de la ionosfera # de numpy importación significa de pandas importación read_csv de sklearn.model_selection importación puntaje_valor_cruzado de sklearn.model_selection importación RepeatedStratifiedKFold de sklearn.svm importación SVC de skopt.espacio importación Integro de skopt.espacio importación Real de skopt.espacio importación Categórico de skopt.utils importación use_named_args de skopt importación gp_minimizar # Definir el espacio de los hiperparámetros a buscar search_space = lista() search_space.anexar(Real(1e–6, 100.0, «log-uniforme, nombre=‘C’)) search_space.anexar(Categórico([[«lineal, ‘poly’., «rbf, «sigmoidea], nombre=«Núcleo)) search_space.anexar(Integro(1, 5, nombre=«grado»…)) search_space.anexar(Real(1e–6, 100.0, «log-uniforme, nombre=«gamma)) # definir la función utilizada para evaluar una configuración dada @use_named_args(search_space) def evaluate_model(**params): # Configurar el modelo con hiperparámetros específicos modelo = SVC() modelo.set_params(**params) # Definir el arnés de prueba cv = RepeatedStratifiedKFold(n_splits=10, n_repeticiones=3, estado_aleatorio=1) # Calcular una validación cruzada quíntuple resultado = puntaje_valor_cruzado(modelo, X, y, cv=cv, n_jobs=–1, puntuación=«exactitud) # Calcular la media de las puntuaciones estimación = significa(resultado) # convertir de una puntuación máxima a una puntuación mínima volver 1.0 – estimación # Cargar conjunto de datos url = ‘https://raw.githubusercontent.com/jbrownlee/Datasets/master/ionosphere.csv’ dataframe = read_csv(url, encabezado=Ninguno) # Dividido en elementos de entrada y salida datos = dataframe.valores X, y = datos[[:, :–1], datos[[:, –1] imprimir(X.forma, y.forma) # realizar la optimización resultado = gp_minimize(evaluate_model, search_space) # resumiendo el hallazgo: imprimir(‘Mejor Precisión: %.3f’ % (1.0 – resultado.diversión)) imprimir(«Mejores parámetros: %s % (resultado.x)) |
Ejecutar el ejemplo puede llevar unos momentos, dependiendo de la velocidad de su máquina.
Puede que vea algunos mensajes de advertencia que puede ignorar con seguridad, como:
UserWarning: El objetivo ha sido evaluado en este punto antes. |
Al final de la ejecución, se informa de la configuración de mejor rendimiento.
Nota: Sus resultados pueden variar dada la naturaleza estocástica del algoritmo o el procedimiento de evaluación, o las diferencias en la precisión numérica. Considere ejecutar el ejemplo unas cuantas veces y compare el resultado promedio.
En este caso, podemos ver que la configuración, reportada en orden de la lista de espacio de búsqueda, fue una modesta C valor, un RBF núcleo, a grado de 2 (ignorado por el núcleo RBF), y un modesto gamma valor.
Lo importante es que podemos ver que la habilidad de este modelo era aproximadamente 94,7 por ciento, que es un modelo de alto rendimiento
(351, 34) (351,) Mejor precisión: 0,948 Los mejores parámetros: [1.2852670137769258, ‘rbf’, 2, 0.18178016885627174] |
Esta no es la única manera de usar la biblioteca de Scikit-Optimize para la sintonía de hiperparámetros. En la siguiente sección, podemos ver un enfoque más automatizado.
Sintonizar automáticamente los hiperparámetros de los algoritmos
La biblioteca de aprendizaje de máquinas Scikit-Learn proporciona herramientas para afinar los hiperparámetros del modelo.
Específicamente, proporciona las clases GridSearchCV y RandomizedSearchCV que toman un modelo, un espacio de búsqueda y una configuración de validación cruzada.
El beneficio de estas clases es que el procedimiento de búsqueda se realiza automáticamente, requiriendo una configuración mínima.
De manera similar, la biblioteca Scikit-Optimize proporciona una interfaz similar para realizar una optimización bayesiana de los hiperparámetros del modelo a través de la clase BayesSearchCV.
Esta clase puede ser usada de la misma manera que los equivalentes de Scikit-Learn.
En primer lugar, el espacio de búsqueda debe definirse como un diccionario con los nombres de los hiperparámetros utilizados como clave y el alcance de la variable como valor.
... # Definir el espacio de búsqueda params = dict() params[[‘C’] = (1e–6, 100.0, «log-uniforme) params[[«gamma] = (1e–6, 100.0, «log-uniforme) params[[«grado»…] = (1,5) params[[«Núcleo] = [[«lineal, ‘poly’., «rbf, «sigmoidea] |
Podemos entonces definir el BayesSearchCV configuración tomando el modelo que deseamos evaluar, el espacio de búsqueda de hiperparámetros y la configuración de validación cruzada.
... # Definir la evaluación cv = RepeatedStratifiedKFold(n_splits=10, n_repeticiones=3, estado_aleatorio=1) # Definir la búsqueda busca en = BayesSearchCV(estimador=SVC(), search_spaces=params, n_jobs=–1, cv=cv) |
Podemos entonces ejecutar la búsqueda y reportar el mejor resultado y configuración al final.
... # realizar la búsqueda busca en.encajar(X, y) # Reportar el mejor resultado imprimir(busca en.mejor_puntuación_) imprimir(busca en.best_params_) |
Enlazando esto, el ejemplo completo de sintonización automática de hiperparámetros SVM usando la clase BayesSearchCV en el conjunto de datos de la ionosfera se enumera a continuación.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# Sintonización automática de hiperparámetros del Svm usando el Skopt para el conjunto de datos de la ionosfera # de pandas importación read_csv de sklearn.model_selection importación puntaje_valor_cruzado de sklearn.svm importación SVC de sklearn.model_selection importación RepeatedStratifiedKFold de skopt importación BayesSearchCV # Cargar conjunto de datos url = ‘https://raw.githubusercontent.com/jbrownlee/Datasets/master/ionosphere.csv’ dataframe = read_csv(url, encabezado=Ninguno) # Dividido en elementos de entrada y salida datos = dataframe.valores X, y = datos[[:, :–1], datos[[:, –1] imprimir(X.forma, y.forma) # Definir el espacio de búsqueda params = dict() params[[‘C’] = (1e–6, 100.0, «log-uniforme) params[[«gamma] = (1e–6, 100.0, «log-uniforme) params[[«grado»…] = (1,5) params[[«Núcleo] = [[«lineal, ‘poly’., «rbf, «sigmoidea] # Definir la evaluación cv = RepeatedStratifiedKFold(n_splits=10, n_repeticiones=3, estado_aleatorio=1) # Definir la búsqueda busca en = BayesSearchCV(estimador=SVC(), search_spaces=params, n_jobs=–1, cv=cv) # realizar la búsqueda busca en.encajar(X, y) # Reportar el mejor resultado imprimir(busca en.mejor_puntuación_) imprimir(busca en.best_params_) |
Ejecutar el ejemplo puede llevar unos momentos, dependiendo de la velocidad de su máquina.
Puede que vea algunos mensajes de advertencia que puede ignorar con seguridad, como:
UserWarning: El objetivo ha sido evaluado en este punto antes. |
Al final de la ejecución, se informa de la configuración de mejor rendimiento.
Nota: Sus resultados pueden variar dada la naturaleza estocástica del algoritmo o el procedimiento de evaluación, o las diferencias en la precisión numérica. Considere ejecutar el ejemplo unas cuantas veces y compare el resultado promedio.
En este caso, podemos ver que el modelo se desempeñó por encima de los modelos de mayor rendimiento logrando una precisión de clasificación media de alrededor del 95,2 por ciento.
La búsqueda descubrió una gran C valor, un RBF núcleoy un pequeño gamma valor.
(351, 34) (351,) 0.9525166191832859 OrdenarDict([(‘C’, 4.8722263953328735), (‘degree’, 4), (‘gamma’, 0.09805881007239009), (‘kernel’, ‘rbf’)]) |
Esto proporciona una plantilla que puede utilizar para ajustar los hiperparámetros en su proyecto de aprendizaje de la máquina.
Más lecturas
Esta sección proporciona más recursos sobre el tema si desea profundizar en él.
Tutoriales relacionados
APIs
Resumen
En este tutorial, usted descubrió cómo utilizar la biblioteca Scikit-Optimize para usar la Optimización Bayesiana para la sintonización de hiperparámetros.
Específicamente, aprendiste:
- Scikit-Optimize proporciona un conjunto de herramientas generales para la optimización bayesiana que puede utilizarse para la sintonización de hiperparámetros.
- Cómo usar manualmente la biblioteca Scikit-Optimize para afinar los hiperparámetros de un modelo de aprendizaje de máquina.
- Cómo usar la clase incorporada BayesSearchCV para realizar la sintonización del modelo de hiperparámetros.
¿Tiene alguna pregunta?
Haga sus preguntas en los comentarios de abajo y haré lo posible por responder.