78 lines
2.1 KiB
Python
78 lines
2.1 KiB
Python
"""
|
|
药店销售预测系统 - 评估指标计算函数
|
|
"""
|
|
|
|
import numpy as np
|
|
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
|
|
|
|
def evaluate_model(y_true, y_pred):
|
|
"""
|
|
计算模型评估指标
|
|
|
|
参数:
|
|
y_true: 真实值
|
|
y_pred: 预测值
|
|
|
|
返回:
|
|
包含各种评估指标的字典
|
|
"""
|
|
# 确保输入是一维数组
|
|
y_true = np.array(y_true).flatten()
|
|
y_pred = np.array(y_pred).flatten()
|
|
|
|
# 计算均方误差 (MSE)
|
|
mse = mean_squared_error(y_true, y_pred)
|
|
|
|
# 计算均方根误差 (RMSE)
|
|
rmse = np.sqrt(mse)
|
|
|
|
# 计算平均绝对误差 (MAE)
|
|
mae = mean_absolute_error(y_true, y_pred)
|
|
|
|
# 计算决定系数 (R^2)
|
|
r2 = r2_score(y_true, y_pred)
|
|
|
|
# 计算平均绝对百分比误差 (MAPE)
|
|
# 避免除以零
|
|
mask = y_true != 0
|
|
mape = np.mean(np.abs((y_true[mask] - y_pred[mask]) / y_true[mask])) * 100
|
|
|
|
return {
|
|
'mse': mse,
|
|
'rmse': rmse,
|
|
'mae': mae,
|
|
'r2': r2,
|
|
'mape': mape
|
|
}
|
|
|
|
def compare_models(results_dict):
|
|
"""
|
|
比较多个模型的性能
|
|
|
|
参数:
|
|
results_dict: 字典,键为模型名称,值为评估指标字典
|
|
|
|
返回:
|
|
比较结果的字典
|
|
"""
|
|
comparison = {}
|
|
|
|
# 获取所有指标名称
|
|
metrics = list(next(iter(results_dict.values())).keys())
|
|
|
|
# 对每个指标,找出最佳模型
|
|
for metric in metrics:
|
|
if metric in ['mse', 'rmse', 'mae', 'mape']: # 这些指标越小越好
|
|
best_model = min(results_dict.items(), key=lambda x: x[1][metric])[0]
|
|
best_value = min(model[metric] for model in results_dict.values())
|
|
else: # r2 越大越好
|
|
best_model = max(results_dict.items(), key=lambda x: x[1][metric])[0]
|
|
best_value = max(model[metric] for model in results_dict.values())
|
|
|
|
comparison[metric] = {
|
|
'best_model': best_model,
|
|
'best_value': best_value,
|
|
'all_values': {model_name: results[metric] for model_name, results in results_dict.items()}
|
|
}
|
|
|
|
return comparison |