# =========================================================
# Atividade: Ajustando modelos de Machine Learning
# Parte 1: Ajuste de Hiperparâmetros (Grid Search) - California Housing
# Parte 2: Seleção de Features (Random Forest) - Diabetes
# =========================================================
# ---------------------------------------------------------
# PARTE 1 - GRID SEARCH: Árvore de Decisão (California Housing)
# ---------------------------------------------------------
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import mean_squared_error
# Carregando o conjunto de dados
dados_habitacao = fetch_california_housing()
atributos = dados_habitacao.data
alvo = dados_habitacao.target
# Separando 25% dos dados para teste
atributos_treino, atributos_teste, alvo_treino, alvo_teste = train_test_split(
atributos, alvo, test_size=0.25, random_state=7
)
# Grade de hiperparâmetros a ser testada (valores diferentes do material)
grade_parametros = {
'max_depth': [4, 6, 8, 12, None],
'min_samples_split': [2, 4, 8, 15],
'min_samples_leaf': [1, 3, 5],
'criterion': ['squared_error', 'friedman_mse']
}
arvore = DecisionTreeRegressor(random_state=7)
busca_grid = GridSearchCV(
estimator=arvore,
param_grid=grade_parametros,
cv=4,
scoring='neg_mean_squared_error',
n_jobs=-1
)
busca_grid.fit(atributos_treino, alvo_treino)
print("=== PARTE 1: Grid Search - Árvore de Decisão ===")
print(f"Melhor combinação de hiperparâmetros: {busca_grid.best_params_}")
# Avaliando o modelo otimizado nos dados de teste
melhor_modelo = busca_grid.best_estimator_
previsoes = melhor_modelo.predict(atributos_teste)
erro_quadratico = mean_squared_error(alvo_teste, previsoes)
print(f"Erro quadrático médio (teste): {erro_quadratico:.4f}")
print()
# ---------------------------------------------------------
# PARTE 2 - SELEÇÃO DE FEATURES: Random Forest (Diabetes)
# ---------------------------------------------------------
from sklearn.datasets import load_diabetes
from sklearn.ensemble import RandomForestRegressor
import matplotlib.pyplot as plt
import numpy as np
# Carregando o conjunto de dados de diabetes
dados_diabetes = load_diabetes()
atributos_d = dados_diabetes.data
alvo_d = dados_diabetes.target
nomes_atributos = dados_diabetes.feature_names
atributos_d_treino, atributos_d_teste, alvo_d_treino, alvo_d_teste = train_test_split(
atributos_d, alvo_d, test_size=0.25, random_state=7
)
# Treinando o Random Forest
floresta = RandomForestRegressor(n_estimators=200, random_state=7)
floresta.fit(atributos_d_treino, alvo_d_treino)
# Extraindo e ordenando a importância de cada feature (do maior para o menor)
importancias = floresta.feature_importances_
indices_ordenados = np.argsort(importancias)[::-1]
print("=== PARTE 2: Seleção de Features - Random Forest ===")
print("Ranking de importância das características:")
for posicao, indice in enumerate(indices_ordenados, start=1):
print(f"{posicao}º - {nomes_atributos[indice]}: {importancias[indice]:.4f}")
# Gráfico de barras horizontais, já ordenado por importância
plt.figure(figsize=(10, 6))
plt.barh(
[nomes_atributos[i] for i in indices_ordenados],
importancias[indices_ordenados],
color='teal'
)
plt.title("Importância das características na previsão de diabetes")
plt.xlabel("Grau de importância")
plt.ylabel("Característica")
plt.gca().invert_yaxis()
plt.tight_layout()
plt.show()