Errore percentuale assoluto medio (MAPE) in Scikit-learn [chiuso]


24

Come possiamo calcolare l'errore percentuale assoluta media (MAPE) delle nostre previsioni usando Python e scikit-learn?

Dai documenti , abbiamo solo queste 4 funzioni metriche per Regressions:

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

Fare riferimento questa risposta su stackOverflow- stackoverflow.com/questions/42250958/...
Arpit Sisodia

Risposte:


24

Come notato (ad esempio, in Wikipedia ), MAPE può essere problematico. Soprattutto, può causare errori di divisione per zero. La mia ipotesi è che questo è il motivo per cui non è incluso nelle metriche sklearn.

Tuttavia, è semplice da implementare.

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

Usa come qualsiasi altra metrica ...:

> 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

(Nota che sto moltiplicando per 100 e restituendo una percentuale.)

... ma con cautela:

> 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
C'è un errore in questa risposta. Dovrebbe essere (sostituire y_predcon y_truein denominatore):return np.mean(np.abs((y_true - y_pred) / y_true)) * 100
404pio

1
check_arraysfu abbandonato da Scipy. C'è check_arrayl'attuale sklearn ma non sembra che funzioni allo stesso modo.
kilojoules,

Il metodo check_arrays è stato rimosso da .16.
Arpit Sisodia,


17

ecco una versione aggiornata:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.