Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

1
resposta

[Projeto] Ajustando hiperparâmetros com GridSearchCV

import pandas as pd
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score, classification_report

# 1. Carregar o dataset California Housing
# Para classificação, precisamos converter o target contínuo em classes discretas.
# Vamos simplificar e classificar se o valor mediano da casa é 'alto' (acima da média) ou 'baixo'.
california = fetch_california_housing(as_frame=True)
X_california = california.data
y_california_raw = california.target

# Criar um target binário: 1 se o valor da casa for acima da mediana, 0 caso contrário
median_price = y_california_raw.median()
y_california = (y_california_raw > median_price).astype(int)

print("Primeiras 5 linhas dos atributos (California Housing):")
display(X_california.head())
print("\nPrimeiras 5 linhas do target binário (California Housing):")
display(y_california.head())
print(f"\nDistribuição das classes no target: {y_california.value_counts()}")

#Pré-processamento
# Dividir os dados em conjuntos de treino e teste
X_train_cal, X_test_cal, y_train_cal, y_test_cal = train_test_split(
    X_california, y_california, test_size=0.3, random_state=42, stratify=y_california
)

print(f"Tamanho do conjunto de treino (X_train_cal): {X_train_cal.shape}")
print(f"Tamanho do conjunto de teste (X_test_cal): {X_test_cal.shape}")

#Aplicação
# Definir o modelo base
dt_classifier = DecisionTreeClassifier(random_state=42)

# Definir a grade de hiperparâmetros a serem testados
param_grid = {
    'max_depth': [None, 5, 10, 15, 20],
    'min_samples_split': [2, 5, 10],
    'min_samples_leaf': [1, 2, 4],
    'criterion': ['gini', 'entropy']
}

# Configurar o Grid Search
grid_search = GridSearchCV(
    estimator=dt_classifier,
    param_grid=param_grid,
    cv=5, # 5-fold cross-validation
    scoring='accuracy', # Métrica a ser otimizada
    n_jobs=-1, # Usar todos os núcleos da CPU disponíveis
    verbose=1
)

# Executar o Grid Search nos dados de treino
print("Iniciando Grid Search...")
grid_search.fit(X_train_cal, y_train_cal)
print("Grid Search concluído!")

# Exibir os melhores parâmetros encontrados
print(f"\nMelhores parâmetros encontrados: {grid_search.best_params_}")
print(f"Melhor acurácia (média da validação cruzada): {grid_search.best_score_:.4f}")

# Obter o melhor modelo
best_dt_model = grid_search.best_estimator_

# Avaliar o melhor modelo no conjunto de teste
y_pred_cal = best_dt_model.predict(X_test_cal)
acuracia_final_cal = accuracy_score(y_test_cal, y_pred_cal)

print(f"\nAcurácia do modelo com melhores parâmetros no conjunto de teste: {acuracia_final_cal:.4f}")
print("\nRelatório de Classificação:")
print(classification_report(y_test_cal, y_pred_cal))
1 resposta

Oi, Paulo! Tudo bem?

Sobre o projeto Ajustando hiperparâmetros com GridSearchCV, seu código mostra bem o fluxo de preparação dos dados, definição do modelo, busca dos melhores parâmetros e avaliação final.

Gostei de ver que você usou stratify=y_california na divisão dos dados, pois isso ajuda a manter a proporção das classes entre treino e teste. Também ficou interessante a transformação do alvo contínuo em classes binárias para usar o DecisionTreeClassifier.

Qual outro hiperparâmetro você acha que poderia ser testado para tentar melhorar o desempenho da árvore?

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!