Mittlerer absoluter prozentualer Fehler (MAPE) in Scikit-Learn [geschlossen]


23

Wie können wir den mittleren absoluten prozentualen Fehler (MAPE) unserer Vorhersagen mit Python und Scikit-Learn berechnen?

Aus den Dokumenten haben wir nur diese 4 Metrikfunktionen für Regressionen:

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

Lesen Sie diese Antwort auf stackOverflow- stackoverflow.com/questions/42250958/…
Arpit Sisodia

Antworten:


23

Wie bereits erwähnt (zum Beispiel in Wikipedia ), kann MAPE problematisch sein. Insbesondere kann es zu Fehlern beim Teilen durch Null kommen. Ich vermute, dass dies der Grund ist, warum es nicht in den sklearn-Metriken enthalten ist.

Es ist jedoch einfach zu implementieren.

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

Verwenden Sie wie jede andere Metrik ...:

> 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

(Beachten Sie, dass ich mit 100 multipliziere und einen Prozentsatz zurückgebe.)

... aber mit Vorsicht:

> 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
Diese Antwort enthält einen Fehler. Sollte sein (ersetzen y_predmit y_trueim Nenner):return np.mean(np.abs((y_true - y_pred) / y_true)) * 100
404pio

1
check_arrayswurde von scipy fallen gelassen. Es gibt es check_arrayin der aktuellen Version, aber es sieht nicht so aus, als ob es auf die gleiche Weise funktioniert.
Kilojoule

Die Methode check_arrays wurde aus .16 entfernt.
Arpit Sisodia


16

Hier ist eine aktualisierte Version:

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.