MAPE calculation in python
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.
Magg_rs
Updated on July 09, 2022Comments
-
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 about 6 yearsThis 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 almost 5 yearswouldn'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 about 4 yearsnp.mean(actual) could be replace for other criteria as very small float number, etc.
-
sareek over 2 yearssklearn 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.