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