MAPE calculation in python

51,737

Solution 1

In Python for compare by not equal need !=, not <>.

So need:

def mape_vectorized_v2(a, b): 
    mask = a != 0
    return (np.fabs(a - b)/a)[mask].mean()

Another solution from stats.stackexchange:

def mean_absolute_percentage_error(y_true, y_pred): 
    y_true, y_pred = np.array(y_true), np.array(y_pred)
    return np.mean(np.abs((y_true - y_pred) / y_true)) * 100

Solution 2

Both solutions are not working with zero values. This is working form me:

def percentage_error(actual, predicted):
    res = np.empty(actual.shape)
    for j in range(actual.shape[0]):
        if actual[j] != 0:
            res[j] = (actual[j] - predicted[j]) / actual[j]
        else:
            res[j] = predicted[j] / np.mean(actual)
    return res

def mean_absolute_percentage_error(y_true, y_pred): 
    return np.mean(np.abs(percentage_error(np.asarray(y_true), np.asarray(y_pred)))) * 100

I hope it helps.

Solution 3

The new version of scikit-learn (v0.24) has a function that will calculate MAPE. sklearn.metrics.mean_absolute_percentage_error

All what you need is two array-like variables: y_true storing the actual/real values, and y_pred storing the predicted values.

You can refer to the official documentation here.

Share:
51,737
Magg_rs
Author by

Magg_rs

Updated on July 09, 2022

Comments

  • Magg_rs
    Magg_rs almost 2 years

    I want to calculate Mean Absolute percentage error (MAPE) of predicted and true values. I found a solution from here, but this gives error and shows invalid syntax in the line mask = a <> 0

        def mape_vectorized_v2(a, b): 
        mask = a <> 0
        return (np.fabs(a - b)/a)[mask].mean() 
    
       def mape_vectorized_v2(a, b): 
           File "<ipython-input-5-afa5c1162e83>", line 1
             def mape_vectorized_v2(a, b):
                                           ^
         SyntaxError: unexpected EOF while parsing
    

    I am using spyder3. My predicted value is a type np.array and true value is dataframe

    type(predicted)
    Out[7]: numpy.ndarray
    type(y_test)
    Out[8]: pandas.core.frame.DataFrame
    

    How do i clear this error and proceed with MAPE Calculation ?

    Edit :

    predicted.head()
    Out[22]: 
       Total_kWh
    0   7.163627
    1   6.584960
    2   6.638057
    3   7.785487
    4   6.994427
    
    y_test.head()
    Out[23]: 
         Total_kWh
    79         7.2
    148        6.7
    143        6.7
    189        7.2
    17         6.4
    
    np.abs(y_test[['Total_kWh']] - predicted[['Total_kWh']]).head()
    Out[24]: 
       Total_kWh
    0        NaN
    1        NaN
    2        NaN
    3        NaN
    4   0.094427
    
  • Ehrendil
    Ehrendil about 6 years
    This is giving me a nan. Do you know when it would yield such a value? My second array contains values that are 0, how do I modify the latter solution to include such cases?
  • Robbie Cronin
    Robbie Cronin almost 5 years
    wouldn't the first function lead to negative MAPE values for negative values in a? Shouldn't the calculation be (np.fabs((a - b))/a)[mask].mean() where the denominator is also absolute?
  • Pablo Andrés Castañeda
    Pablo Andrés Castañeda about 4 years
    np.mean(actual) could be replace for other criteria as very small float number, etc.
  • sareek
    sareek over 2 years
    sklearn mean_absolute_percentage_error gives wrong value, even on this doc if you see the example given, the large value of 112589990684262.48 is obtained as result.