Saltar al contenido

Cómo optimizar manualmente los hiperparámetros del modelo de aprendizaje automático

24 de marzo de 2021

Los algoritmos de aprendizaje automático tienen hiperparámetros que permiten que los algoritmos se adapten a conjuntos de datos específicos.

Aunque el impacto de los hiperparámetros puede entenderse en general, es posible que no se conozca su efecto específico en un conjunto de datos y sus interacciones durante el aprendizaje. Por lo tanto, es importante ajustar los valores de los hiperparámetros del algoritmo como parte de un proyecto de aprendizaje automático.

Es común utilizar algoritmos de optimización ingenuos para ajustar hiperparámetros, como una búsqueda en cuadrícula y una búsqueda aleatoria. Un enfoque alternativo es utilizar un algoritmo de optimización estocástico, como un algoritmo estocástico de escalada de colinas.

En este tutorial, descubrirá cómo optimizar manualmente los hiperparámetros de los algoritmos de aprendizaje automático.

Después de completar este tutorial, sabrá:

  • Se pueden usar algoritmos de optimización estocástica en lugar de la cuadrícula y la búsqueda aleatoria para la optimización de hiperparámetros.
  • Cómo utilizar un algoritmo estocástico de escalada de colinas para ajustar los hiperparámetros del algoritmo Perceptron.
  • Cómo optimizar manualmente los hiperparámetros del algoritmo de aumento de gradiente XGBoost.

Empecemos.

Cómo optimizar manualmente los hiperparámetros del modelo de aprendizaje automático

Cómo optimizar manualmente los hiperparámetros del modelo de aprendizaje automático
Foto de john farrell macdonald, algunos derechos reservados.

Descripción general del tutorial

Este tutorial se divide en tres partes; son:

  1. Optimización manual de hiperparámetros
  2. Optimización de hiperparámetros de Perceptron
  3. Optimización del hiperparámetro XGBoost

Optimización manual de hiperparámetros

Los modelos de aprendizaje automático tienen hiperparámetros que debe establecer para personalizar el modelo para su conjunto de datos.

A menudo, se conocen los efectos generales de los hiperparámetros en un modelo, pero la mejor forma de establecer un hiperparámetro y combinaciones de hiperparámetros que interactúan para un conjunto de datos dado es un desafío.

Un mejor enfoque es buscar objetivamente diferentes valores para los hiperparámetros del modelo y elegir un subconjunto que dé como resultado un modelo que logre el mejor rendimiento en un conjunto de datos determinado. Esto se denomina optimización de hiperparámetros o ajuste de hiperparámetros.

Se puede utilizar una variedad de algoritmos de optimización diferentes, aunque dos de los métodos más simples y comunes son la búsqueda aleatoria y la búsqueda en cuadrícula.

  • Búsqueda aleatoria. Defina un espacio de búsqueda como un dominio limitado de valores de hiperparámetros y puntos de muestreo aleatorios en ese dominio.
  • Búsqueda de cuadrícula. Defina un espacio de búsqueda como una cuadrícula de valores de hiperparámetros y evalúe cada posición en la cuadrícula.

La búsqueda en cuadrícula es ideal para combinaciones de verificación puntual que se sabe que funcionan bien en general. La búsqueda aleatoria es excelente para descubrir y obtener combinaciones de hiperparámetros que no habría adivinado intuitivamente, aunque a menudo requiere más tiempo para ejecutarse.

Para obtener más información sobre la cuadrícula y la búsqueda aleatoria para el ajuste de hiperparámetros, consulte el tutorial:

La búsqueda en cuadrícula y aleatoria son algoritmos de optimización primitivos, y es posible utilizar cualquier optimización que nos guste para ajustar el rendimiento de un algoritmo de aprendizaje automático. Por ejemplo, es posible utilizar algoritmos de optimización estocástica. Esto puede ser deseable cuando se requiere un rendimiento bueno o excelente y hay suficientes recursos disponibles para ajustar el modelo.

A continuación, veamos cómo podríamos usar un algoritmo estocástico de escalada de colinas para ajustar el rendimiento del algoritmo Perceptron.

Optimización de hiperparámetros de Perceptron

El algoritmo Perceptron es el tipo más simple de red neuronal artificial.

Es un modelo de una sola neurona que se puede utilizar para problemas de clasificación de dos clases y proporciona la base para el desarrollo posterior de redes mucho más grandes.

En esta sección, exploraremos cómo optimizar manualmente los hiperparámetros del modelo Perceptron.

Primero, definamos un problema de clasificación binaria sintética que podamos usar como foco de optimización del modelo.

Podemos usar la función make_classification () para definir un problema de clasificación binaria con 1,000 filas y cinco variables de entrada.

El siguiente ejemplo crea el conjunto de datos y resume la forma de los datos.

La ejecución del ejemplo imprime la forma del conjunto de datos creado, lo que confirma nuestras expectativas.

Scikit-learn proporciona una implementación del modelo Perceptron a través de la clase Perceptron.

Antes de ajustar los hiperparámetros del modelo, podemos establecer una línea de base en el rendimiento utilizando los hiperparámetros predeterminados.

Evaluaremos el modelo utilizando buenas prácticas de validación cruzada k-fold estratificada repetida a través de la clase RepeatedStratifiedKFold.

El ejemplo completo de evaluación del modelo Perceptron con hiperparámetros predeterminados en nuestro conjunto de datos de clasificación binaria sintética se enumera a continuación.

La ejecución de los informes de ejemplo evalúa el modelo e informa la desviación estándar y media de la precisión de la clasificación.

Nota: Sus resultados pueden variar dada la naturaleza estocástica del algoritmo o procedimiento de evaluación, o las diferencias en la precisión numérica. Considere ejecutar el ejemplo varias veces y compare el resultado promedio.

En este caso, podemos ver que el modelo con hiperparámetros predeterminados logró una precisión de clasificación de alrededor del 78,5 por ciento.

Esperamos poder lograr un mejor rendimiento que este con hiperparámetros optimizados.

A continuación, podemos optimizar los hiperparámetros del modelo Perceptron utilizando un algoritmo estocástico de escalada de colinas.

Hay muchos hiperparámetros que podríamos optimizar, aunque nos centraremos en dos que quizás tengan el mayor impacto en el comportamiento de aprendizaje del modelo; son:

  • Tasa de aprendizaje (eta0).
  • Regularización (alfa).

La tasa de aprendizaje controla la cantidad de actualización del modelo en función de los errores de predicción y controla la velocidad de aprendizaje. El valor predeterminado de eta es 1.0. los valores razonables son mayores que cero (por ejemplo, mayores que 1e-8 o 1e-10) y probablemente menores que 1.0

Por defecto, el Perceptron no usa ninguna regularización, pero habilitaremos «red elástica”Regularización que aplica tanto la regularización L1 como la L2 durante el aprendizaje. Esto alentará al modelo a buscar pesos de modelo pequeños y, a su vez, a menudo un mejor rendimiento.

Afinaremos el «alfa«Hiperparámetro que controla la ponderación de la regularización, p. Ej. la cantidad que impacta el aprendizaje. Si se establece en 0.0, es como si no se estuviera usando ninguna regularización. Los valores razonables están entre 0.0 y 1.0.

Primero, necesitamos definir la función objetivo para el algoritmo de optimización. Evaluaremos una configuración utilizando la precisión de clasificación media con validación cruzada estratificada repetida de k-veces. Buscaremos maximizar la precisión en las configuraciones.

los objetivo() La función a continuación implementa esto, tomando el conjunto de datos y una lista de valores de configuración. Los valores de configuración (tasa de aprendizaje y ponderación de regularización) se descomprimen, se utilizan para configurar el modelo, que luego se evalúa y se devuelve la precisión media.

A continuación, necesitamos una función para dar un paso en el espacio de búsqueda.

El espacio de búsqueda está definido por dos variables (eta y alfa). Un paso en el espacio de búsqueda debe tener alguna relación con los valores anteriores y debe estar vinculado a valores sensibles (por ejemplo, entre 0 y 1).

Usaremos un «Numero de pie”Hiperparámetro que controla qué tan lejos se permite que el algoritmo se mueva de la configuración existente. Se elegirá una nueva configuración probabilísticamente utilizando una distribución gaussiana con el valor actual como la media de la distribución y el tamaño del paso como la desviación estándar de la distribución.

Podemos usar la función randn () NumPy para generar números aleatorios con una distribución gaussiana.

los paso() La función siguiente implementa esto y dará un paso en el espacio de búsqueda y generará una nueva configuración utilizando una configuración existente.

A continuación, necesitamos implementar el algoritmo estocástico de escalada de colinas que llamará a nuestro objetivo() función para evaluar las soluciones candidatas y nuestra paso() función para dar un paso en el espacio de búsqueda.

La búsqueda genera primero una solución inicial aleatoria, en este caso con valores eta y alfa en el rango 0 y 1. La solución inicial se evalúa y se toma como la mejor solución de trabajo actual.

A continuación, el algoritmo itera para un número fijo de iteraciones proporcionado como un hiperparámetro para la búsqueda. Cada iteración implica dar un paso y evaluar la nueva solución candidata.

Si la nueva solución es mejor que la solución de trabajo actual, se toma como la nueva solución de trabajo actual.

Al final de la búsqueda, se devuelve la mejor solución y su rendimiento.

Uniendo esto, el Montañismo() La función siguiente implementa el algoritmo estocástico de escalada de colinas para ajustar el algoritmo Perceptron, tomando el conjunto de datos, la función objetivo, el número de iteraciones y el tamaño del paso como argumentos.

Luego podemos llamar al algoritmo e informar los resultados de la búsqueda.

En este caso, ejecutaremos el algoritmo durante 100 iteraciones y usaremos un tamaño de paso de 0.1, elegido después de un poco de prueba y error.

Al unir esto, el ejemplo completo de sintonización manual del algoritmo Perceptron se enumera a continuación.

Recomendado:  Conjuntos de aumento de gradiente basados ​​en histogramas en Python

La ejecución del ejemplo informa la configuración y el resultado cada vez que se observa una mejora durante la búsqueda. Al final de la ejecución, se informa la mejor configuración y resultado.

Nota: Sus resultados pueden variar dada la naturaleza estocástica del algoritmo o procedimiento de evaluación, o las diferencias en la precisión numérica. Considere ejecutar el ejemplo varias veces y compare el resultado promedio.

En este caso, podemos ver que el mejor resultado implicó usar una tasa de aprendizaje ligeramente superior a 1 en 1.004 y un peso de regularización de aproximadamente 0.002 logrando una precisión media de aproximadamente 79.1 por ciento, mejor que la configuración predeterminada que logró una precisión de aproximadamente 78.5 por ciento. .

¿Puede obtener un mejor resultado?
Déjame saber abajo en los comentarios.

Ahora que estamos familiarizados con cómo utilizar un algoritmo de escalada estocástico para ajustar los hiperparámetros de un algoritmo de aprendizaje automático simple, veamos cómo ajustar un algoritmo más avanzado, como XGBoost.

Optimización del hiperparámetro XGBoost

XGBoost es la abreviatura de Extreme Gradient Boosting y es una implementación eficiente del algoritmo de aprendizaje automático de aumento de gradiente estocástico.

El algoritmo de aumento de gradiente estocástico, también llamado máquinas de aumento de gradiente o aumento de árbol, es una poderosa técnica de aprendizaje automático que funciona bien o incluso mejor en una amplia gama de problemas desafiantes de aprendizaje automático.

Primero, se debe instalar la biblioteca XGBoost.

Puede instalarlo usando pip, de la siguiente manera:

Una vez instalado, puede confirmar que se instaló correctamente y que está utilizando una versión moderna ejecutando el siguiente código:

Al ejecutar el código, debería ver el siguiente número de versión o superior.

Aunque la biblioteca XGBoost tiene su propia API Python, podemos usar modelos XGBoost con la API scikit-learn a través de la clase contenedora XGBClassifier.

An instance of the model can be instantiated and used just like any other scikit-learn class for model evaluation. Por ejemplo:

Before we tune the hyperparameters of XGBoost, we can establish a baseline in performance using the default hyperparameters.

We will use the same synthetic binary classification dataset from the previous section and the same test harness of repeated stratified k-fold cross-validation.

The complete example of evaluating the performance of XGBoost with default hyperparameters is listed below.

Running the example evaluates the model and reports the mean and standard deviation of the classification accuracy.

Nota: Your results may vary given the stochastic nature of the algorithm or evaluation procedure, or differences in numerical precision. Consider running the example a few times and compare the average outcome.

In this case, we can see that the model with default hyperparameters achieved a classification accuracy of about 84.9 percent.

We would hope that we can achieve better performance than this with optimized hyperparameters.

Next, we can adapt the stochastic hill climbing optimization algorithm to tune the hyperparameters of the XGBoost model.

There are many hyperparameters that we may want to optimize for the XGBoost model.

For an overview of how to tune the XGBoost model, see the tutorial:

We will focus on four key hyperparameters; they are:

  • Learning Rate (learning_rate)
  • Number of Trees (n_estimators)
  • Subsample Percentage (subsample)
  • Tree Depth (max_depth)

los learning rate controls the contribution of each tree to the ensemble. Sensible values are less than 1.0 and slightly above 0.0 (e.g. 1e-8).

los number of trees controls the size of the ensemble, and often, more trees is better to a point of diminishing returns. Sensible values are between 1 tree and hundreds or thousands of trees.

los subsample percentages define the random sample size used to train each tree, defined as a percentage of the size of the original dataset. Values are between a value slightly above 0.0 (e.g. 1e-8) and 1.0

los tree depth is the number of levels in each tree. Deeper trees are more specific to the training dataset and perhaps overfit. Shorter trees often generalize better. Sensible values are between 1 and 10 or 20.

First, we must update the objective() function to unpack the hyperparameters of the XGBoost model, configure it, and then evaluate the mean classification accuracy.

Recomendado:  Herramientas de anotación de datos Mercado Nuevas oportunidades, segmentación

Next, we need to define the step() function used to take a step in the search space.

Each hyperparameter is quite a different range, therefore, we will define the step size (standard deviation of the distribution) separately for each hyperparameter. We will also define the step sizes in line rather than as arguments to the function, to keep things simple.

The number of trees and the depth are integers, so the stepped values are rounded.

The step sizes chosen are arbitrary, chosen after a little trial and error.

The updated step function is listed below.

Finally, the hillclimbing() algorithm must be updated to define an initial solution with appropriate values.

In this case, we will define the initial solution with sensible defaults, matching the default hyperparameters, or close to them.

Tying this together, the complete example of manually tuning the hyperparameters of the XGBoost algorithm using a stochastic hill climbing algorithm is listed below.

Running the example reports the configuration and result each time an improvement is seen during the search. At the end of the run, the best configuration and result are reported.

Nota: Your results may vary given the stochastic nature of the algorithm or evaluation procedure, or differences in numerical precision. Consider running the example a few times and compare the average outcome.

In this case, we can see that the best result involved using a learning rate of about 0.02, 52 trees, a subsample rate of about 50 percent, and a large depth of 53 levels.

This configuration resulted in a mean accuracy of about 87.3 percent, better than the default configuration that achieved an accuracy of about 84.9 percent.

Can you get a better result?
Let me know in the comments below.

Otras lecturas

This section provides more resources on the topic if you are looking to go deeper.

Tutorials

APIs

Articles

Resumen

In this tutorial, you discovered how to manually optimize the hyperparameters of machine learning algorithms.

Specifically, you learned:

  • Stochastic optimization algorithms can be used instead of grid and random search for hyperparameter optimization.
  • How to use a stochastic hill climbing algorithm to tune the hyperparameters of the Perceptron algorithm.
  • How to manually optimize the hyperparameters of the XGBoost gradient boosting algorithm.

Do you have any questions?
Ask your questions in the comments below and I will do my best to answer.