如何用Python计算SMAPE

如何用Python计算SMAPE

在这篇文章中,我们将看到如何在Python中计算确定预测准确性的方法之一,即对称平均绝对百分比误差(或简称SMAPE)。

SMAPE是克服MAPE预测误差测量局限性的替代方法之一。与平均绝对百分比误差相比,SMAPE既有下限也有上限,因此,它被称为对称的。SMAPE中的’S’代表对称,’M’代表平均数,它包含了一个系列的平均值,’A’代表绝对值,它使用绝对值来防止正负误差相互抵消,’P’是百分比,使这个准确性指标成为相对指标,’E’代表误差,因为这个指标有助于确定我们预测的误差量。

SMAPE的公式。

如何用Python计算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方法进行计算就变得容易了。返回语句可以通过以下图片来解释。

如何用Python计算SMAPE?

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

Numpy教程