Otimização de Hiperparâmetros: Grid Search, Random Search e Bayesian Optimization

O que são Hiperparâmetros?

O que é Otimização de Hiperparâmetros?

Métodos de Otimização de Hiperparâmetros

1. Grid Search: A Busca Exaustiva

from sklearn.model_selection import GridSearchCV, train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from sklearn.metrics import accuracy_score

# Carregando o dataset iris
iris = load_iris()
X, y = iris.data, iris.target

# Separação dos dados entre treino e teste
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# Definição do grid de parametros
param_grid = {'n_estimators': [10, 50, 100], 'max_depth': [5, 10, 20]}

# Criação do modelo RandomForestClassifier
model = RandomForestClassifier(random_state=42) #Setting random state for reproducibility

# Creação do objeto GridSearchCV
grid_search = GridSearchCV(model, param_grid, cv=5, scoring='accuracy')

# Fit do objeto GridSearchCV nos dados de treino
grid_search.fit(X_train, y_train)

# Impressão dos melhores parametros
print("Melhores parametros:", grid_search.best_params_)

# Avalia o melhor modelo nos dados de teste
best_model = grid_search.best_estimator_
y_pred = best_model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"Acurácia do melhor modelo nos dados de teste: {accuracy}")
Melhores parametros: {'max_depth': 5, 'n_estimators': 100}
Acurácia do melhor modelo nos dados de teste: 1.0

2. Random Search: A Busca Aleatória

from sklearn.model_selection import RandomizedSearchCV
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
from sklearn.metrics import accuracy_score
import numpy as np

# Carregando o dataset iris
iris = load_iris()
X, y = iris.data, iris.target

# Separação dos dados entre treino e teste
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# Definição do espaço de parâmetros para a busca aleatória
param_dist = {'n_estimators': np.arange(10, 200, 10), 'max_depth': [None, 10, 20, 30]}

# Criação do modelo RandomForestClassifier
model = RandomForestClassifier(random_state=42)

# Criação do objeto RandomizedSearchCV
random_search = RandomizedSearchCV(model, param_distributions=param_dist, n_iter=10, cv=5, scoring='accuracy', random_state=42)

# Fit do objeto RandomizedSearchCV nos dados de treino
random_search.fit(X_train, y_train)

# Impressão dos melhores parâmetros
print("Melhores parâmetros:", random_search.best_params_)

# Avalia o melhor modelo nos dados de teste
best_model = random_search.best_estimator_
y_pred = best_model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"Acurácia do melhor modelo nos dados de teste: {accuracy}")
Melhores parâmetros: {'n_estimators': 170, 'max_depth': 10}
Acurácia do melhor modelo nos dados de teste: 1.0

3. Bayesian Optimization: A Busca Inteligente

import optuna
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
from sklearn.metrics import accuracy_score

# Carregando o dataset iris
iris = load_iris()
X, y = iris.data, iris.target

# Separação dos dados entre treino e teste
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

def objective(trial):
    # Definição do espaço de hiperparâmetros
    n_estimators = trial.suggest_int('n_estimators', 10, 200)
    max_depth = trial.suggest_int('max_depth', 5, 30, log=True) # log=True para valores mais próximos a 1

    # Criação do modelo
    model = RandomForestClassifier(n_estimators=n_estimators, max_depth=max_depth, random_state=42)
    
    # Treinamento do modelo
    model.fit(X_train, y_train)
    
    # Predição nos dados de teste
    y_pred = model.predict(X_test)
    
    # Retorna a acurácia como objetivo
    return accuracy_score(y_test, y_pred)

# Criação do estudo Optuna
study = optuna.create_study(direction='maximize') # Maximizar a acurácia

# Otimização
study.optimize(objective, n_trials=100) # número de tentativas

# Impressão dos melhores hiperparâmetros
print("Melhores hiperparâmetros:", study.best_params)
print("Melhor acurácia:", study.best_value)

# Treinamento do modelo com os melhores hiperparâmetros encontrados
best_model = RandomForestClassifier(**study.best_params, random_state=42)
best_model.fit(X_train, y_train)
y_pred = best_model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"Acurácia do melhor modelo nos dados de teste: {accuracy}")
[I 2025-02-24 18:57:08,841] Trial 97 finished with value: 1.0 and parameters: {'n_estimators': 21, 'max_depth': 17}. Best is trial 0 with value: 1.0.
[I 2025-02-24 18:57:09,040] Trial 98 finished with value: 1.0 and parameters: {'n_estimators': 186, 'max_depth': 5}. Best is trial 0 with value: 1.0.
[I 2025-02-24 18:57:09,222] Trial 99 finished with value: 1.0 and parameters: {'n_estimators': 161, 'max_depth': 28}. Best is trial 0 with value: 1.0.
Melhores hiperparâmetros: {'n_estimators': 182, 'max_depth': 7}
Melhor acurácia: 1.0
Acurácia do melhor modelo nos dados de teste: 1.0

Qual técnica escolher?

Conclusão

  1. Mãos à obra aprendizado de máquina com Scikit-Learn, Keras & TensorFlow: conceitos, ferramentas e técnicas para a construção de sistemas inteligentes.
  2. Python para análise de dados
  3. Estatística Prática Para Cientistas de Dados: 50 Conceitos Essenciais
  4. An Introduction to Statistical Learning (Python e R)

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Rolar para cima
×