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)

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.