Optimización de hiperparámetros: Búsqueda aleatorizada vs Búsqueda en cuadrícula

Machine LearningMachine LearningBeginner
Practicar Ahora

This tutorial is from open-source community. Access the source code

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En el aprendizaje automático, los hiperparámetros son parámetros que no se aprenden a partir de los datos, sino que se establecen antes del entrenamiento. La selección de hiperparámetros adecuados es crucial para alcanzar una alta precisión en los modelos de aprendizaje automático. Dos métodos comunes para la optimización de hiperparámetros son la búsqueda aleatorizada y la búsqueda en cuadrícula. En este laboratorio, compararemos estos dos métodos para optimizar los hiperparámetros de una Máquina de Vectores de Soporte (SVM) lineal con entrenamiento por Descenso de Gradiente Estocástico (SGD).

Consejos sobre la VM

Una vez finalizada la inicialización de la VM, haga clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno y acceder a Jupyter Notebook para practicar.

A veces, es posible que tenga que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de las operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.

Si tiene problemas durante el aprendizaje, no dude en preguntar a Labby. Deje su retroalimentación después de la sesión y resolveremos rápidamente el problema para usted.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/linear_model("Linear Models") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/model_selection("Model Selection") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/linear_model -.-> lab-49256{{"Optimización de hiperparámetros: Búsqueda aleatorizada vs Búsqueda en cuadrícula"}} sklearn/model_selection -.-> lab-49256{{"Optimización de hiperparámetros: Búsqueda aleatorizada vs Búsqueda en cuadrícula"}} sklearn/datasets -.-> lab-49256{{"Optimización de hiperparámetros: Búsqueda aleatorizada vs Búsqueda en cuadrícula"}} ml/sklearn -.-> lab-49256{{"Optimización de hiperparámetros: Búsqueda aleatorizada vs Búsqueda en cuadrícula"}} end

Importar las bibliotecas necesarias y cargar los datos

Comenzaremos importando las bibliotecas necesarias y cargando el conjunto de datos de dígitos de scikit-learn.

import numpy as np
from time import time
import scipy.stats as stats
from sklearn.model_selection import GridSearchCV, RandomizedSearchCV
from sklearn.datasets import load_digits
from sklearn.linear_model import SGDClassifier

## cargar el conjunto de datos de dígitos
X, y = load_digits(return_X_y=True, n_class=3)

Crear un modelo de SVM

Crearemos un modelo de SVM lineal con entrenamiento por SGD.

## crear el modelo de SVM con entrenamiento por SGD
clf = SGDClassifier(loss="hinge", penalty="elasticnet", fit_intercept=True)

Búsqueda aleatorizada para la optimización de hiperparámetros

Utilizaremos la búsqueda aleatorizada para explorar el espacio de hiperparámetros y encontrar los mejores hiperparámetros para nuestro modelo de SVM.

## especificar los parámetros y las distribuciones para muestrear
param_dist = {
    "average": [True, False],
    "l1_ratio": stats.uniform(0, 1),
    "alpha": stats.loguniform(1e-2, 1e0),
}

## ejecutar la búsqueda aleatorizada
n_iter_search = 15
random_search = RandomizedSearchCV(
    clf, param_distributions=param_dist, n_iter=n_iter_search
)

start = time()
random_search.fit(X, y)
print(
    "RandomizedSearchCV tomó %.2f segundos para %d configuraciones de parámetros candidatas."
    % ((time() - start), n_iter_search)
)

## imprimir los resultados
report(random_search.cv_results_)

Búsqueda en cuadrícula para la optimización de hiperparámetros

Utilizaremos la búsqueda en cuadrícula para explorar el espacio de hiperparámetros y encontrar los mejores hiperparámetros para nuestro modelo de SVM.

## especificar los parámetros para buscar
param_grid = {
    "average": [True, False],
    "l1_ratio": np.linspace(0, 1, num=10),
    "alpha": np.power(10, np.arange(-2, 1, dtype=float)),
}

## ejecutar la búsqueda en cuadrícula
grid_search = GridSearchCV(clf, param_grid=param_grid)

start = time()
grid_search.fit(X, y)

print(
    "GridSearchCV tomó %.2f segundos para %d configuraciones de parámetros candidatas."
    % (time() - start, len(grid_search.cv_results_["params"]))
)

## imprimir los resultados
report(grid_search.cv_results_)

Resumen

En este laboratorio, comparamos la búsqueda aleatorizada y la búsqueda en cuadrícula para la optimización de hiperparámetros de un modelo de SVM lineal con entrenamiento por SGD. Encontramos que ambos métodos exploraron el mismo espacio de hiperparámetros, pero la búsqueda aleatorizada fue significativamente más rápida. Los mejores hiperparámetros encontrados por cada método tuvieron un rendimiento similar, pero la búsqueda aleatorizada puede tener un rendimiento ligeramente peor debido al ruido. En la práctica, no buscaríamos sobre tantos hiperparámetros simultáneamente, sino solo sobre los más importantes.