Otimização de Hiperparâmetros: Busca Aleatória vs. Busca em Grade

Beginner

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

Introdução

Em aprendizagem de máquina, hiperparâmetros são parâmetros que não são aprendidos a partir dos dados, mas sim definidos antes do treino. A seleção de hiperparâmetros apropriados é crucial para alcançar alta precisão em modelos de aprendizagem de máquina. Dois métodos comuns para otimização de hiperparâmetros são a busca aleatória e a busca em grade. Neste laboratório, compararemos esses dois métodos para otimizar os hiperparâmetros de uma Máquina de Vetores de Suporte (SVM) linear com treino por Gradiente Descendente Estocástico (SGD).

Dicas da Máquina Virtual

Após o arranque da máquina virtual, clique no canto superior esquerdo para mudar para a aba Notebook para aceder ao Jupyter Notebook para a prática.

Por vezes, pode ser necessário esperar alguns segundos para o Jupyter Notebook terminar de carregar. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.

Se tiver problemas durante o aprendizado, não hesite em contactar o Labby. Forneça feedback após a sessão e resolveremos prontamente o problema para si.

Importação de bibliotecas necessárias e carregamento de dados

Começaremos importando as bibliotecas necessárias e carregando o conjunto de dados de dígitos do 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

## carregar o conjunto de dados de dígitos
X, y = load_digits(return_X_y=True, n_class=3)

Criar um modelo SVM

Criaremos um modelo SVM linear com treino por Gradiente Descendente Estocástico (SGD).

## criar modelo SVM com treino por SGD
clf = SGDClassifier(loss="hinge", penalty="elasticnet", fit_intercept=True)

Busca aleatória para otimização de hiperparâmetros

Usaremos busca aleatória para explorar o espaço de hiperparâmetros e encontrar os melhores hiperparâmetros para nosso modelo SVM.

## especifique os parâmetros e as distribuições para amostragem
param_dist = {
    "average": [True, False],
    "l1_ratio": stats.uniform(0, 1),
    "alpha": stats.loguniform(1e-2, 1e0),
}

## execute a busca aleatória
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 levou %.2f segundos para %d configurações de parâmetros candidatos."
    % ((time() - start), n_iter_search)
)

## imprime os resultados
report(random_search.cv_results_)

Busca em grade para otimização de hiperparâmetros

Usaremos busca em grade para explorar o espaço de hiperparâmetros e encontrar os melhores hiperparâmetros para nosso modelo SVM.

## especifique os parâmetros a serem pesquisados
param_grid = {
    "average": [True, False],
    "l1_ratio": np.linspace(0, 1, num=10),
    "alpha": np.power(10, np.arange(-2, 1, dtype=float)),
}

## execute a busca em grade
grid_search = GridSearchCV(clf, param_grid=param_grid)

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

print(
    "GridSearchCV levou %.2f segundos para %d configurações de parâmetros candidatas."
    % (time() - start, len(grid_search.cv_results_["params"]))
)

## imprime os resultados
report(grid_search.cv_results_)

Resumo

Neste laboratório, comparamos a busca aleatória e a busca em grade para a otimização de hiperparâmetros de um modelo SVM linear com treinamento por SGD. Descobrimos que ambos os métodos exploraram o mesmo espaço de hiperparâmetros, mas a busca aleatória foi significativamente mais rápida. Os melhores hiperparâmetros encontrados por cada método apresentaram desempenho semelhante, mas a busca aleatória pode ter um desempenho ligeiramente pior devido ao ruído. Na prática, não pesquisaríamos tantos hiperparâmetros simultaneamente, mas apenas os mais importantes.