Búsqueda de sitios web

Optimización de hiperparámetros con búsqueda aleatoria y búsqueda de cuadrícula


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

A menudo se conocen los efectos generales de los hiperparámetros en un modelo, pero es un desafío encontrar la mejor manera de establecer un hiperparámetro y combinaciones de hiperparámetros que interactúan para un conjunto de datos determinado. A menudo existen heurísticas generales o reglas generales para configurar hiperparámetros.

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 y está disponible en la biblioteca de aprendizaje automático Python scikit-learn. El resultado de una optimización de hiperparámetros es un conjunto único de hiperparámetros de buen rendimiento que puede utilizar para configurar su modelo.

En este tutorial, descubrirá la optimización de hiperparámetros para el aprendizaje automático en Python.

Después de completar este tutorial, sabrá:

  • Se requiere optimización de hiperparámetros para aprovechar al máximo sus modelos de aprendizaje automático.
  • Cómo configurar la optimización de hiperparámetros de búsqueda aleatoria y de cuadrícula para tareas de clasificación.
  • Cómo configurar la optimización de hiperparámetros de búsqueda aleatoria y de cuadrícula para tareas de regresión.

Empecemos.

Descripción general del tutorial

Este tutorial se divide en cinco partes; ellos son:

  1. Optimización de hiperparámetros del modelo
  2. API Scikit-Learn de optimización de hiperparámetros
  3. Optimización de hiperparámetros para clasificación

    1. Búsqueda aleatoria para clasificación
    2. Búsqueda de cuadrícula para clasificación
  4. Optimización de hiperparámetros para regresión

    1. Búsqueda aleatoria de regresión
    2. Búsqueda de cuadrícula para regresión
  5. Preguntas comunes sobre la optimización de hiperparámetros

Optimización de hiperparámetros del modelo

Los modelos de aprendizaje automático tienen hiperparámetros.

Los hiperparámetros son puntos de elección o configuración que permiten personalizar un modelo de aprendizaje automático para una tarea o conjunto de datos específicos.

  • Hiperparámetro: argumento de configuración del modelo especificado por el desarrollador para guiar el proceso de aprendizaje de un conjunto de datos específico.

Los modelos de aprendizaje automático también tienen parámetros, que son los coeficientes internos establecidos al entrenar u optimizar el modelo en un conjunto de datos de entrenamiento.

Los parámetros son diferentes de los hiperparámetros. Los parámetros se aprenden automáticamente; Los hiperparámetros se configuran manualmente para ayudar a guiar el proceso de aprendizaje.

Para obtener más información sobre la diferencia entre parámetros e hiperparámetros, consulte el tutorial:

  • ¿Cuál es la diferencia entre un parámetro y un hiperparámetro?

Normalmente, un hiperparámetro tiene un efecto conocido en un modelo en el sentido general, pero no está claro cuál es la mejor manera de establecer un hiperparámetro para un conjunto de datos determinado. Además, muchos modelos de aprendizaje automático tienen una variedad de hiperparámetros y pueden interactuar de forma no lineal.

Como tal, a menudo es necesario buscar un conjunto de hiperparámetros que den como resultado el mejor rendimiento de un modelo en un conjunto de datos. Esto se denomina optimización de hiperparámetros, ajuste de hiperparámetros o búsqueda de hiperparámetros.

Un procedimiento de optimización implica definir un espacio de búsqueda. Esto se puede considerar geométricamente como un volumen de n dimensiones, donde cada hiperparámetro representa una dimensión diferente y la escala de la dimensión son los valores que el hiperparámetro puede adoptar, como valor real, valor entero o categórico.

  • Espacio de búsqueda: Volumen a buscar donde cada dimensión representa un hiperparámetro y cada punto representa una configuración del modelo.

Un punto en el espacio de búsqueda es un vector con un valor específico para cada valor de hiperparámetro. El objetivo del procedimiento de optimización es encontrar un vector que dé como resultado el mejor rendimiento del modelo después del aprendizaje, como la máxima precisión o el mínimo error.

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 acotado de valores de hiperparámetros y muestree aleatoriamente puntos 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 de cuadrícula es excelente para verificar combinaciones 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.

A veces se utilizan métodos más avanzados, como la optimización bayesiana y la optimización evolutiva.

Ahora que estamos familiarizados con la optimización de hiperparámetros, veamos cómo podemos usar este método en Python.

API Scikit-Learn de optimización de hiperparámetros

La biblioteca de aprendizaje automático de código abierto scikit-learn Python proporciona técnicas para ajustar los hiperparámetros del modelo.

Específicamente, proporciona RandomizedSearchCV para búsqueda aleatoria y GridSearchCV para búsqueda en cuadrícula. Ambas técnicas evalúan modelos para un vector de hiperparámetro determinado mediante validación cruzada, de ahí el sufijo “CV” de cada nombre de clase.

Ambas clases requieren dos argumentos. El primero es el modelo que estás optimizando. Esta es una instancia del modelo con valores de hiperparámetros establecidos que desea optimizar. El segundo es el espacio de búsqueda. Esto se define como un diccionario donde los nombres son los argumentos de los hiperparámetros del modelo y los valores son valores discretos o una distribución de valores para muestrear en el caso de una búsqueda aleatoria.

...
# define model
model = LogisticRegression()
# define search space
space = dict()
...
# define search
search = GridSearchCV(model, space)

Ambas clases proporcionan un argumento “cv” que permite especificar un número entero de pliegues, p. 5, o un objeto de validación cruzada configurado. Recomiendo definir y especificar un objeto de validación cruzada para obtener más control sobre la evaluación del modelo y hacer que el procedimiento de evaluación sea obvio y explícito.

En el caso de tareas de clasificación, recomiendo usar la clase RepeatedStratifiedKFold, y para tareas de regresión, recomiendo usar RepeatedKFold con un número adecuado de pliegues y repeticiones, como 10 pliegues y tres repeticiones.

...
# define evaluation
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
# define search
search = GridSearchCV(..., cv=cv)

Ambas clases de optimización de hiperparámetros también proporcionan un argumento de “puntuación” que toma una cadena que indica la métrica a optimizar.

La métrica debe ser maximizadora, lo que significa que mejores modelos dan como resultado puntuaciones más altas. Para la clasificación, esto puede ser 'precisión'. Para la regresión, esta es una medida de error negativa, como 'neg_mean_absolute_error' para una versión negativa del error absoluto medio, donde los valores más cercanos a cero representan menos error de predicción por parte del modelo.

...
# define search
search = GridSearchCV(..., scoring='neg_mean_absolute_error')

Puede ver una lista de métricas de puntuación integradas aquí:

  • El parámetro de puntuación: definición de reglas de evaluación del modelo

Finalmente, la búsqueda se puede realizar en paralelo, p.e. use todos los núcleos de la CPU especificando el argumento “n_jobs” como un número entero con la cantidad de núcleos en su sistema, p.e. 8. O puede configurarlo en -1 para usar automáticamente todos los núcleos de su sistema.

...
# define search
search = GridSearchCV(..., n_jobs=-1)

Una vez definida, la búsqueda se realiza llamando a la función fit() y proporcionando un conjunto de datos utilizado para entrenar y evaluar combinaciones de hiperparámetros del modelo mediante validación cruzada.

...
# execute search
result = search.fit(X, y)

La ejecución de la búsqueda puede tardar minutos u horas, según el tamaño del espacio de búsqueda y la velocidad de su hardware. A menudo querrás adaptar la búsqueda a la cantidad de tiempo que tienes en lugar de a la posibilidad de qué se puede buscar.

Al final de la búsqueda, puede acceder a todos los resultados a través de los atributos de la clase. Quizás los atributos más importantes sean la mejor puntuación observada y los hiperparámetros que lograron la mejor puntuación.

...
# summarize result
print('Best Score: %s' % result.best_score_)
print('Best Hyperparameters: %s' % result.best_params_)

Una vez que conozca el conjunto de hiperparámetros que logran el mejor resultado, puede definir un nuevo modelo, establecer los valores de cada hiperparámetro y luego ajustar el modelo a todos los datos disponibles. Luego, este modelo se puede utilizar para hacer predicciones sobre nuevos datos.

Ahora que estamos familiarizados con la API de optimización de hiperparámetros en scikit-learn, veamos algunos ejemplos prácticos.

Optimización de hiperparámetros para clasificación

En esta sección, utilizaremos la optimización de hiperparámetros para descubrir una configuración de modelo de buen rendimiento para el conjunto de datos de sonda.

El conjunto de datos de sonda es un conjunto de datos de aprendizaje automático estándar que comprende 208 filas de datos con 60 variables de entrada numéricas y una variable objetivo con dos valores de clase, p. clasificación binaria.

Utilizando un conjunto de pruebas de validación cruzada repetida estratificada 10 veces con tres repeticiones, un modelo ingenuo puede lograr una precisión de aproximadamente el 53 por ciento. Un modelo de alto rendimiento puede lograr una precisión en este mismo arnés de prueba de aproximadamente el 88 por ciento. Esto proporciona los límites del rendimiento esperado en este conjunto de datos.

El conjunto de datos implica predecir si los resultados del sonar indican una roca o una mina simulada.

  • Conjunto de datos de sonda (sonar.csv)
  • Descripción del conjunto de datos de sonda (sonar.names)

No es necesario descargar el conjunto de datos; Lo descargaremos automáticamente como parte de nuestros ejemplos trabajados.

El siguiente ejemplo descarga el conjunto de datos y resume su forma.

# summarize the sonar dataset
from pandas import read_csv
# load dataset
url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/sonar.csv'
dataframe = read_csv(url, header=None)
# split into input and output elements
data = dataframe.values
X, y = data[:, :-1], data[:, -1]
print(X.shape, y.shape)

Al ejecutar el ejemplo, se descarga el conjunto de datos y lo divide en elementos de entrada y salida. Como era de esperar, podemos ver que hay 208 filas de datos con 60 variables de entrada.

(208, 60) (208,)

A continuación, utilicemos la búsqueda aleatoria para encontrar una buena configuración de modelo para el conjunto de datos del sonar.

Para simplificar las cosas, nos centraremos en un modelo lineal, el modelo de regresión logística y los hiperparámetros comunes ajustados para este modelo.

Búsqueda aleatoria para clasificación

En esta sección, exploraremos la optimización de hiperparámetros del modelo de regresión logística en el conjunto de datos del sonar.

Primero, definiremos el modelo que se optimizará y usaremos valores predeterminados para los hiperparámetros que no se optimizarán.

...
# define model
model = LogisticRegression()

Evaluaremos las configuraciones del modelo utilizando validación cruzada estratificada repetida de k veces con tres repeticiones y 10 pliegues.

...
# define evaluation
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)

A continuación, podemos definir el espacio de búsqueda.

Este es un diccionario donde los nombres son argumentos del modelo y los valores son distribuciones de las cuales extraer muestras. Optimizaremos los hiperparámetros solver, penalty y C del modelo con distribuciones discretas para el solucionador y el tipo de penalización y un log- distribución uniforme de 1e-5 a 100 para el valor C.

Log-uniform es útil para buscar valores de penalización, ya que a menudo exploramos valores en diferentes órdenes de magnitud, al menos como primer paso.

...
# define search space
space = dict()
space['solver'] = ['newton-cg', 'lbfgs', 'liblinear']
space['penalty'] = ['none', 'l1', 'l2', 'elasticnet']
space['C'] = loguniform(1e-5, 100)

A continuación, podemos definir el procedimiento de búsqueda con todos estos elementos.

Es importante destacar que debemos establecer el número de iteraciones o muestras que se extraerán del espacio de búsqueda mediante el argumento “n_iter”. En este caso, lo estableceremos en 500.

...
# define search
search = RandomizedSearchCV(model, space, n_iter=500, scoring='accuracy', n_jobs=-1, cv=cv, random_state=1)

Finalmente, podemos realizar la optimización e informar los resultados.

...
# execute search
result = search.fit(X, y)
# summarize result
print('Best Score: %s' % result.best_score_)
print('Best Hyperparameters: %s' % result.best_params_)

Uniendo esto, el ejemplo completo se enumera a continuación.

# random search logistic regression model on the sonar dataset
from scipy.stats import loguniform
from pandas import read_csv
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.model_selection import RandomizedSearchCV
# load dataset
url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/sonar.csv'
dataframe = read_csv(url, header=None)
# split into input and output elements
data = dataframe.values
X, y = data[:, :-1], data[:, -1]
# define model
model = LogisticRegression()
# define evaluation
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
# define search space
space = dict()
space['solver'] = ['newton-cg', 'lbfgs', 'liblinear']
space['penalty'] = ['none', 'l1', 'l2', 'elasticnet']
space['C'] = loguniform(1e-5, 100)
# define search
search = RandomizedSearchCV(model, space, n_iter=500, scoring='accuracy', n_jobs=-1, cv=cv, random_state=1)
# execute search
result = search.fit(X, y)
# summarize result
print('Best Score: %s' % result.best_score_)
print('Best Hyperparameters: %s' % result.best_params_)

Ejecutar el ejemplo puede tardar un minuto. Es rápido porque utilizamos un espacio de búsqueda pequeño y un modelo rápido para ajustar y evaluar. Es posible que vea algunas advertencias durante la optimización para combinaciones de configuración no válidas. Estos pueden ignorarse con seguridad.

Al final de la ejecución, se informa la mejor puntuación y la configuración de hiperparámetros que logró el mejor rendimiento.

Sus resultados específicos variarán dada la naturaleza estocástica del procedimiento de optimización. Intente ejecutar el ejemplo varias veces.

En este caso, podemos ver que la mejor configuración logró una precisión de alrededor del 78,9 por ciento, lo cual es justo, y los valores específicos para solver, penalty y C hiperparámetros utilizados para lograr esa puntuación.

Best Score: 0.7897619047619049
Best Hyperparameters: {'C': 4.878363034905756, 'penalty': 'l2', 'solver': 'newton-cg'}

A continuación, usemos la búsqueda de cuadrícula para encontrar una buena configuración de modelo para el conjunto de datos del sonar.

Búsqueda de cuadrícula para clasificación

Usar la búsqueda en cuadrícula es muy parecido a usar la búsqueda aleatoria para clasificación.

La principal diferencia es que el espacio de búsqueda debe ser una cuadrícula discreta para buscar. Esto significa que en lugar de utilizar una distribución logarítmica uniforme para C, podemos especificar valores discretos en una escala logarítmica.

...
# define search space
space = dict()
space['solver'] = ['newton-cg', 'lbfgs', 'liblinear']
space['penalty'] = ['none', 'l1', 'l2', 'elasticnet']
space['C'] = [1e-5, 1e-4, 1e-3, 1e-2, 1e-1, 1, 10, 100]

Además, la clase GridSearchCV no requiere varias iteraciones, ya que solo evaluamos combinaciones de hiperparámetros en la cuadrícula.

...
# define search
search = GridSearchCV(model, space, scoring='accuracy', n_jobs=-1, cv=cv)

Uniendo todo esto, a continuación se enumera el ejemplo completo de configuraciones de regresión logística de búsqueda de cuadrícula para el conjunto de datos de sonar.

# grid search logistic regression model on the sonar dataset
from pandas import read_csv
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.model_selection import GridSearchCV
# load dataset
url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/sonar.csv'
dataframe = read_csv(url, header=None)
# split into input and output elements
data = dataframe.values
X, y = data[:, :-1], data[:, -1]
# define model
model = LogisticRegression()
# define evaluation
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
# define search space
space = dict()
space['solver'] = ['newton-cg', 'lbfgs', 'liblinear']
space['penalty'] = ['none', 'l1', 'l2', 'elasticnet']
space['C'] = [1e-5, 1e-4, 1e-3, 1e-2, 1e-1, 1, 10, 100]
# define search
search = GridSearchCV(model, space, scoring='accuracy', n_jobs=-1, cv=cv)
# execute search
result = search.fit(X, y)
# summarize result
print('Best Score: %s' % result.best_score_)
print('Best Hyperparameters: %s' % result.best_params_)

Ejecutar el ejemplo puede tardar un momento. Es rápido porque utilizamos un espacio de búsqueda pequeño y un modelo rápido para ajustar y evaluar. Nuevamente, es posible que vea algunas advertencias durante la optimización para combinaciones de configuración no válidas. Estos pueden ignorarse con seguridad.

Al final de la ejecución, se informa la mejor puntuación y la configuración de hiperparámetros que logró el mejor rendimiento.

Sus resultados específicos variarán dada la naturaleza estocástica del procedimiento de optimización. Intente ejecutar el ejemplo varias veces.

En este caso, podemos ver que la mejor configuración logró una precisión de alrededor del 78,2%, lo cual también es justo y los valores específicos para solver, penalty y C hiperparámetros utilizados para lograr esa puntuación. Curiosamente, los resultados son muy similares a los encontrados mediante la búsqueda aleatoria.

Best Score: 0.7828571428571429
Best Hyperparameters: {'C': 1, 'penalty': 'l2', 'solver': 'newton-cg'}

Optimización de hiperparámetros para regresión

En esta sección utilizaremos la hiperoptimización para descubrir una configuración de modelo de alto rendimiento para el conjunto de datos de seguros de automóviles.

El conjunto de datos de seguros de automóviles es un conjunto de datos de aprendizaje automático estándar que comprende 63 filas de datos con 1 variable de entrada numérica y una variable de destino numérica.

Utilizando un arnés de prueba de validación cruzada repetida estratificada de 10 veces con 3 repeticiones, un modelo ingenuo puede lograr un error absoluto medio (MAE) de aproximadamente 66. Un modelo de alto rendimiento puede lograr un MAE en este mismo arnés de prueba de aproximadamente 28. Esto proporciona los límites del rendimiento esperado en este conjunto de datos.

El conjunto de datos implica predecir el monto total de reclamaciones (miles de coronas suecas) dado el número de reclamaciones para diferentes regiones geográficas.

  • Conjunto de datos de seguros de automóviles (auto-insurance.csv)
  • Descripción del conjunto de datos de seguros de automóviles (auto-insurance.names)

No es necesario descargar el conjunto de datos, lo descargaremos automáticamente como parte de nuestros ejemplos trabajados.

El siguiente ejemplo descarga el conjunto de datos y resume su forma.

# summarize the auto insurance dataset
from pandas import read_csv
# load dataset
url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/auto-insurance.csv'
dataframe = read_csv(url, header=None)
# split into input and output elements
data = dataframe.values
X, y = data[:, :-1], data[:, -1]
print(X.shape, y.shape)

Al ejecutar el ejemplo, se descarga el conjunto de datos y lo divide en elementos de entrada y salida. Como era de esperar, podemos ver que hay 63 filas de datos con 1 variable de entrada.

(63, 1) (63,)

A continuación, podemos utilizar la optimización de hiperparámetros para encontrar una buena configuración de modelo para el conjunto de datos de seguros de automóviles.

Para simplificar las cosas, nos centraremos en un modelo lineal, el modelo de regresión lineal y los hiperparámetros comunes ajustados para este modelo.

Búsqueda aleatoria de regresión

Configurar y utilizar el procedimiento de optimización de hiperparámetros de búsqueda aleatoria para la regresión es muy parecido a utilizarlo para la clasificación.

En este caso, configuraremos los hiperparámetros importantes de la implementación de regresión lineal, incluidos solver, alpha, fit_intercept y normalize. .

Usaremos una distribución discreta de valores en el espacio de búsqueda para todos excepto el argumento “alfa”, que es un término de penalización, en cuyo caso usaremos una distribución logarítmica uniforme como lo hicimos en el punto anterior. sección para el argumento “C” de la regresión logística.

...
# define search space
space = dict()
space['solver'] = ['svd', 'cholesky', 'lsqr', 'sag']
space['alpha'] = loguniform(1e-5, 100)
space['fit_intercept'] = [True, False]
space['normalize'] = [True, False]

La principal diferencia entre la regresión y la clasificación es la elección del método de puntuación.

Para la regresión, el desempeño a menudo se mide utilizando un error, que se minimiza, donde el cero representa un modelo con habilidad perfecta. Los procedimientos de optimización de hiperparámetros en scikit-learn suponen una puntuación de maximización. Por lo tanto, se proporciona una versión de cada métrica de error que se hace negativa.

Esto significa que los grandes errores positivos se convierten en grandes errores negativos, el buen desempeño son pequeños valores negativos cercanos a cero y la habilidad perfecta es cero.

El signo del MAE negativo puede ignorarse al interpretar el resultado.

En este caso nos referiremos al error absoluto (MAE) y hay disponible una versión maximizadora de este error estableciendo el argumento “puntuación” en “neg_mean_absolute_error”.

...
# define search
search = RandomizedSearchCV(model, space, n_iter=500, scoring='neg_mean_absolute_error', n_jobs=-1, cv=cv, random_state=1)

Uniendo esto, el ejemplo completo se enumera a continuación.

# random search linear regression model on the auto insurance dataset
from scipy.stats import loguniform
from pandas import read_csv
from sklearn.linear_model import Ridge
from sklearn.model_selection import RepeatedKFold
from sklearn.model_selection import RandomizedSearchCV
# load dataset
url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/auto-insurance.csv'
dataframe = read_csv(url, header=None)
# split into input and output elements
data = dataframe.values
X, y = data[:, :-1], data[:, -1]
# define model
model = Ridge()
# define evaluation
cv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1)
# define search space
space = dict()
space['solver'] = ['svd', 'cholesky', 'lsqr', 'sag']
space['alpha'] = loguniform(1e-5, 100)
space['fit_intercept'] = [True, False]
space['normalize'] = [True, False]
# define search
search = RandomizedSearchCV(model, space, n_iter=500, scoring='neg_mean_absolute_error', n_jobs=-1, cv=cv, random_state=1)
# execute search
result = search.fit(X, y)
# summarize result
print('Best Score: %s' % result.best_score_)
print('Best Hyperparameters: %s' % result.best_params_)

Ejecutar el ejemplo puede tardar un momento. Es rápido porque utilizamos un espacio de búsqueda pequeño y un modelo rápido para ajustar y evaluar. Es posible que vea algunas advertencias durante la optimización para combinaciones de configuración no válidas. Estos pueden ignorarse con seguridad.

Al final de la ejecución, se informa la mejor puntuación y la configuración de hiperparámetros que logró el mejor rendimiento.

Sus resultados específicos variarán dada la naturaleza estocástica del procedimiento de optimización. Intente ejecutar el ejemplo varias veces.

En este caso, podemos ver que la mejor configuración logró un MAE de aproximadamente 29,2, que está muy cerca del mejor rendimiento del modelo. Luego podemos ver los valores de hiperparámetros específicos que lograron este resultado.

Best Score: -29.23046315344758
Best Hyperparameters: {'alpha': 0.008301451461243866, 'fit_intercept': True, 'normalize': True, 'solver': 'sag'}

A continuación, utilicemos la búsqueda en cuadrícula para encontrar una buena configuración de modelo para el conjunto de datos de seguros de automóviles.

Búsqueda de cuadrícula para regresión

Como búsqueda de cuadrícula, no podemos definir una distribución para muestrear y, en su lugar, debemos definir una cuadrícula discreta de valores de hiperparámetros. Como tal, especificaremos el argumento “alfa” como un rango de valores en una escala log-10.

...
# define search space
space = dict()
space['solver'] = ['svd', 'cholesky', 'lsqr', 'sag']
space['alpha'] = [1e-5, 1e-4, 1e-3, 1e-2, 1e-1, 1, 10, 100]
space['fit_intercept'] = [True, False]
space['normalize'] = [True, False]

La búsqueda de cuadrícula para regresión requiere que se especifique la “puntuación”, de forma muy parecida a como lo hicimos para la búsqueda aleatoria.

En este caso, volveremos a utilizar la función de puntuación MAE negativa.

...
# define search
search = GridSearchCV(model, space, scoring='neg_mean_absolute_error', n_jobs=-1, cv=cv)

Uniendo todo esto, a continuación se enumera el ejemplo completo de configuraciones de regresión lineal de búsqueda de cuadrícula para el conjunto de datos de seguros de automóviles.

# grid search linear regression model on the auto insurance dataset
from pandas import read_csv
from sklearn.linear_model import Ridge
from sklearn.model_selection import RepeatedKFold
from sklearn.model_selection import GridSearchCV
# load dataset
url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/auto-insurance.csv'
dataframe = read_csv(url, header=None)
# split into input and output elements
data = dataframe.values
X, y = data[:, :-1], data[:, -1]
# define model
model = Ridge()
# define evaluation
cv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1)
# define search space
space = dict()
space['solver'] = ['svd', 'cholesky', 'lsqr', 'sag']
space['alpha'] = [1e-5, 1e-4, 1e-3, 1e-2, 1e-1, 1, 10, 100]
space['fit_intercept'] = [True, False]
space['normalize'] = [True, False]
# define search
search = GridSearchCV(model, space, scoring='neg_mean_absolute_error', n_jobs=-1, cv=cv)
# execute search
result = search.fit(X, y)
# summarize result
print('Best Score: %s' % result.best_score_)
print('Best Hyperparameters: %s' % result.best_params_)

Ejecutar el ejemplo puede tardar un minuto. Es rápido porque utilizamos un espacio de búsqueda pequeño y un modelo rápido para ajustar y evaluar. Nuevamente, es posible que vea algunas advertencias durante la optimización para combinaciones de configuración no válidas. Estos pueden ignorarse con seguridad.

Al final de la ejecución, se informa la mejor puntuación y la configuración de hiperparámetros que logró el mejor rendimiento.

Sus resultados específicos variarán dada la naturaleza estocástica del procedimiento de optimización. Intente ejecutar el ejemplo varias veces.

En este caso, podemos ver que la mejor configuración logró un MAE de aproximadamente 29,2, que es casi idéntico a lo que logramos con la búsqueda aleatoria en la sección anterior. Curiosamente, los hiperparámetros también son casi idénticos, lo cual es una buena confirmación.

Best Score: -29.275708614337326
Best Hyperparameters: {'alpha': 0.1, 'fit_intercept': True, 'normalize': False, 'solver': 'sag'}

Preguntas comunes sobre la optimización de hiperparámetros

Esta sección aborda algunas preguntas comunes sobre la optimización de hiperparámetros.

¿Cómo elegir entre búsqueda aleatoria y de cuadrícula?

Elija el método según sus necesidades. Recomiendo comenzar con grid y hacer una búsqueda aleatoria si tienes tiempo.

La búsqueda de cuadrícula es apropiada para búsquedas pequeñas y rápidas de valores de hiperparámetros que se sabe que funcionan bien en general.

La búsqueda aleatoria es adecuada para descubrir nuevos valores de hiperparámetros o nuevas combinaciones de hiperparámetros, lo que a menudo da como resultado un mejor rendimiento, aunque puede llevar más tiempo completarla.

¿Cómo acelerar la optimización de hiperparámetros?

Asegúrese de configurar el argumento “n_jobs” en la cantidad de núcleos de su máquina.

Después de eso, más sugerencias incluyen:

  • Evalúe en una muestra más pequeña de su conjunto de datos.
  • Explora un espacio de búsqueda más pequeño.
  • Utilice menos repeticiones y/o pliegues para la validación cruzada.
  • Ejecute la búsqueda en una máquina más rápida, como AWS EC2.
  • Utilice un modelo alternativo que sea más rápido de evaluar.

¿Cómo elegir hiperparámetros para buscar?

La mayoría de los algoritmos tienen un subconjunto de hiperparámetros que tienen la mayor influencia sobre el procedimiento de búsqueda.

Estos se enumeran en la mayoría de las descripciones del algoritmo. Por ejemplo, aquí hay algunos algoritmos y sus hiperparámetros más importantes:

  • Ajuste de hiperparámetros para algoritmos de aprendizaje automático de clasificación

Si no está seguro:

  • Revise artículos que utilicen el algoritmo para obtener ideas.
  • Revise la documentación de API y algoritmos para obtener ideas.
  • Busque todos los hiperparámetros.

¿Cómo utilizar los hiperparámetros de mejor rendimiento?

Defina un nuevo modelo y establezca los valores de hiperparámetros del modelo en los valores encontrados por la búsqueda.

Luego ajuste el modelo a todos los datos disponibles y utilícelo para comenzar a hacer predicciones sobre nuevos datos.

A esto se le llama preparar un modelo final. Ver más aquí:

  • Cómo entrenar un modelo final de aprendizaje automático

¿Cómo hacer una predicción?

Primero, ajuste un modelo final (pregunta anterior).

Luego llame a la función predict() para hacer una predicción.

Para ver ejemplos de cómo hacer una predicción con un modelo final, consulte el tutorial:

  • Cómo hacer predicciones con scikit-learn

¿Tiene otra pregunta sobre la optimización de hiperparámetros?
Déjemelo saber en los comentarios a continuación.

Lectura adicional

Esta sección proporciona más recursos sobre el tema si desea profundizar más.

Tutoriales

  • ¿Cuál es la diferencia entre un parámetro y un hiperparámetro?
  • Resultados para conjuntos de datos de aprendizaje automático de regresión y clasificación estándar
  • Ajuste de hiperparámetros para algoritmos de aprendizaje automático de clasificación
  • Cómo entrenar un modelo final de aprendizaje automático
  • Cómo hacer predicciones con scikit-learn

API

  • Ajuste de los hiperparámetros de un estimador, documentación de scikit-learn.
  • API sklearn.model_selection.GridSearchCV.
  • sklearn.model_selection.API RandomizedSearchCV.

Artículos

  • Optimización de hiperparámetros, Wikipedia.

Resumen

En este tutorial, descubrió la optimización de hiperparámetros para el aprendizaje automático en Python.

Específicamente, aprendiste:

  • Se requiere optimización de hiperparámetros para aprovechar al máximo sus modelos de aprendizaje automático.
  • Cómo configurar la optimización de hiperparámetros de búsqueda aleatoria y de cuadrícula para tareas de clasificación.
  • Cómo configurar la optimización de hiperparámetros de búsqueda aleatoria y de cuadrícula para tareas de regresión.

¿Tiene alguna pregunta?
Haga sus preguntas en los comentarios a continuación y haré todo lo posible para responderlas.

Artículos relacionados