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))