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)