Aprendizaje automático (15): Ajuste de hiperparámetros de alto nivel_Optimización bayesiana (con código)

El texto completo tiene más de 9000 palabras y el tiempo de lectura esperado es de aproximadamente 18 a 30 minutos | Lleno de productos secos (con código), ¡se recomienda recolectar!
inserte la descripción de la imagen aquí

Dirección de descarga de código y conjunto de datos

1. Introducción

Los métodos de optimización bayesianos han sido reconocidos como el estado del arte en el campo de la optimización de hiperparámetros, State of the Art (SOTA) . La mayoría de los esquemas de optimización de hiperparámetros que muestran excelencia en eficiencia y rendimiento se construyen sobre la base del concepto de optimización bayesiana.

Para los tres métodos de búsqueda de cuadrícula, búsqueda de cuadrícula aleatoria y búsqueda de cuadrícula a la mitad, no importa cómo cambie la idea de construcción, lo fundamental es verificar todos los puntos en un espacio de parámetros grande y luego regresar al valor óptimo de la función de pérdida . Aunque estrategias como la aleatorización y el Halving pueden acortar el tiempo de entrenamiento y adaptarse a grandes datos y grandes espacios de parámetros, estos métodos aún no pueden lograr una situación beneficiosa para todos en términos de eficiencia y precisión. Para realizar una búsqueda de parámetros más rápido y encontrar parámetros con la mejor capacidad de generalización, es mejor utilizar una herramienta de ajuste de parámetros con un proceso a priori, como una herramienta de ajuste de parámetros basada en el proceso bayesiano.

2. Conceptos básicos de optimización bayesiana.

2.1 Principio de funcionamiento

El principio de funcionamiento de la optimización bayesiana es: primero establecer un conocimiento previo del comportamiento global de la función objetivo (generalmente representado por un proceso gaussiano) y luego actualizar este conocimiento previo observando la salida de la función objetivo en diferentes puntos de entrada para formar un posteriori distribuido. Con base en la distribución posterior, se selecciona el siguiente punto de muestreo. Esta elección debe tener en cuenta tanto el valor óptimo observado previamente (es decir, la utilización) como el área global inexplorada (es decir, la exploración). La estrategia de esta elección generalmente se define mediante la llamada función de adquisición, como la mejora esperada más comúnmente utilizada, de modo que la optimización bayesiana no solo puede buscar de manera eficiente en el espacio de hiperparámetros, sino que también se basa en el conocimiento existente para guiar la búsqueda, evitando muchos intentos inútiles.

¿Es un poco confuso? Jaja, está bien. Después de leer este artículo, podrás comprender fácilmente el proceso.

La optimización bayesiana es muy poderosa, pero la dificultad general de aprendizaje es muy alta. Si desea aprender bien la optimización bayesiana, debe comprender completamente los conceptos y algoritmos principales del aprendizaje automático, estar familiarizado con el proceso típico de optimización de hiperparámetros y también dominar algunos conocimientos matemáticos más allá del cálculo, la teoría de la probabilidad y el álgebra lineal. En particular, el algoritmo de optimización bayesiano en sí es diferente del proceso de optimización bayesiano utilizado para HPO.

Entonces, el enfoque de este artículo es: dominar el proceso central de optimización bayesiana para HPO .

2.2 Ideas para resolver el valor mínimo de la función

Independientemente del problema de HPO, mire este ejemplo.

Supongamos ahora que conocemos una función f ( x ) f(x)La expresión de f ( x ) y su argumentoxxEl dominio de definición de x , con la esperanza de resolverxxEl rango de valores de x es f ( x ) f(x)El valor mínimo de f ( x ) , ¿cómo resolver este valor mínimo?

Ante este problema, suelen existir tres soluciones:

  1. Para f (x) f(x)Derivación de f ( x ) , sea 0 su primera derivada para encontrar su valor mínimo

Restricción: función f ( x ) f(x)f ( x ) es diferenciable y la ecuación diferencial se puede resolver directamente

  1. Itere a través de métodos de optimización como el descenso de gradiente para obtener f ( x ) f(x)valor mínimo de f ( x )

Restricción: función f ( x ) f(x)f ( x ) es diferenciable y la función en sí es convexa

  1. Cambiar el global xxx enf ( x ) f(x)f ( x ) calcula todos los resultados posibles y encuentra el mínimo

Restricción: función f ( x ) f(x)f ( x ) es relativamente sencillo, la dimensión de la variable independiente es relativamente baja y la cantidad de cálculo puede ser tolerada

Al conocer la función f ( x ) f(x)expresión f ( x ) , los métodos anteriores a menudo pueden ser efectivos, pero cada método tiene sus propias condiciones previas. Supongamos ahora que la función f ( x ) f(x)f ( x ) es una función suave y uniforme, pero es extremadamente compleja y no diferenciable, por lo que no puede resolverse mediante ninguno de los tres métodos anteriores.

Una solución eficaz es la siguiente:

Paso 1: a las xxSe seleccionan al azar 4 puntos en el dominio de x y se llevan a f ( x ) f(x)f ( x ) se calcula

Observe la posible tendencia de toda la función muestreando aleatoriamente algunos puntos de observación.

141

Paso 2: Cuando hay 4 observaciones, la distribución general de la función se puede adivinar de la siguiente manera, para encontrar el valor mínimo de la función.

142

Paso 3: Diferentes personas pueden tener diferentes conjeturas sobre la distribución general de la función, y los valores mínimos correspondientes bajo diferentes conjeturas también son diferentes.

143

Paso 4: Suponga que decenas de miles de personas adivinan la distribución general de la función y la curva adivinada por cada persona se muestra en la figura:

145

Análisis de la imagen: cerca del punto de observación (es decir, los cuatro puntos seleccionados al principio), no hay mucha diferencia en el valor de la función adivinado por todos, pero en un lugar alejado del punto del lado opuesto, el valor de la función adivinado por todos es muy inconsistente. **Debido a que la distribución de la función entre los puntos de observación es completamente desconocida, cuanto más lejos está la distribución del punto de observación, menos seguro es dónde está el valor real de la función,** por lo que el rango de valores de la función que la gente adivina es muy grande.

Paso 5: Calcule la media de todas las conjeturas y represente el área del valor de la función potencial alrededor de cualquier media con un bloque de color para obtener una curva promedio adivinada por todos.

146

El rango cubierto por el bloque de color son los límites superior e inferior del valor de la función adivinado por decenas de miles de personas en el Paso 4, cualquier xxCuanto mayor es la diferencia entre los límites superior e inferior correspondientes a x , más inseguras están las personas sobre el valor aproximado de esta posición en la función. La diferencia entre los límites superior e inferior puede medir la confianza de las personas en el punto de observación: cuanto mayor sea el rango del bloque de color, menor será la confianza.

Paso 6: agregue un punto de observación real donde la confianza sea muy baja y unifique las conjeturas de decenas de miles de personas. **

Debido a que la confianza siempre es alta alrededor del punto de observación y lejos del punto de observación, la confianza siempre es baja. Cuando se toma una observación real en un intervalo con baja confianza, la "suposición" alrededor del intervalo se concentrará inmediatamente. y el nivel de confianza en este intervalo aumentará significativamente. Por ejemplo x 6 x_6X6y x 7 x_7X7Estos dos nuevos puntos.

147

Cuando la confianza en toda la función es muy alta, se obtiene una línea con la verdadera f ( x ) f(x)Las curvas f ( x ) son muy similares a la curvaf ∗ f^*F , de modo que la curvaf ∗ f^*F El valor mínimo de entropía, como realf ( x ) f(x)El valor mínimo de f ( x ) (porque elf ( x ) f(x)distribución de funciones de f ( x ) )

Cuanto más precisa sea la estimación, f ∗ f^*F Cuanto más cerca def ( x ) f(x)f ( x ) , entoncesf ∗ f^*FEl valor mínimo de ∗ estará más cerca def ( x ) f(x)El verdadero mínimo de f ( x ) .

Cómo hacer f ∗ f^*F más cerca def ( x ) f(x)¿Qué pasa con f ( x ) ? Según el proceso de mejora de la confianza que acabamos de realizar, es obvio que cuantos más puntos de observación, más cerca estará la curva estimada de la realf ( x ) f (x)f ( x ) . Cada vez que se realiza una observación se debe elegir con mucho cuidado el punto de observación.

Paso 7: utilice el método apropiado para seleccionar puntos de observación

Hay muchos métodos, uno de los más simples es usar la frecuencia del valor mínimo para juzgar.

Dado que diferentes personas tienen diferentes conjeturas sobre la distribución general de la función, los valores mínimos correspondientes bajo diferentes conjeturas también son diferentes. Según los resultados de la función adivinados por cada persona, en XXEn el eje X , el intervalo del dominio se divide uniformemente en 100 intervalos pequeños. Si hay un valor mínimo estimado que cae en uno de los intervalos, se cuenta el intervalo. Después de que decenas de miles de personas hicieran conjeturas, también hicieron un dibujo basado enXX.En el gráfico de frecuencia de diferentes intervalos en el eje X, cuanto mayor es la frecuencia, más personas adivinan el valor mínimo en el intervalo y viceversa, menos personas adivinan el valor mínimo en el intervalo . La frecuencia refleja la probabilidad de que ocurra el valor mínimo hasta cierto punto. Cuanto mayor sea el intervalo de frecuencia, mayor será la probabilidad del verdadero valor mínimo de la función.

148

Paso 8: Determinar el siguiente punto de observación

¿Cuándo será XX?Una vez que el intervalo en el eje X se divide lo suficiente, el mapa de frecuencia dibujado se puede convertir en una curva de densidad de probabilidad, yel punto correspondiente al valor máximo de la curva es f ( x ) f(x)La probabilidad del valor mínimo de f ( x ) es la más alta , por lo que el punto correspondiente al valor máximo de la curva se confirma como el siguiente punto de observación.

149

Según la imagen, el intervalo más probable para el valor mínimo es de alrededor de x=0,7.

Paso 9: Repita este proceso continuamente

Después de realizar la observación en x=0,7, existen 5 observaciones conocidas. Luego, deje que decenas de miles de personas adivinen la distribución general de la función en función de 5 puntos de observación conocidos. Una vez completada la suposición, calcule el intervalo con la frecuencia más alta del valor mínimo actual y luego tome un nuevo par de puntos de observación f (x). f(x )Se calcula f ( x ) . Cuando se agota el número permitido de cálculos (por ejemplo, 500), se detiene toda la estimación.

En este proceso, de hecho, estamos optimizando constantemente la función objetivo f ( x ) f(x)Una estimación de f ( x ) , aunque no hay una estimación def ( x ) f(x)f ( x ) realiza cálculos en todos los dominios y no se encuentra que la determinación final deba serf ( x ) f(x)La curva de la distribución f ( x ) , pero a medida que se observan más y más puntos, la estimación de la función se vuelve cada vez más precisa, por lo que existe una posibilidad cada vez mayor de quef ( x ) f(x)El verdadero mínimo de f ( x ) . Este proceso de optimización es la optimización bayesiana.

150

2.3 Proceso de optimización bayesiano para HPO

Si comprende completamente el proceso anterior, será fácil comprender la definición del proceso de optimización bayesiana.

En el proceso matemático de optimización bayesiana, se realizan principalmente los siguientes pasos:

  1. Defina la función y el dominio de estimación: defina f ( x ) f(x) a estimarf ( x ) yxxdominio de x

    f(x) f(x)f ( x ) :

    Función estimada f ( x ) f(x)f ( x ) es una función de caja negra, es decir, solo se conocexxx yf ( x ) f(x)La relación correspondiente de f ( x ) , pero no conoce las leyes internas de la función en absoluto y no puede escribir expresiones específicas al mismo tiempo, lo que significa que su expresión explícita no se puede obtener en absoluto, y algunas funciones solo pueden puede obtenerse mediante experimentos u observaciones valor de la función en el punto.

    El dominio de definición de x:

    Generalmente de alta dimensión y puede ser continuo, discreto o mixto.

  2. Tomar observaciones: sacar limitado n xxValores en x , resuelve estos xxx corresponde af ( x ) f(x)f ( x ) (resolución de observaciones)

    Se pueden utilizar algunas heurísticas para elegir el punto inicial, como la selección aleatoria o experimentos con algún diseño (como el muestreo de hipercubo latino).

  3. Estimación de la función: basándose en observaciones limitadas, estime la función (este supuesto se denomina conocimiento previo en la optimización bayesiana) y obtenga la estimación f ∗ f^*F valor objetivo (máximo o mínimo)

    Modelo proxy probabilístico:

    Una herramienta para estimar la distribución de funciones basada en observaciones limitadas se llama modelo sustituto de probabilidad : después de todo, en los cálculos matemáticos, no es realmente posible invitar a decenas de miles de personas a conectar puntos de observación.

    Estos modelos probabilísticos proxy vienen con ciertos supuestos, y la distribución de la función objetivo f ∗ f^* se puede estimar en función de varios puntos de observación.F (incluyendof ∗ f^*F el valor de cada punto y el correspondiente nivel de confianza del punto). En el uso real, los modelos proxy probabilísticos suelen ser algoritmos poderosos, los más comunes como el proceso gaussiano, el modelo de mezcla gaussiana, etc. Los procesos gaussianos se utilizan a menudo en la derivación matemática tradicional, pero ahora las bibliotecas de optimización más populares básicamente utilizan el proceso TPE basado en el modelo de mezcla gaussiano de forma predeterminada. Por ejemplo, el proceso gaussiano es un método comúnmente utilizado porque puede proporcionar la media y la varianza del pronóstico, de modo que puede describir la incertidumbre del pronóstico.

  4. Definir algún tipo de regla para determinar el siguiente punto de observación a calcular

    Función de adquisición:

    Al determinar el siguiente punto de observación, generalmente se usa una estrategia de compensación, también conocida como función de adquisición (función de adquisición), la función de adquisición mide el ajuste del par de puntos de observación f ∗ f^ *F El impacto producido, y seleccionar el punto con mayor influencia para realizar el siguiente paso de observación, por lo que muchas veces se centran enel punto con mayor valor de la función de adquisición.

    Las funciones de adquisición más comunes son principalmente el incremento de probabilidad PI (probabilidad de mejora, como la frecuencia calculada), el incremento de expectativas (mejora de las expectativas), el límite superior de confianza (límite superior de confianza), la entropía de la información (entropía), etc. El delta esperado se utiliza de forma predeterminada en la mayoría de las bibliotecas de optimización.

  5. Actualizar modelo e iteración : cuando se obtienen nuevas observaciones, es necesario actualizar el modelo, recalcular la función de adquisición y determinar nuevamente el siguiente punto de observación. Este proceso se repetirá hasta que se alcance la condición de parada.

151

Esta imagen muestra todos los elementos básicos de la optimización bayesiana, el objetivo es dejar f ∗ f^* bajo la guía de la función de adquisición.F Lo más cerca posible def ( x ) f(x)f ( x ) . Según el modelo proxy de probabilidad, se obtiene la f estimadase obtienecada punto de**

Tres, la forma de lograr la optimización bayesiana

3.1 Bibliotecas de optimización de uso común

La optimización bayesiana utiliza diferentes modelos proxy y funciones de adquisición bajo el mismo modelo secuencial (el modelo secuencial es el proceso en la Sección 2.3, llamado optimización del modelo secuencial (SMBO), que es el método de optimización bayesiano más clásico), se pueden desarrollar algoritmos de optimización bayesianos más avanzados. Por lo tanto, casi cualquier biblioteca de herramientas profesionales para la optimización de hiperparámetros contendrá optimización bayesiana.

Descripción general de las herramientas HPO

Las siguientes son descripciones de algunas bibliotecas de uso común:

152

Este artículo presenta principalmente tres bibliotecas de uso común en ingeniería: bayesian-optimization, hyperopt,optuna

153

3.2 Optimización de GP basada en Bayes_opt

bayes-optimization es una de las primeras bibliotecas de optimización bayesiana de código abierto. Anteriormente era de código abierto y el código era simple, pero esto también conduce a una forma relativamente primitiva de procesar el espacio de parámetros en bayes-opt y carece de la eficiencia correspondiente. funciones de mejora/monitoreo. Computacionalmente exigente, por lo que a menudo no es la primera biblioteca de elección al optimizar.

La documentación oficial de bayes-optmization , puedes leerla si quieres saber más sobre sus funciones y principios básicos.

3.2.1 Proceso práctico

Paso 1: instale la biblioteca Bayes_opt

!pip install bayesian-optimization

imagen-20230712122331292

Paso 2: importar bibliotecas relacionadas

import pandas as pd
import numpy as np

import time
import os 

import sklearn
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import KFold, cross_validate

#优化器
from bayes_opt import BayesianOptimization

Paso 3: lea los datos o utilice los datos de predicción del precio de la vivienda de la plataforma Kaggle

data = pd.read_csv("../datasets/House Price/train_encode.csv",index_col=0)

X = data.iloc[:,:-1]
y = data.iloc[:,-1]

Los datos son los siguientes:

imagen-20230712122719519

Paso 4: construir la función objetivo

El valor de la función objetivo es f ( x ) f(x)El valor de f ( x ) . La optimización bayesiana calculaf ( x ) f(x)f ( x ) en diferentesxxObservaciones sobre x .

En el proceso HPO, el propósito es seleccionar la combinación de parámetros que maximice la capacidad de generalización del modelo, entonces f ( x ) f(x)f ( x ) debe ser el valor de validación cruzada de la función de pérdida o algún tipo de métrica de evaluación.

Cabe señalar que la biblioteca bayes_opt tiene tres reglas que afectan la definición de la función objetivo :

1. La entrada de la función objetivo debe ser hiperparámetros específicos, no todo el espacio de hiperparámetros, y mucho menos elementos distintos de los hiperparámetros, como datos y algoritmos, por lo que al definir la función objetivo, los hiperparámetros deben usarse como entrada del objetivo. función.

2. El valor de entrada de los hiperparámetros solo puede ser números de punto flotante y no se admiten números enteros ni cadenas . Cuando el parámetro real del algoritmo necesita ingresar una cadena, el parámetro no se puede ajustar usando bayes_opt. Cuando el parámetro real del algoritmo necesita ingresar un número entero, el tipo de parámetro debe especificarse en la función objetivo.
3. bayes_opt solo admite encontrar f ( x ) f(x)El valor máximo de f ( x ) , no permite encontrar el valor mínimo. Por lo tanto, cuando la función objetivo definida es algún tipo de pérdida, la salida de la función objetivo debe ser negativa (es decir, si se usa RMSE, la función objetivo debe generar un RMSE negativo, de modo que después de maximizar el RMSE negativo, el El RMSE real se minimiza. ), cuando la función objetivo definida es la precisión, o auc y otros indicadores, la salida de la función objetivo se puede mantener como está.

def bayesopt_objective(n_estimators,max_depth,max_features,min_impurity_decrease):
    
    #定义评估器
    #需要调整的超参数等于目标函数的输入,不需要调整的超参数则直接等于固定值
    #默认参数输入一定是浮点数,因此需要套上int函数处理成整数
    reg = RandomForestRegressor(n_estimators = int(n_estimators)
              ,max_depth = int(max_depth)
              ,max_features = int(max_features)
              ,min_impurity_decrease = min_impurity_decrease
              ,random_state=24
              ,verbose=False 
              ,n_jobs=-1)
    
    #定义损失的输出,5折交叉验证下的结果,输出负根均方误差(-RMSE)
    #注意,交叉验证需要使用数据,但不能让数据X,y成为目标函数的输入
    cv = KFold(n_splits=5,shuffle=True,random_state=24)
    validation_loss = cross_validate(reg,X,y
                                     ,scoring="neg_root_mean_squared_error"
                                     ,cv=cv
                                     ,verbose=False
                                     ,n_jobs=-1
                                     ,error_score='raise'
                                    )
    
    #交叉验证输出的评估指标是负根均方误差,因此本来就是负的损失
    #目标函数可直接输出该损失的均值
    return np.mean(validation_loss["test_score"])

Paso 5: definir el espacio de parámetros

En bayes_opt, se utiliza un diccionario para definir el espacio de parámetros, donde el nombre del parámetro es la clave y el rango de valores del parámetro es el valor.

param_grid_opt = {
    
    'n_estimators': (80,100)
                     , 'max_depth':(10,25)
                     , "max_features": (10,20)
                     , "min_impurity_decrease":(0,1)
                    }

Una habilidad operativa: bayes_opt solo admite completar los límites superior e inferior del espacio de parámetros, y no admite completar parámetros como el tamaño del paso, y bayes_opt tratará todos los parámetros como hiperparámetros continuos, por lo que bayes_opt eliminará directamente cualquier parámetro flotante. en el intervalo cerrado Puntos como parámetro opcional . Por ejemplo, tome 92,28 como valor de n_estimadores.

Paso 6: Definir el proceso específico de optimización de la función objetivo

Después de tener la función objetivo y el espacio de parámetros, se puede optimizar de acuerdo con las reglas de bayes_opt.

def param_bayes_opt(init_points,n_iter):
    
    #定义优化器,先实例化优化器
    opt = BayesianOptimization(bayesopt_objective #需要优化的目标函数
                               ,param_grid_opt #备选参数空间
                               ,random_state=24 
                              )
    
    #使用优化器,bayes_opt只支持最大化
    opt.maximize(init_points = init_points #抽取多少个初始观测值
                 , n_iter=n_iter #一共观测/迭代多少次
                )
    
    #优化完成,取出最佳参数与最佳分数
    params_best = opt.max["params"]
    score_best = opt.max["target"]
    
    #打印最佳参数与最佳分数
    print("\n","\n","best params: ", params_best,
          "\n","\n","best cvscore: ", score_best)
    
    #返回最佳参数与最佳分数
    return params_best, score_best

Paso 7: Definir la función de validación

La función de verificación es muy similar a la función objetivo, los parámetros de entrada o el espacio de hiperparámetros, y genera el resultado final de la función de pérdida.

def bayes_opt_validation(params_best):
    
    reg = RandomForestRegressor(n_estimators = int(params_best["n_estimators"]) 
              ,max_depth = int(params_best["max_depth"])
              ,max_features = int(params_best["max_features"])
              ,min_impurity_decrease = params_best["min_impurity_decrease"]
              ,random_state=24
              ,verbose=False
              ,n_jobs=-1)

    cv = KFold(n_splits=5,shuffle=True,random_state=1412)
    validation_loss = cross_validate(reg,X,y
                                     ,scoring="neg_root_mean_squared_error"
                                     ,cv=cv
                                     ,verbose=False
                                     ,n_jobs=-1
                                    )
    return np.mean(validation_loss["test_score"])

Paso 7: realizar operaciones de optimización

start = time.time()
#初始看10个观测值,后面迭代290次
params_best, score_best = param_bayes_opt(10,290) 
print('It takes %s minutes' % ((time.time() - start)/60))
validation_score = bayes_opt_validation(params_best)
print("\n","\n","validation_score: ",validation_score)

Mire los resultados de la ejecución:

imagen-20230712132511301

3.2.2 Comparación de efectos y ventajas y desventajas

Comparar con el efecto de búsqueda de cuadrícula:

154

En general: el efecto es superior en principio.

La optimización bayesiana basada en el proceso gaussiano determina la mejor puntuación 28373,962 en 3 m3 y puede obtener el mejor resultado en un tiempo cercano, lo que demuestra su superioridad en principio.

Pero debe tenerse en cuenta que la optimización bayesiana es aleatoria cada vez, por lo que el resultado de 28373.962 no se puede reproducir cuando el código se ejecuta varias veces. Si se ejecuta repetidamente, solo hay una pequeña probabilidad de que se pueda encontrar el valor más bajo nuevamente.

Por lo tanto, al realizar la optimización bayesiana, a menudo es necesario ejecutarla varias veces para observar los resultados encontrados por el modelo.

3.3 Optimización de TPE basada en HyperOpt

El optimizador Hyperopt es actualmente uno de los optimizadores bayesianos más generales, que integra varios algoritmos de optimización que incluyen búsqueda aleatoria, recocido simulado y TPE (enfoque de estimación Parzen estructurado en árbol). En comparación con Bayes_opt, Hyperopt es un optimizador más avanzado, más moderno y mejor mantenido, y también es el optimizador que utilizamos con más frecuencia para implementar métodos TPE.

En el uso real, en comparación con la optimización bayesiana basada en el proceso gaussiano, el TPE basado en el modelo de mezcla gaussiana puede obtener mejores resultados con mayor eficiencia en la mayoría de los casos. Este método también se usa ampliamente en el campo de AutoML.

Consulte aquí el principio del algoritmo TPE.

3.3.1 Proceso práctico

Paso 1: instale la biblioteca hyperopt

!pip install hyperopt

imagen-20230712133633626

Paso 2: importar bibliotecas relacionadas

import hyperopt
from hyperopt import hp, fmin, tpe, Trials, partial
from hyperopt.early_stop import no_progress_loss

Paso 3: lea los datos o utilice los datos de predicción del precio de la vivienda de la plataforma Kaggle

data = pd.read_csv("../datasets/House Price/train_encode.csv",index_col=0)

X = data.iloc[:,:-1]
y = data.iloc[:,-1]

Paso 4: construir la función objetivo

Al definir la función objetivo f ( x ) f(x)Cuando f ( x ) , como Bayes_opt, Hyperopt también tiene algunas reglas específicas que limitan nuestra definición, que incluyen principalmente:

1. La entrada de la función objetivo debe ser un diccionario que cumpla con las regulaciones de Hyperopt.

No puede ser un diccionario de espacio de parámetros similar a sklearn, no puede ser el parámetro en sí y no pueden ser elementos distintos de hiperparámetros, como datos y algoritmos. Por lo tanto, al personalizar la función objetivo, es necesario utilizar el diccionario espacial de hiperparámetros como entrada de la función objetivo.

2. Hyperopt solo admite encontrar f ( x ) f(x)El valor mínimo de f ( x ) no permite encontrar el valor máximo, por lo que cuando la función objetivo definida es un índice de evaluación positivo (como la tasa de precisión, auc), el índice de evaluación debe ser negativo. Si la función objetivo definida es una pérdida negativa, también es necesario tomar el valor absoluto de la pérdida negativa. No hay necesidad de cambiar la salida si y sólo si la función objetivo definida es una pérdida normal.

def hyperopt_objective(params):
    
    #定义评估器
    #需要搜索的参数需要从输入的字典中索引出来
    #不需要搜索的参数,可以是设置好的某个值
    #在需要整数的参数前调整参数类型
    reg = RandomForestRegressor(n_estimators = int(params["n_estimators"])
              ,max_depth = int(params["max_depth"])
              ,max_features = int(params["max_features"])
              ,min_impurity_decrease = params["min_impurity_decrease"]
              ,random_state=24
              ,verbose=False
              ,n_jobs=-1)
    
    #交叉验证结果,输出负根均方误差(-RMSE)
    cv = KFold(n_splits=5,shuffle=True,random_state=1412)
    validation_loss = cross_validate(reg,X,y
                                     ,scoring="neg_root_mean_squared_error"
                                     ,cv=cv
                                     ,verbose=False
                                     ,n_jobs=-1
                                     ,error_score='raise'
                                    )
    
    #最终输出结果,由于只能取最小值,所以必须对(-RMSE)求绝对值
    #以求解最小RMSE所对应的参数组合
    return np.mean(abs(validation_loss["test_score"]))

Paso 5: definir el espacio de parámetros

En Hyperopt, es necesario utilizar un formulario de diccionario especial para definir el espacio de parámetros, en el que la clave del par clave-valor se puede establecer arbitrariamente, siempre que sea coherente con la clave del parámetro de índice en la función objetivo. y el valor del par clave-valor es exclusivo de la función hyperopt hp, que incluye:

hp.quniform("nombre del parámetro", límite inferior, límite superior, tamaño de paso) : se aplica a flotantes con distribución uniforme

hp.uniform("nombre del parámetro", límite inferior, límite superior) : se aplica a la distribución aleatoria de flotantes

hp.randint("nombre del parámetro", límite superior) : un número entero adecuado para [0, límite superior), el intervalo está cerrado al frente y abierto hacia atrás

hp.choice("nombre del parámetro",["cadena1", "cadena2",...]) - para el tipo de cadena, el parámetro óptimo está representado por el índice

hp.choice("nombre del parámetro",[*rango(límite inferior, límite superior, tamaño del paso)]) - adecuado para tipos enteros, el parámetro óptimo está representado por el índice

hp.choice("nombre del parámetro", [Integer 1, Integer 2, Integer 3,...]) - adecuado para el tipo entero, el parámetro óptimo está representado por el índice

hp.choice("nombre del parámetro",["cadena1", entero1,...]) - adecuado para caracteres mixtos y números enteros, el parámetro óptimo está representado por el índice

Todos los métodos de definición del espacio de parámetros en Hyperopt deben ser intervalos de cierre frontal y apertura posterior.

param_grid_hp = {
    
    'n_estimators': hp.quniform("n_estimators",80,100,1)
                     , 'max_depth': hp.quniform("max_depth",10,25,1)
                     , "max_features": hp.quniform("max_features",10,20,1)
                     , "min_impurity_decrease":hp.quniform("min_impurity_decrease",0,5,1)
                    }

Paso 6: Definir el proceso específico de optimización de la función objetivo

Con la función objetivo y el espacio de parámetros, el siguiente paso es optimizar, necesita conocer los siguientes parámetros:

  • fmin: modelo de proxy personalizado (parámetros algo), hay tpe.suggestdos rand.suggestopciones, la primera se refiere al método TPE, la segunda se refiere al método de búsqueda de cuadrícula aleatoria
  • parcial: los parámetros específicos involucrados en el algoritmo de modificación de potencia, incluida cuántas observaciones iniciales (parámetros) utiliza el modelo y cuántas muestras (parámetros ) n_start_jobsse consideran al calcular el valor de la función de adquisición.n_EI_candidates
  • pruebas: registre todo el proceso iterativo, el método Trials () importado de la biblioteca hyperopt, una vez completada la optimización, puede ver diversa información intermedia, como pérdidas y parámetros de las pruebas guardadas.
  • early_stop_fn: parámetro de parada anticipada, el método no_progress_loss() importado de la biblioteca hyperopt, puede ingresar un número específico n, lo que significa que cuando la pérdida no disminuye durante n veces consecutivas, deja que el algoritmo se detenga temprano
def param_hyperopt(max_evals=100):
    
    #保存迭代过程
    trials = Trials()
    
    #设置提前停止
    early_stop_fn = no_progress_loss(100)
    
    #定义代理模型
    #algo = partial(tpe.suggest, n_startup_jobs=20, n_EI_candidates=50)
    params_best = fmin(hyperopt_objective #目标函数
                       , space = param_grid_hp #参数空间
                       , algo = tpe.suggest #代理模型
                       #, algo = algo
                       , max_evals = max_evals #允许的迭代次数
                       , verbose=True
                       , trials = trials
                       , early_stop_fn = early_stop_fn
                      )
    
    #打印最优参数,fmin会自动打印最佳分数
    print("\n","\n","best params: ", params_best,
          "\n")
    return params_best, trials

Paso 7: Definir la función de validación

La función de verificación es muy similar a la función objetivo, los parámetros de entrada o el espacio de hiperparámetros, y genera el resultado final de la función de pérdida.

def hyperopt_validation(params):    
    reg = RandomForestRegressor(n_estimators = int(params["n_estimators"])
              ,max_depth = int(params["max_depth"])
              ,max_features = int(params["max_features"])
              ,min_impurity_decrease = params["min_impurity_decrease"]
              ,random_state=24
              ,verbose=False
              ,n_jobs=-1
             )
    cv = KFold(n_splits=5,shuffle=True,random_state=24)
    validation_loss = cross_validate(reg,X,y
                                     ,scoring="neg_root_mean_squared_error"
                                     ,cv=cv
                                     ,verbose=False
                                     ,n_jobs=-1
                                    )
    return np.mean(abs(validation_loss["test_score"]))

Paso 7: realizar operaciones de optimización

import time

def optimized_param_search_and_report(num_evals):
    start_time = time.time()

    # 进行贝叶斯优化
    params_best, trials = param_hyperopt(num_evals)

    # 打印最佳参数验证结果
    hyperopt_validation(params_best)

    # 打印所有搜索相关的记录
    print("All search records:")
    print(trials.trials[0])


    end_time = time.time()
    elapsed_time = (end_time - start_time) / 60  # 转换为分钟
    print(f"Optimization completed in 0.0708 minutes.")

# 执行优化
optimized_param_search_and_report(300)

Mire los resultados de la ejecución:

imagen-20230712140814266

3.3.2 Comparación de efectos y ventajas y desventajas

Comparar con el efecto de búsqueda de cuadrícula:

155

En general: el método TPE es más rápido que el cálculo del proceso gaussiano y Hyperopt puede obtener el mejor efecto integral en menos de 1 minuto.

Sin embargo, la desventaja de HyperOpt es que el código requiere alta precisión y poca flexibilidad. Un ligero cambio puede hacer que el código informe errores locos y dificulte su ejecución.

3.4 Implementación basada en Optuna

Optuna es, con diferencia, el marco de optimización de hiperparámetros más maduro y escalable, especialmente diseñado para el aprendizaje automático y el aprendizaje profundo. Para satisfacer las necesidades de los desarrolladores de aprendizaje automático, Optuna tiene una API potente y fija, por lo que el código de Optuna es simple y altamente modularizado.

Optuna se puede conectar perfectamente a marcos de aprendizaje profundo como PyTorch y Tensorflow, y también se puede usar en combinación con la biblioteca de optimización scikit-optimize de sklearn, por lo que Optuna se puede usar en varios escenarios de optimización.

Consulte la documentación oficial de Optuna aquí .

3.4.1 Proceso práctico

Paso 1: instale la biblioteca hyperopt

!pip install optuna

imagen-20230712141412943

Paso 2: importar bibliotecas relacionadas

import optuna

Paso 3: lea los datos o utilice los datos de predicción del precio de la vivienda de la plataforma Kaggle

data = pd.read_csv("../datasets/House Price/train_encode.csv",index_col=0)

X = data.iloc[:,:-1]
y = data.iloc[:,-1]

Paso 4: construir la función objetivo y definir el espacio de parámetros

En Optuna, en lugar de ingresar parámetros o espacio de parámetros en la función objetivo, el espacio de parámetros debe definirse directamente en la función objetivo . El optimizador de Optuna generará una prueba variable que se refiere a un parámetro alternativo. Esta variable no puede ser obtenida ni abierta por el usuario, pero esta variable sobrevive en el optimizador y se ingresa en la función objetivo. En la función objetivo, el espacio de parámetros se puede construir mediante el método que lleva el rastro de la variable.

def optuna_objective(trial):
    
    #定义参数空间
    n_estimators = trial.suggest_int("n_estimators",80,100,1) #整数型,(参数名称,下界,上界,步长)
    max_depth = trial.suggest_int("max_depth",10,25,1)
    max_features = trial.suggest_int("max_features",10,20,1)
    min_impurity_decrease = trial.suggest_int("min_impurity_decrease",0,5,1)
    
    #定义评估器
    #需要优化的参数由上述参数空间决定
    #不需要优化的参数则直接填写具体值
    reg = RandomForestRegressor(n_estimators = n_estimators
              ,max_depth = max_depth
              ,max_features = max_features
              ,min_impurity_decrease = min_impurity_decrease
              ,random_state=24
              ,verbose=False
              ,n_jobs=-1
             )
    
    #交叉验证过程,输出负均方根误差(-RMSE)
    #optuna同时支持最大化和最小化,因此如果输出-RMSE,则选择最大化
    #如果选择输出RMSE,则选择最小化
    cv = KFold(n_splits=5,shuffle=True,random_state=24)
    validation_loss = cross_validate(reg,X,y
                                     ,scoring="neg_root_mean_squared_error"
                                     ,cv=cv #交叉验证模式
                                     ,verbose=False #是否打印进程
                                     ,n_jobs=-1 #线程数
                                     ,error_score='raise'
                                    )
    #最终输出RMSE
    return np.mean(abs(validation_loss["test_score"]))

Paso 5: Definir el proceso específico de optimización de la función objetivo

En el módulo de muestra de Optuna, puede definir algoritmos alternativos, incluida la optimización de mi TPE, la búsqueda de cuadrícula aleatoria y otros procesos bayesianos más avanzados. Para las clases llamadas en Optuna.sampler, puede ingresar parámetros directamente para establecer el número inicial de observaciones. y la cantidad de observaciones consideradas cada vez que se calcula la función de adquisición.

def optimizer_optuna(n_trials, algo):
    
    #定义使用TPE或者GP
    if algo == "TPE":
        algo = optuna.samplers.TPESampler(n_startup_trials = 15, n_ei_candidates = 20)
    elif algo == "GP":
        from optuna.integration import SkoptSampler
        import skopt
        algo = SkoptSampler(skopt_kwargs={'base_estimator':'GP', #选择高斯过程
                                          'n_initial_points':30, #初始观测点10个
                                          'acq_func':'EI'} #选择的采集函数为EI,期望增量
                           )
    
    #实际优化过程,首先实例化优化器
    study = optuna.create_study(sampler = algo #要使用的具体算法
                                , direction="minimize" #优化的方向,可以填写minimize或maximize
                               )
    #开始优化,n_trials为允许的最大迭代次数
    #由于参数空间已经在目标函数中定义好,因此不需要输入参数空间
    study.optimize(optuna_objective #目标函数
                   , n_trials=n_trials #最大迭代次数(包括最初的观测值的)
                   , show_progress_bar=True #要不要展示进度条呀?
                  )
    
    #可直接从优化好的对象study中调用优化的结果
    #打印最佳参数与最佳损失值
    print("\n","\n","best params: ", study.best_trial.params,
          "\n","\n","best score: ", study.best_trial.values,
          "\n")
    
    return study.best_trial.params, study.best_trial.values

Paso 6: realizar operaciones de optimización

import time

def optimized_optuna_search_and_report(n_trials, algo):
    start_time = time.time()

    # 进行贝叶斯优化
    best_params, best_score = optimizer_optuna(n_trials, algo)

    # 打印最佳参数和分数
    print("\n","\n","best params: ", best_params,
          "\n","\n","best score: ", best_score,
          "\n")

    end_time = time.time()
    elapsed_time = (end_time - start_time) / 60  # 转换为分钟
    print(f"Optimization completed in 0.0708 minutes.")

    return best_params, best_score

# 执行优化
best_params, best_score = optimized_optuna_search_and_report(300, "TPE")

Mire los resultados de la ejecución:

imagen-20230712143547212

3.4.2 Comparación de efectos y ventajas y desventajas

Comparar con el efecto de búsqueda de cuadrícula:

156

Evidentemente, consigue los mejores resultados en un corto periodo de tiempo.

Todos pueden depurar por sí mismos.

Cuarto.Conclusión

Este artículo explica el contenido de alto nivel de la optimización de hiperparámetros: los principios y procesos básicos de la optimización bayesiana, y ofrece demostraciones prácticas de tres bibliotecas de optimización bayesianas principales: Bayes_opt, HyperOpt y Optuna. Espero aprobar este artículo, todos pueden entender realmente cómo La optimización bayesiana funciona y cómo usarla para encontrar el valor mínimo de una función, y aprenda cómo aplicar realmente la optimización bayesiana en tareas de optimización de hiperparámetros.

Finalmente, ¡gracias por leer este artículo! Si sientes que has ganado algo, no olvides darle me gusta, marcarlo y seguirme, esta es la motivación para mi creación continua. Si tiene alguna pregunta o sugerencia, puede dejar un mensaje en el área de comentarios, haré todo lo posible para responder y aceptar sus comentarios. Si hay un tema en particular que le gustaría conocer, hágamelo saber y estaré encantado de escribir un artículo al respecto. ¡Gracias por su apoyo y esperamos crecer con usted!

Supongo que te gusta

Origin blog.csdn.net/Lvbaby_/article/details/131681795
Recomendado
Clasificación