web-dev-qa-db-fra.com

Calcul MAPE en python

Je veux calculer l'erreur moyenne absolue en pourcentage (MAPE) des valeurs prédites et vraies. J'ai trouvé une solution de ici , mais cela donne une erreur et montre une syntaxe invalide dans la ligne 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

J'utilise spyder3. Ma valeur prédite est un type np.array et la vraie valeur est dataframe

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

Comment puis-je supprimer cette erreur et procéder au calcul MAPE?

Éditer :

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
6
Magg_rs

In python pour comparer par besoin non égal !=, ne pas <>.

Besoin donc:

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

Une autre solution de 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
24
jezrael

Les deux solutions ne fonctionnent pas avec des valeurs nulles. Cela fonctionne de moi:

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

J'espère que ça aide.

Étant donné que les valeurs réelles peuvent également être des zéros, je prends la moyenne des valeurs réelles dans le dénominateur, au lieu des valeurs réelles:

Error = np.sum(np.abs(np.subtract(data_4['y'],data_4['pred'])))
Average = np.sum(data_4['y'])
MAPE = Error/Average
0
Satyam Anand