Erreur de pourcentage absolu moyen (MAPE) dans Scikit-learn [fermé]

24

Comment pouvons-nous calculer l'erreur de pourcentage absolu moyen (MAPE) de nos prédictions en utilisant Python et scikit-learn?

De la documentation , nous avons seulement ces 4 fonctions métriques pour les régressions:

  • metrics.explained_variance_score (y_true, y_pred)
  • metrics.mean_absolute_error (y_true, y_pred)
  • metrics.mean_squared_error (y_true, y_pred)
  • metrics.r2_score (y_true, y_pred)
Nyxynyx
la source
Reportez-vous à cette réponse sur stackOverflow- stackoverflow.com/questions/42250958/…
Arpit Sisodia

Réponses:

24

Comme indiqué (par exemple, dans Wikipedia ), MAPE peut être problématique. Plus précisément, il peut provoquer des erreurs de division par zéro. Je suppose que c'est pourquoi il n'est pas inclus dans les métriques sklearn.

Cependant, il est simple à mettre en œuvre.

from sklearn.utils import check_arrays
def mean_absolute_percentage_error(y_true, y_pred): 
    y_true, y_pred = check_arrays(y_true, y_pred)

    ## Note: does not handle mix 1d representation
    #if _is_1d(y_true): 
    #    y_true, y_pred = _check_1d_array(y_true, y_pred)

    return np.mean(np.abs((y_true - y_pred) / y_true)) * 100

Utilisez comme toute autre métrique ...:

> y_true = [3, -0.5, 2, 7]; y_pred = [2.5, -0.3, 2, 8]
> mean_absolute_percentage_error(y_true, y_pred)
Out[19]: 17.738095238095237

(Notez que je multiplie par 100 et que je renvoie un pourcentage.)

... mais avec prudence:

> y_true = [3, 0.0, 2, 7]; y_pred = [2.5, -0.3, 2, 8]
> #Note the zero in y_pred
> mean_absolute_percentage_error(y_true, y_pred)
-c:8: RuntimeWarning: divide by zero encountered in divide
Out[21]: inf
Un homme
la source
1
Il y a une erreur dans cette réponse. Devrait être (remplacer y_predpar y_trueau dénominateur):return np.mean(np.abs((y_true - y_pred) / y_true)) * 100
404pio
1
check_arraysa été abandonné par scipy. Il y a check_arraydans le sklearn actuel, mais il ne semble pas que cela fonctionne de la même manière.
kilojoules
La méthode check_arrays est supprimée de .16.
Arpit Sisodia
17

voici une version mise à jour:

import numpy as np

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
Antonín Hoskovec
la source