如何用Python实现MASE(平均绝对缩放误差)?已知预测值求MASE
平均绝对缩放误差(MASE)的计算与Python实现
一、MASE的计算逻辑
MASE是衡量预测准确性的实用指标,核心是把当前预测的误差和**最简单的基准预测(naive forecast,用前一期实际值当作当期预测)**的平均误差做对比,能避开MAPE遇到预测值为0时的尴尬,也适配非平稳时间序列。
具体计算步骤:
- 计算基准误差:对实际值序列,从第2个值开始,每个时刻t的实际值减去前一时刻t-1的实际值,取绝对值后求平均值,记为
MAE_naive。 - 计算当前预测的绝对误差:每个时刻的预测值与实际值取绝对差,再求平均值得到
MAE_forecast。 - MASE就是
MAE_forecast除以MAE_naive——比值越小,说明预测效果比基准模型越好。
简化公式:
MASE = (平均|预测值-实际值|) / (平均|实际值[t]-实际值[t-1]|)
二、Python实现代码
基础版本(numpy)
用numpy快速实现,支持数组或列表输入:
import numpy as np def calculate_mase(actual, predicted): # 计算基准模型的平均绝对误差 naive_errors = np.abs(np.diff(actual)) mae_naive = np.mean(naive_errors) # 计算当前预测的平均绝对误差 forecast_errors = np.abs(predicted - actual) mae_forecast = np.mean(forecast_errors) # 计算MASE return mae_forecast / mae_naive # 示例用法 actual = np.array([10, 12, 15, 14, 16, 18]) predicted = np.array([11, 13, 14, 15, 17, 19]) print(f"MASE值: {calculate_mase(actual, predicted):.4f}")
时间序列分训练/测试集的正确用法
实际做时间序列预测时,基准误差必须用训练集数据计算,避免数据泄露:
# 拆分训练集和测试集 train_actual = np.array([10, 12, 15, 14]) test_actual = np.array([16, 18]) test_predicted = np.array([17, 19]) # 用训练集计算基准MAE naive_errors_train = np.abs(np.diff(train_actual)) mae_naive_train = np.mean(naive_errors_train) # 计算测试集的预测MAE forecast_errors_test = np.abs(test_predicted - test_actual) mae_forecast_test = np.mean(forecast_errors_test) # 得到测试集的MASE mase = mae_forecast_test / mae_naive_train print(f"测试集MASE值: {mase:.4f}")
pandas版本(适合带索引的时间序列)
如果用pandas处理时间序列数据,代码可以这样写:
import pandas as pd def calculate_mase_pd(actual, predicted): actual_series = pd.Series(actual) # 计算基准误差(跳过第一个空值) naive_errors = actual_series.diff().abs().dropna() mae_naive = naive_errors.mean() # 计算预测误差 forecast_errors = (actual_series - pd.Series(predicted)).abs() mae_forecast = forecast_errors.mean() return mae_forecast / mae_naive
注意事项
- 输入的实际值和预测值必须长度一致,且实际值序列长度至少为2(否则无法计算基准误差)。
- MASE是无量纲指标,值小于1说明预测效果比naive基准模型好,大于1则不如基准模型。
内容的提问来源于stack exchange,提问作者azazelspeaks
相关产品推荐
相关产品推荐

