ML1_project_temperature_forecast / src /model_evaluation.py
dung
cap nhat report va hourly
4bcfd02
Raw History Blame Contribute Delete
2.69 kB
"""
Model evaluation
- RMSE, R2, MAE
"""
from sklearn.metrics import mean_squared_error, r2_score, mean_absolute_percentage_error, mean_absolute_error
import numpy as np
import pandas as pd
def evaluate(y_true, y_pred):
rmse = np.sqrt(mean_squared_error(y_true, y_pred))
mae = mean_absolute_error(y_true, y_pred)
r2 = r2_score(y_true, y_pred)
y_true_safe = np.where(y_true == 0, np.finfo(float).eps, y_true)
mape = np.mean(np.abs((y_true - y_pred) / y_true_safe)) * 100
return {
'RMSE': rmse,
'MAE': mae,
'R2': r2,
'MAPE': mape
}
def evaluate_multi_output(y_true, y_pred):
"""
Đánh giá mô hình đa đầu ra bằng cách tính trung bình các chỉ số
và báo cáo chi tiết cho từng đầu ra (từng ngày dự báo).
Args:
y_true (pd.DataFrame or np.array): Giá trị thực tế (n_samples, n_outputs).
y_pred (pd.DataFrame or np.array): Giá trị dự báo (n_samples, n_outputs).
Returns:
dict: Một dictionary chứa các chỉ số trung bình và chi tiết cho từng ngày.
"""
# Đảm bảo y_true và y_pred là numpy array để xử lý nhất quán
if isinstance(y_true, pd.DataFrame):
y_true = y_true.values
if isinstance(y_pred, pd.DataFrame):
y_pred = y_pred.values
n_outputs = y_true.shape[1]
results = {
"average": {}, # Chỉ số trung bình
"per_day": {} # Chỉ số từng ngày
}
# --- Phần tính toán chi tiết ---
rmse_scores, mae_scores, r2_scores, mape_scores = [], [], [], []
for i in range(n_outputs):
day = i + 1
true_day_i = y_true[:, i]
pred_day_i = y_pred[:, i]
# Tính các chỉ số
rmse = np.sqrt(mean_squared_error(true_day_i, pred_day_i))
mae = mean_absolute_error(true_day_i, pred_day_i)
r2 = r2_score(true_day_i, pred_day_i)
#mape = mean_absolute_percentage_error(true_day_i, pred_day_i) * 100
# Lưu vào danh sách
rmse_scores.append(rmse)
mae_scores.append(mae)
r2_scores.append(r2)
#mape_scores.append(mape)
# Lưu kết quả chi tiết từng ngày
results["per_day"][f"RMSE_day_{day}"] = rmse
results["per_day"][f"MAE_day_{day}"] = mae
results["per_day"][f"R2_day_{day}"] = r2
#results["per_day"][f"MAPE_day_{day}"] = mape
# --- Trung bình ---
results["average"]["RMSE"] = np.mean(rmse_scores)
results["average"]["MAE"] = np.mean(mae_scores)
results["average"]["R2"] = np.mean(r2_scores)
#results["average"]["MAPE"] = np.mean(mape_scores)
return results