1
resposta

Grid Search para ajuste de hiperparâmetros

Usarei o dataset Pima Indians Diabetes para Classificação (prever se o paciente tem ou não diabetes) e o dataset California Housing para Regressão (prever o preço médio das casas).

O que é o Grid Search?
Imagine que você está regulando um rádio: você gira o botão de sintonia e o de volume até achar o som perfeito. O Grid Search faz isso automaticamente, testando exaustivamente uma "grade" de combinações de hiperparâmetros (como a profundidade da árvore) para ver qual gera a maior precisão.
1. Classificação: Pima Indians Diabetes + Grid Search
O objetivo aqui é encontrar a melhor configuração para uma Árvore de Decisão prever o diagnóstico de diabetes.

from sklearn.model_selection import GridSearchCV, train_test_split
from sklearn.tree import DecisionTreeRegressor # Alterado para DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor # Adicionado RandomForestRegressor
from sklearn.datasets import load_diabetes # Usando carregador similar ou CSV local
import pandas as pd

# Carregando o dataset de diabetes para definir X e y
data = load_diabetes()
X = pd.DataFrame(data.data, columns=data.feature_names)
y = pd.Series(data.target)

# Carregamento hipotético do Pima (assumindo X e y definidos)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Definindo os parâmetros para testar para RandomForestRegressor
param_grid = {
    'n_estimators': [10, 50, 100], # Número de árvores na floresta
    'max_depth': [3, 5, 10, None],
    'min_samples_split': [2, 5, 10],
    'criterion': ['squared_error', 'friedman_mse', 'poisson'] # Critérios para regressão
}

grid_search = GridSearchCV(RandomForestRegressor(random_state=42), param_grid, cv=5, n_jobs=-1) # Alterado para RandomForestRegressor
grid_search.fit(X_train, y_train)

print(f"Melhores parâmetros (RandomForestRegressor): {grid_search.best_params_}")
print(f"Melhor Score (RandomForestRegressor): {grid_search.best_score_:.2f}")

Os melhores parâmetros encontrados para o RandomForestRegressor são:
{'criterion':
'squared_error',
'max_depth': 3,
'min_samples_split': 2,
'n_estimators': 100
}.
Melhor Score (RandomForestRegressor): 0.41

2. Regressão: California Housing + Importância das Features
No caso da habitação na Califórnia, queremos prever o valor do imóvel. Após treinar o modelo, gostaria de identificar o que influencia a previsão.
A Árvore de Decisão calcula o quanto cada variável reduziu os erro nos nós.
MedInc (Renda Média): Quase sempre a variável mais crítica.
AveOccup (Ocupação Média): O número de pessoas por residência.
Longitude/Latitude: A localização geográfica é determinante.
Implementação do Grid Search
Para realizar o ajuste de hiperparâmetros com Grid Search e analisar a Importância das Features no dataset California Housing, seguimos um fluxo de trabalho que busca o equilíbrio entre a complexidade do modelo e a precisão das previsões.
O GridSearchCV testa todas as combinações possíveis de hiperparâmetros que você definir. Para uma Árvore de Decisão, os parâmetros mais comuns são a profundidade máxima e o número mínimo de amostras por folha.

from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import GridSearchCV, train_test_split
from sklearn.tree import DecisionTreeRegressor

# Carregando os dados
data = fetch_california_housing()
X, y = data.data, data.target

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Definindo o "Grid" de parâmetros
param_grid = {
    'max_depth': [3, 5, 10, 20],
    'min_samples_split': [2, 10, 20],
    'criterion': ['squared_error', 'friedman_mse']
}

grid_search = GridSearchCV(DecisionTreeRegressor(), param_grid, cv=5)
grid_search.fit(X_train, y_train)

print(f"Melhores parâmetros: {grid_search.best_params_}")

Melhores parâmetros: {'criterion': 'friedman_mse', 'max_depth': 10, 'min_samples_split': 20}

Identificando a Importância das Features
Após o fit, o modelo armazena a importância de cada variável baseada na redução da impureza de Gini ou, no caso de regressão, na redução do Erro Quadrático Médio (MSE).
MedInc (Median Income): Frequentemente detém mais de 70% da "importância". Isso ocorre porque a renda é o preditor direto do poder de compra em um mercado imobiliário.
Localização (Lat/Long): Em modelos de árvore, a latitude e longitude ajudam a "segmentar" o mapa da Califórnia. O modelo aprende que coordenadas específicas que reduzem drasticamente o erro da previsão.
AveOccup: Reflete a densidade. Valores muito altos podem indicar habitações multifamiliares ou áreas mais pobres, o que impacta negativamente o preço.

1 resposta

Oi, Tiago! Como vai?
Agradeço por compartilhar seu código com a comunidade Alura.

Foi bem legal ver como você conectou a ideia do GridSearchCV (testar combinações de hiperparâmetros) com dois cenários diferentes. Um ponto importante: no exemplo de "classificação" você acabou usando load_diabetes() e um RandomForestRegressor, que são de regressão. Se a intenção for mesmo classificar (Pima), o caminho seria usar um modelo Classifier e uma métrica como accuracy ou f1.

Uma dica interessante para o futuro é usar Pipeline para evitar vazamento de dados e deixar o GridSearchCV mais organizado, por exemplo colocando StandardScaler antes do modelo. Veja este exemplo:


from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestRegressor

pipe = Pipeline([
    ("scaler", StandardScaler()),
    ("model", RandomForestRegressor(random_state=42))
])

param_grid = {
    "model__n_estimators": [50, 100],
    "model__max_depth": [3, None]
}

grid = GridSearchCV(pipe, param_grid, cv=5, n_jobs=-1)

Esse código cria um fluxo com scaler + modelo e testa combinações de parâmetros do modelo usando o prefixo model__.

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