Optimización de hiperparámetros: búsqueda de media cuadrícula HalvingSearchCV

        

Tabla de contenido

1. Principios básicos de la búsqueda en media cuadrícula.

2. Limitaciones de la búsqueda en media cuadrícula

3. Reducir a la mitadGridSearchCV类

4. Implementación de la búsqueda de media cuadrícula

5. Implementación de búsqueda de cuadrícula aleatoria.


        En la búsqueda de cuadrícula estocástica anterior, aprendimos sobre los factores que determinan la velocidad de las operaciones de búsqueda de cuadrícula de enumeración: ① El tamaño del espacio de parámetros : cuanto mayor es el espacio de parámetros, más modelado se necesita; ② El tamaño del volumen de datos : la cantidad de datos Cuanto mayor sea el valor, más potencia de cálculo y tiempo se requerirá para cada operación de modelado. Ante el problema de una búsqueda en la cuadrícula de enumeración demasiado lenta, sklearn presenta dos métodos de optimización: uno es ajustar el espacio de búsqueda y el otro es ajustar los datos de cada entrenamiento . El método para ajustar el espacio de búsqueda es la búsqueda en cuadrícula aleatoria y el método para ajustar cada dato de entrenamiento es la búsqueda en media cuadrícula.

1. Principios básicos de la búsqueda en media cuadrícula.

        Supongamos que hay un conjunto de datos Dy tomamos muestras aleatorias de un subconjunto del Dconjunto d. Si un conjunto de parámetros funciona mal en todo el conjunto de datos , existe una alta probabilidad de que este conjunto de parámetros no funcione bien en Dun subconjunto del conjunto de datos . dPor el contrario, si un conjunto de parámetros no funciona bien en un subconjunto d, no confiaremos Den el rendimiento de este conjunto de parámetros en el conjunto de datos completo. El rendimiento de los parámetros retroalimentados en el subconjunto y el conjunto de datos completo es consistente . Si esta suposición es cierta, entonces en la búsqueda de cuadrícula, en lugar de usar todos los datos para verificar un conjunto de parámetros cada vez, tal vez podamos considerar solo traerlos. en el entrenamiento Utilice un subconjunto de datos para filtrar hiperparámetros, lo que puede acelerar enormemente las operaciones.

        Sin embargo, en datos reales, esta suposición es condicional, es decir, la distribución de cualquier subconjunto es similar a la distribución del conjunto de datos completo D. Cuando la distribución del subconjunto se acerca más a la distribución del conjunto de datos completo, es más probable que el rendimiento del mismo conjunto de parámetros en el subconjunto y en el conjunto de datos completo sea consistente. De acuerdo con las conclusiones anteriores extraídas de la búsqueda de cuadrícula aleatoria, sabemos que cuanto más grande es el subconjunto, más cercana está su distribución a la distribución del conjunto de datos completo, pero los subconjuntos grandes conducirán a un tiempo de entrenamiento más largo, por lo que para la eficiencia general del entrenamiento, nosotros No es posible aumentar el subconjunto infinitamente. Esto crea una paradoja: los resultados en subconjuntos grandes son más confiables, pero los cálculos en subconjuntos grandes son más lentos. El algoritmo de búsqueda de semi-cuadrícula ha diseñado un proceso exquisito que puede equilibrar el tamaño del subconjunto y la eficiencia computacional. El proceso específico es el siguiente:

① Primero, tome una muestra aleatoria de un pequeño subconjunto del conjunto de datos completo sin reemplazo d_ {0}y d_ {0}verifique el rendimiento de todas las combinaciones de parámetros en. Según d_ {0}los resultados de la verificación anterior, se eliminará la mitad de las combinaciones de parámetros con la puntuación más baja en la mitad inferior.

② Luego, tome una muestra de un d_ {0}subconjunto dos veces más grande del conjunto de datos completo sin reemplazo d_ {1}y d_ {1}verifique el rendimiento de la mitad restante de las combinaciones de parámetros. Según d_ {1}los resultados de la verificación anterior, se eliminarán las combinaciones de parámetros con la mitad de puntuación más baja.

③ Luego, muestree un d_ {1}subconjunto dos veces más grande del conjunto de datos completo sin reemplazo d_ {2}y d_ {2}verifique el rendimiento de las combinaciones de 1/4 de parámetros restantes. De acuerdo con d_ {2}los resultados de la verificación anterior, las combinaciones de parámetros con la puntuación media más baja serán eliminadas...

Ciclo continuo. Si S representa el tamaño de muestra del subconjunto en la primera iteración y C representa el número de todas las combinaciones de parámetros, durante el proceso de iteración, el subconjunto de datos utilizado para verificar los parámetros se vuelve cada vez más grande y el número de combinaciones de parámetros que necesitan a verificar es Cada vez más:

Número de iteraciones tamaño de muestra del subconjunto Número de combinaciones de parámetros
1 S C
2 2S 1212C
3 4S 1414C
4 8S 1818C
……  Cuando C no puede ser divisible, redondea hacia arriba

        El ciclo se detendrá cuando solo quede un conjunto de combinaciones de parámetros alternativos o no haya suficientes datos disponibles. Específicamente, la búsqueda \frac{1}{n}C\leqslant 1se detendrá cuando o nS > el tamaño total de la muestra. En aplicaciones reales, la condición de parada que se activará primero depende del tamaño de la muestra real y del tamaño del espacio de parámetros. Al mismo tiempo, el tamaño de muestra creciente en cada iteración y la combinación de parámetros decrecientes en cada iteración se pueden establecer libremente.

        En este modo, solo las combinaciones de parámetros que obtienen continuamente excelentes resultados en diferentes subconjuntos se pueden retener hasta las últimas etapas de la iteración, y la combinación de parámetros finalmente seleccionada debe ser la combinación de parámetros que funcione bien en todos los subconjuntos. Es muy probable que dicha combinación de parámetros funcione bien en todos los datos y también pueda exhibir una mayor capacidad de generalización que los parámetros obtenidos mediante búsqueda en cuadrícula/aleatoria.

2. Limitaciones de la búsqueda en media cuadrícula

        Cuando el subconjunto es más grande, la distribución del subconjunto y el conjunto de datos completo D serán más similares. Sin embargo, al comienzo de todo el algoritmo de búsqueda de la mitad, el subconjunto más pequeño se utiliza para filtrar la mayoría de las combinaciones de parámetros. Si la distribución del subconjunto inicial es significativamente diferente de la del conjunto de datos completo, en las primeras iteraciones de la búsqueda de media cuadrícula, muchos parámetros que son válidos para el conjunto de datos completo D pueden filtrarse, por lo que la mitad inicial -búsqueda de cuadrícula El subconjunto no debe ser demasiado pequeño.

Durante el proceso de búsqueda de media cuadrícula, el tamaño de la muestra del subconjunto crece exponencialmente:

n = 10
for i in range(15):
    print(i,n*3**i)
0 10 
1 30 
2 90 
3 
270 
4 810 
5 2430 6 7290 
7 21870 
8 65610 
9 196830 
10 590490 
11 1771470 
12 53144410 
13 15943230 
14 47829690

Partiendo de la premisa de que el tamaño de muestra del subconjunto inicial es de 10, 7 u 8 iteraciones, se consumirán más de 2500 recursos de datos. Bajo la premisa de que el subconjunto inicial no debe ser demasiado pequeño y que el muestreo de la media búsqueda es un muestreo sin reemplazo, el tamaño de la muestra de los datos generales debe ser grande. Empíricamente, la búsqueda en media cuadrícula tiende a funcionar peor que la búsqueda en cuadrícula aleatoria y la búsqueda en cuadrícula ordinaria en conjuntos de datos pequeños, y el tiempo de búsqueda es más largo. Pero en conjuntos de datos grandes (por ejemplo, en conjuntos de datos con un tamaño de muestra superior a w), la búsqueda en media cuadrícula muestra enormes ventajas en la velocidad y precisión de la computación.

3. Reducir a la mitadGridSearchCV类

        En sklearn, utilice la clase HalvingGridSearchCV para implementar la búsqueda de media cuadrícula. Al importar esta clase, también debe importar la función auxiliar enable_halving_search_cv para habilitar la búsqueda en media cuadrícula. HalvingGridSearchCV se puede importar y utilizar si y sólo si se importa esta función.

clase sklearn.model_selection.HalvingGridSearchCV (estimador, param_grid, *, factor=3, recurso='n_samples', max_resources='auto', min_resources='exhaust', agresivo_elimination=False, cv=5, scoring=Ninguno, refit=True, error_score=nan, return_train_score=Verdadero, random_state=Ninguno, n_jobs=Ninguno, detallado=0)

Todos los parámetros son los siguientes:

Nombre Descripción
estimador Objeto de ajuste de parámetros, un evaluador.
param_grid Espacio de parámetros, que puede ser un diccionario o una lista de diccionarios.
factor La proporción del nuevo tamaño de muestra en cada iteración es también la proporción de combinaciones de parámetros que quedan después de cada iteración.
recurso Establecer el tipo de recursos de verificación agregados en cada iteración.
recursos_max El tamaño de muestra máximo permitido para verificar cualquier combinación de parámetros en una iteración.
recursos_min El tamaño de muestra r0 utilizado para verificar la combinación de parámetros en la primera iteración.
eliminación_agresiva Si se utiliza el número completo se utiliza como indicador para detener la búsqueda, si no, tomar medidas.
CV Pliegues de validación cruzada
puntuación Indicadores de evaluación, que respaldan la salida de múltiples parámetros al mismo tiempo.
repararse Elija métricas de evaluación y parámetros óptimos y capacítese con el conjunto de datos completo
puntuación_error Cuando la búsqueda en la cuadrícula informa un error, se devuelve el resultado. Cuando se selecciona "aumentar", el error se informará directamente y se interrumpirá el proceso de entrenamiento. En otros casos, se mostrará un mensaje de advertencia
y el entrenamiento continuará. ser completado.
puntuación_retorno_tren Si se muestran puntuaciones de parámetros en el conjunto de entrenamiento en validación cruzada
estado_aleatorio Controlar la aleatoriedad de conjuntos de datos muestreados aleatoriamente
n_trabajos Establecer el número de subprocesos que participan en los cálculos durante el trabajo.
verboso Formato del registro de trabajo de salida

▶  factor

        La proporción del nuevo tamaño de muestra en cada iteración es también la proporción de combinaciones de parámetros que quedan después de cada iteración. Por ejemplo, cuando factor = 2, el tamaño de la muestra de la siguiente iteración será el doble que el de la ronda anterior y la mitad de las combinaciones de parámetros quedarán después de cada iteración. Si factor = 3, el tamaño de la muestra de la siguiente iteración será tres veces mayor que el de la ronda anterior y quedará 1/3 de las combinaciones de parámetros después de cada iteración. Este parámetro normalmente funciona mejor cuando se establece en 3.

▶  recurso

        Establezca el tipo de recursos de verificación agregados en cada iteración, introdúzcalos como una cadena. El valor predeterminado es el tamaño de la muestra y la entrada es "n_samples". También puede ser un clasificador débil con una entrada entera positiva en cualquier algoritmo de conjunto, como "n_estimators" o "n_iteration".

▶  recurso_mínimo

        El tamaño de muestra r0 utilizado para verificar la combinación de parámetros en la primera iteración. Puede ingresar un número entero positivo o dos cadenas "más pequeña" y "escape".

① Ingrese un número entero positivo n, lo que indica que se utilizan n muestras en la primera iteración.

② Ingrese "más pequeño", luego r0 se calcula de acuerdo con las reglas: cuando el tipo de recurso es el tamaño de la muestra, para el algoritmo de regresión, r0 = doblez de validación cruzada n_splits * 2; cuando el tipo de recurso es el tamaño de la muestra, para el algoritmo de clasificación, r0 = Número de categoría n_classes_ * Doblez de validación cruzada n_splits * 2; igual a 1 cuando el tipo de recurso no es el tamaño de la muestra.

③ Ingrese "exhaust" para hacer la regresión r0 según los recursos máximos disponibles en la última ronda de iteración. Por ejemplo, cuando factor = 2, el tamaño de la muestra es 1000 y hay 3 iteraciones en total, los recursos máximos disponibles en la última ronda de iteraciones son 1000, la penúltima ronda es 500 y la antepenúltima ronda ( primera ronda) es 250. En este momento r0 = 250. Es más probable que el modo "Escape" obtenga buenos resultados, pero la cantidad de cálculo será un poco mayor y el tiempo de cálculo será un poco más largo.

▶  eliminación_agresiva

        Introduzca un valor booleano, por defecto Falso. Este parámetro se puede activar cuando el tamaño total de la muestra de los datos es demasiado pequeño para soportar el ciclo hasta que solo quede el último conjunto de parámetros alternativos. Cuando el parámetro se establece en Verdadero, el tamaño de la muestra de la primera iteración se reutilizará hasta que los datos restantes sean suficientes para respaldar el aumento en el tamaño de la muestra hasta que solo quede el último conjunto de parámetros alternativos. Cuando el parámetro se establece en False, todas las muestras se utilizan como indicador de que finaliza la búsqueda.

4. Implementación de la búsqueda de media cuadrícula

import re
import sklearn
import numpy as np
import pandas as pd
import matplotlib as mlp
import matplotlib.pyplot as plt
import time
from sklearn.ensemble import RandomForestRegressor as RFR
from sklearn.experimental import enable_halving_search_cv
from sklearn.model_selection import KFold, HalvingGridSearchCV, cross_validate, RandomizedSearchCV

data=pd.read_csv('F:\\Jupyter Files\\机器学习进阶\\datasets\\House Price\\big_train.csv',encoding='utf-8')
data.drop('Unnamed: 0', axis=1, inplace=True)
X=data.iloc[:,:-1]
y=data.iloc[:,-1]

param_grid_simple = {"criterion": ["squared_error","poisson"]
                     , 'n_estimators': [*range(20,100,5)]
                     , 'max_depth': [*range(10,25,2)]
                     , "max_features": ["log2","sqrt",16,32,64,"auto"]
                     , "min_impurity_decrease": [*np.arange(0,5,10)]
                    }
# 定义函数
#评估指标RMSE
def RMSE(cvresult,key):
    return (abs(cvresult[key])**0.5).mean()

#计算参数空间大小
def count_space(param):
    no_option = 1
    for i in param_grid_simple:
        no_option *= len(param_grid_simple[i])
    print(no_option)
    
#在最优参数上进行重新建模验证结果
def rebuild_on_best_param(ad_reg):
    cv = KFold(n_splits=5,shuffle=True,random_state=1412)
    result_post_adjusted = cross_validate(ad_reg,X,y,cv=cv,scoring="neg_mean_squared_error"
                                          ,return_train_score=True
                                          ,verbose=True)
    print("训练RMSE:{:.3f}".format(RMSE(result_post_adjusted,"train_score")))
    print("测试RMSE:{:.3f}".format(RMSE(result_post_adjusted,"test_score")))
count_space(param_grid_simple)
1536
X.shape
(29062, 80)

¿Qué condición de parada se activará?

#2.9w个样本在factor=2, min_resource = 100的情况下可以迭代多久?
for i in range(100):
    if 100*2**i > 29062:
        break
    print(i+1,100*2**i)
1 100 
2 200 
3 400 
4 800 
5 1600 
6 3200 
7 6400 
8 12800 
9 25600
#1536种参数组合在factor=2的情况下可以迭代多久?
for i in range(100):
    if 1536//2**i < 1:
        break
    print(i+1,int(1536//2**i+1)) #向上取整
1 1537 
2 769 
3 385 
4 193 
5 97 
6 49 
7 25 
8 13 
9 
7 10 4 
11 2

No es difícil encontrar que cuando el factor = 2, la condición de conjunto de datos insuficiente se activará primero y solo se puede iterar hasta 9 veces. En otras palabras, eventualmente seleccionaremos el conjunto de parámetros con mejor rendimiento entre los 7 conjuntos de parámetros, en lugar de dejar que la búsqueda continúe hasta que encontremos el único parámetro óptimo.

        Para las aplicaciones de búsqueda semicuadrícula, la parte más difícil es decidir la combinación compleja de parámetros para la búsqueda en sí. Al ajustar los parámetros, si esperamos que todas las combinaciones alternativas en el espacio de parámetros puedan verificarse completamente, el número de iteraciones no puede ser demasiado pequeño (por ejemplo, solo 3 iteraciones), por lo que el factor no puede ser demasiado grande. Pero si el factor es demasiado pequeño, aumentará el número de iteraciones y se alargará el tiempo de ejecución de toda la búsqueda. Al mismo tiempo, la cantidad de iteraciones también afectará la cantidad de datos que finalmente podremos usar, así como la cantidad de combinaciones de parámetros que debemos verificar después de completar las iteraciones, ninguna de las cuales puede ser demasiado pequeña. Por lo tanto, cuando generalmente utilizamos la búsqueda de media cuadrícula, debemos considerar los siguientes tres puntos:

① El valor de min_resources no puede ser demasiado pequeño y esperamos utilizar la mayor cantidad de datos posible antes de que finalice todo el proceso de iteración.
② Una vez completada la iteración, las combinaciones de parámetros de verificación restantes no deben ser demasiadas. Por debajo de 10 es lo mejor. Si no es posible, entonces 30 o menos también es aceptable.
③ El número de iteraciones no puede ser demasiado, de lo contrario el tiempo puede ser demasiado largo.

factor = 1.5
n_samples = X.shape[0]
min_resources = 500
space = 1536
for i in range(100):
    if (min_resources*factor**i > n_samples) or (space/factor**i < 1):
        break
    print(i+1,"本轮迭代样本:{}".format(min_resources*factor**i)
          ,"本轮验证参数组合:{}".format(space//factor**i + 1))
1 Esta ronda de muestras de iteración: 500,0 Esta ronda de combinación de parámetros de verificación: 1537,0 
2 Esta ronda de muestras de iteración: 750,0 Esta ronda de combinación de parámetros de verificación: 1025,0 
3 Esta ronda de muestras de iteración: 1125,0 Esta ronda de combinación de parámetros de verificación: 683,0 
4 Esta ronda de muestras de iteración: 1687.5 Combinación de parámetros de verificación de esta ronda: 456.0 
5 Muestras de iteración de esta ronda: 2531.25 Combinación de parámetros de verificación de esta ronda: 304.0 
6 Muestra de iteración de esta ronda: 3796.875 Combinación de parámetros de verificación de esta ronda: 203.0 
7 Muestras de iteración de esta ronda: 5695.3125 Combinación de parámetros de verificación de esta ronda: 135.0 
8 Muestras de iteración de esta ronda: 8542.96875 Combinación de parámetros de verificación de esta ronda: 90.0 
9 Muestra de iteración de esta ronda: 12814.453125 Combinación de parámetros de verificación de esta ronda: 60.0 
10 Muestra de iteración de esta ronda : 19221.6796875 Combinación de parámetros de verificación de esta ronda: 40.0 
11 Muestra de iteración de esta ronda: 28832.51953125 Verificación de esta ronda Combinación de parámetros: 27.0
#建立回归器、交叉验证
reg = RFR(random_state=1412,verbose=True)
cv = KFold(n_splits=5,shuffle=True,random_state=1412)

#定义对半搜索
search = HalvingGridSearchCV(estimator=reg
                            ,param_grid=param_grid_simple
                            ,factor=1.5
                            ,min_resources=500
                            ,scoring = "neg_mean_squared_error"
                            ,verbose = True
                            ,random_state=1412
                            ,cv = cv)
#训练对半搜索评估器
#=====【TIME WARNING】=====#
start = time.time()
search.fit(X,y)
end = time.time() - start
print(end/60)
#查看最佳评估器
search.best_estimator_
RandomForestRegressor(max_profundidad=22, max_features=16, min_impurity_decrease=0, 
                      n_estimators=90, n_jobs=-1, random_state=1412, 
                      detallado=True)
abs(search.best_score_)**0.5
1068.281607238587
rebuild_on_best_param(search.best_estimator_)
RMSE de formación: 475.740 
RMSE de pruebas: 1082.916

5. Implementación de búsqueda de cuadrícula aleatoria.

param_grid_simple = {"criterion": ["squared_error","poisson"]
                     , 'n_estimators': [*range(20,100,5)]
                     , 'max_depth': [*range(10,25,2)]
                     , "max_features": ["log2","sqrt",16,32,64,"auto"]
                     , "min_impurity_decrease": [*np.arange(0,5,10)]
                    }

reg = RFR(random_state=1412,verbose=True)
cv = KFold(n_splits=5,shuffle=True,random_state=1412)
# 定义随机搜索
search = RandomizedSearchCV(estimator=reg
                            ,param_distributions=param_grid_simple
                            ,n_iter = 800 #使用全域空间的一半作为子空间
                            ,scoring = "neg_mean_squared_error"
                            ,verbose = True
                            ,random_state=1412
                            ,cv = cv)
#训练随机搜索评估器
#=====【TIME WARNING: 1个半小时~2小时】=====#
start = time.time()
search.fit(X,y)
end = time.time()-start
print(end/60)
#查看最佳评估器
search.best_estimator_
RandomForestRegressor(max_profundidad=24, max_features=16, min_impurity_decrease=0, 
                      n_estimators=85, n_jobs=-1, random_state=1412, 
                      detallado=True)
abs(search.best_score_)**0.5
1055.5552571413887
rebuild_on_best_param(search.best_estimator_)
RMSE de entrenamiento: 465.198 
RMSE de prueba: 1054.359
método HPO búsqueda aleatoria media búsqueda
Espacio de búsqueda/espacio global 800/1536 1536/1536
Tiempo de ejecución (minutos) 103.20 25.638(↓)
Búsqueda óptima (RMSE) 1055.555 1068.281
Reconstrucción Óptima (RMSE) 1054.359 1082.916

Se puede ver que los resultados de la búsqueda aleatoria en la cuadrícula son ligeramente superiores, pero solo se pueden probar 800 combinaciones de parámetros y el tiempo consumido es 4 veces mayor que el de la mitad de la búsqueda. Para la búsqueda de media cuadrícula, podemos continuar ajustando el espacio de parámetros general y encontrar mejores parámetros.

Supongo que te gusta

Origin blog.csdn.net/weixin_60200880/article/details/131871993
Recomendado
Clasificación