1
resposta

Minha solução Avaliação com validação cruzada

from sklearn.model_selection import KFold, cross_validate
import numpy as np
import pandas as pd

# Define as métricas de avaliação
scoring = {
    'mae': 'neg_mean_absolute_error',
    'rmse': 'neg_root_mean_squared_error',
    'r2': 'r2'
}

# Configuração da validação cruzada com 5 dobras
cv = KFold(n_splits=5, shuffle=True, random_state=42)

# Executa a validação cruzada
cv_results = cross_validate(model_rf, X_train, y_train, cv=cv, scoring=scoring)

# Corrige o sinal das métricas de erro e calcula médias e desvios
mae_mean = -np.mean(cv_results['test_mae'])
mae_std = np.std(cv_results['test_mae'])

rmse_mean = -np.mean(cv_results['test_rmse'])
rmse_std = np.std(cv_results['test_rmse'])

r2_mean = np.mean(cv_results['test_r2'])
r2_std = np.std(cv_results['test_r2'])

# Exibição formatada
print("="*50)
print("Resultados da Validação Cruzada (5-Fold) - RandomForestRegressor")
print("="*50)
print(f"MAE  (Erro Absoluto Médio):         {mae_mean:.4f} ± {mae_std:.4f}")
print(f"RMSE (Raiz do Erro Quadrático):     {rmse_mean:.4f} ± {rmse_std:.4f}")
print(f"R²   (Coef. de Determinação):       {r2_mean:.4f} ± {r2_std:.4f}")
print("="*50)

# Cria um DataFrame com os resultados médios e desvios
df_metricas_cv = pd.DataFrame({
    'Métrica': ['MAE', 'RMSE', 'R²'],
    'Média': [mae_mean, rmse_mean, r2_mean],
    'Desvio Padrão': [mae_std, rmse_std, r2_std]
})

# Exibe o DataFrame
print("\nTabela de Métricas da Validação Cruzada:")
print(df_metricas_cv)


# Exibição dos resultados da validação cruzada com formatação e correção de sinal
for metric in scoring.keys():
    scores = cv_results[f'test_{metric}']

    # Corrige o sinal se a métrica for de erro (que vem como negativa por padrão)
    if metric in ['mae', 'rmse']:
        scores = -scores

    # Calcula média e desvio padrão formatados
    mean_score = "{:.3f}".format(scores.mean())
    std_score = "{:.3f}".format(scores.std())

    # Exibe a lista de scores individuais com 3 casas decimais
    formatted_scores = [f"{val:.3f}" for val in scores]
    print(f"{metric.upper()} - Resultados por Fold: {formatted_scores}")
    print(f"{metric.upper()} Média: {mean_score} | Desvio Padrão: {std_score}")
    print("-" * 90)
1 resposta

Bom dia, Paulo! Como está?

Incrível! Continue resolvendo os desafios e compartilhando com a comunidade Alura.

Você utilizou com maestria o cross_validate para realizar avaliação robusta com múltiplas métricas, aplicou de forma eficaz o KFold com embaralhamento para garantir melhor generalização dos resultados e corrigiu corretamente os sinais das métricas negativas.

Permaneça postando as suas soluções, com certeza isso ajudará outros estudantes e tem grande relevância para o fórum.

Ícone de sugestão Para saber mais:

Sugestão de conteúdo para você mergulhar ainda mais sobre o tema:

Alguns materiais estão em inglês, mas é possível compreendê-los usando o recurso de tradução de páginas do próprio navegador.

Fico à disposição! E se precisar, conte sempre com o apoio do fórum.

Abraço e bons estudos!

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