Error porcentual absoluto medio (MAPE) en Scikit-learn [cerrado]

24

¿Cómo podemos calcular el error porcentual absoluto medio (MAPE) de nuestras predicciones usando Python y scikit-learn?

De los documentos , solo tenemos estas 4 funciones métricas para Regresiones:

  • 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
fuente
Consulte esta respuesta en stackOverflow- stackoverflow.com/questions/42250958/…
Arpit Sisodia

Respuestas:

24

Como se señaló (por ejemplo, en Wikipedia ), MAPE puede ser problemático. Lo más significativo es que puede causar errores de división por cero. Supongo que es por eso que no está incluido en las métricas de sklearn.

Sin embargo, es simple de implementar.

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

Use como cualquier otra métrica ...:

> 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

(Tenga en cuenta que estoy multiplicando por 100 y devolviendo un porcentaje).

... pero con precaución:

> 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 hombre
fuente
1
Hay un error en esta respuesta. Debe ser (reemplazar y_predcon y_truedenominador):return np.mean(np.abs((y_true - y_pred) / y_true)) * 100
404pio
1
check_arraysfue abandonado por scipy. Existe check_arrayen el sklearn actual, pero no parece que funcione de la misma manera.
kilojulios
El método check_arrays se elimina de .16.
Arpit Sisodia
17

Aquí hay una versión actualizada:

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
fuente