在Python中,可以使用多种库来实现预测评估,包括NumPy、Scikit-learn、Statsmodels等。以下是一些常用的预测评估方法的Python实现示例:
多种预测评估方法的Python实现
import numpy as np
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
# 假设y_true是实际值,y_pred是预测值
y_true = np.array([10, 20, 30, 40, 50])
y_pred = np.array([12, 18, 33, 42, 48])
# 计算MAE
mae = mean_absolute_error(y_true, y_pred)
print(f"MAE: {mae:.2f}")
# 计算RMSE
rmse = np.sqrt(mean_squared_error(y_true, y_pred))
print(f"RMSE: {rmse:.2f}")
# 计算MAPE
def calculate_mape(y_true, y_pred):
mask = y_true != 0
return np.mean(np.abs((y_true[mask] - y_pred[mask]) / y_true[mask])) * 100
mape = calculate_mape(y_true, y_pred)
print(f"MAPE: {mape:.2f}%")
# 计算MASE
def calculate_mase(y_true, y_pred, m=1):
# 计算朴素预测的误差
naive_error = np.mean(np.abs(y_true[m:] - y_true[:-m]))
# 计算预测误差
forecast_error = np.mean(np.abs(y_true - y_pred))
# 计算MASE
return forecast_error / naive_error
mase = calculate_mase(y_true, y_pred, m=1)
print(f"MASE: {mase:.2f}")
# 计算sMAPE
def calculate_smape(y_true, y_pred):
denominator = (np.abs(y_true) + np.abs(y_pred)) / 2
diff = np.abs(y_true - y_pred) / denominator
diff[denominator == 0] = 0.0
return 100 * np.mean(diff)
smape = calculate_smape(y_true, y_pred)
print(f"sMAPE: {smape:.2f}%")
# 计算R²
r2 = r2_score(y_true, y_pred)
print(f"R²: {r2:.2f}")
# 计算方向准确性(DA)
def calculate_da(y_true, y_pred):
# 计算实际值的变化方向
true_direction = np.diff(y_true)
# 计算预测值的变化方向
pred_direction = np.diff(y_pred)
# 计算方向准确性
return np.mean((true_direction * pred_direction) > 0)
da = calculate_da(y_true, y_pred)
print(f"DA: {da:.2f}")
预测评估的可视化
除了数值指标外,可视化也是预测评估的重要工具。以下是一些常用的预测评估可视化方法的Python实现示例:
预测评估的可视化方法
import matplotlib.pyplot as plt
import seaborn as sns
# 假设y_true是实际值,y_pred是预测值
y_true = np.array([10, 20, 30, 40, 50])
y_pred = np.array([12, 18, 33, 42, 48])
# 创建时间索引
time_index = np.arange(len(y_true))
# 1. 预测值与实际值的对比图
plt.figure(figsize=(12, 6))
plt.plot(time_index, y_true, 'o-', label='实际值')
plt.plot(time_index, y_pred, 's--', label='预测值')
plt.xlabel('时间')
plt.ylabel('值')
plt.title('预测值与实际值的对比')
plt.legend()
plt.grid(True)
plt.show()
# 2. 残差图
residuals = y_true - y_pred
plt.figure(figsize=(12, 6))
plt.plot(time_index, residuals, 'o-')
plt.axhline(y=0, color='r', linestyle='-')
plt.xlabel('时间')
plt.ylabel('残差')
plt.title('残差图')
plt.grid(True)
plt.show()
# 3. 残差的直方图
plt.figure(figsize=(10, 6))
sns.histplot(residuals, kde=True)
plt.xlabel('残差')
plt.ylabel('频数')
plt.title('残差的分布')
plt.grid(True)
plt.show()
# 4. 预测值与实际值的散点图
plt.figure(figsize=(8, 8))
plt.scatter(y_true, y_pred)
plt.plot([min(y_true), max(y_true)], [min(y_true), max(y_true)], 'r--')
plt.xlabel('实际值')
plt.ylabel('预测值')
plt.title('预测值与实际值的散点图')
plt.grid(True)
plt.axis('equal')
plt.show()
# 5. 误差的分布图
plt.figure(figsize=(10, 6))
sns.boxplot(x=residuals)
plt.xlabel('误差')
plt.title('误差的分布')
plt.grid(True)
plt.show()