如何用Python计算SMAPE
在这篇文章中,我们将看到如何在Python中计算确定预测准确性的方法之一,即对称平均绝对百分比误差(或简称SMAPE)。
SMAPE是克服MAPE预测误差测量局限性的替代方法之一。与平均绝对百分比误差相比,SMAPE既有下限也有上限,因此,它被称为对称的。SMAPE中的’S’代表对称,’M’代表平均数,它包含了一个系列的平均值,’A’代表绝对值,它使用绝对值来防止正负误差相互抵消,’P’是百分比,使这个准确性指标成为相对指标,’E’代表误差,因为这个指标有助于确定我们预测的误差量。
SMAPE的公式。
考虑下面的例子,我们有一家商店的销售信息。日期栏代表我们所指的日期,实际销售栏代表相应日期的实际销售值,而预测销售栏代表销售数字的预测值(可能使用ML模型)。最后一列是最后第三列和最后第二列之间的划分。
Day No. | Actual Sales | Forecast Sales | A |预测-实际| | B(|实际|+|预测|)/2 | A / B |
---|---|---|---|---|---|
1 | 136 | 134 | 2 | 135 | 0.014 |
2 | 120 | 124 | 4 | 122 | 0.032 |
3 | 138 | 132 | 6 | 135 | 0.044 |
4 | 155 | 141 | 14 | 148 | 0.094 |
5 | 149 | 149 | 0 | 149 | 0 |
上述例子中的SMAPE值将是A/B栏中条目的平均值。该值为0.0368。
用Python计算SMAPE
import pandas as pd
import numpy as np
# Define the function to return the SMAPE value
def calculate_smape(actual, predicted) -> float:
# Convert actual and predicted to numpy
# array data type if not already
if not all([isinstance(actual, np.ndarray),
isinstance(predicted, np.ndarray)]):
actual, predicted = np.array(actual),
np.array(predicted)
return round(
np.mean(
np.abs(predicted - actual) /
((np.abs(predicted) + np.abs(actual))/2)
)*100, 2
)
if __name__ == '__main__':
# CALCULATE SMAPE FROM PYTHON LIST
actual = [136, 120, 138, 155, 149]
predicted = [134, 124, 132, 141, 149]
# Get SMAPE for python list as parameters
print("py list :",
calculate_smape(actual, predicted), "%")
# CALCULATE SMAPE FROM NUMPY ARRAY
actual = np.array([136, 120, 138, 155, 149])
predicted = np.array([134, 124, 132, 141, 149])
# Get SMAPE for python list as parameters
print("np array :",
calculate_smape(actual, predicted), "%")
# CALCULATE SMAPE FROM PANDAS DATAFRAME
# Define the pandas dataframe
sales_df = pd.DataFrame({
"actual" : [136, 120, 138, 155, 149],
"predicted" : [134, 124, 132, 141, 149]
})
# Get SMAPE for pandas series as parameters
print("pandas df:", calculate_smape(sales_df.actual,
sales_df.predicted), "%")
输出:
py list : 3.73 %
np array : 3.73 %
pandas df: 3.73 %
Explanation:
在该程序中,我们计算了同一数据集的SMAPE度量值,该数据集以3种不同的数据类型格式作为函数参数,即python list、NumPy array和pandas dataframe。该函数被泛化为可以处理任何类似python系列的数据作为输入参数。该函数首先将数据类型转换为Numpy数组,这样使用NumPy方法进行计算就变得容易了。返回语句可以通过以下图片来解释。