Erro percentual absoluto médio (MAPE) no Scikit-learn [fechado]


24

Como podemos calcular o erro médio percentual absoluto (MAPE) de nossas previsões usando Python e scikit-learn?

A partir dos documentos , temos apenas estas 4 funções métricas para regressões:

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

Consulte esta resposta em stackOverflow- stackoverflow.com/questions/42250958/…
Arpit Sisodia

Respostas:


24

Como observado (por exemplo, na Wikipedia ), o MAPE pode ser problemático. Mais especificamente, pode causar erros de divisão por zero. Meu palpite é que é por isso que não está incluído nas métricas do sklearn.

No entanto, é simples 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 qualquer outra 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

(Observe que estou multiplicando por 100 e retornando uma porcentagem.)

... mas com 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
Há um erro nesta resposta. Deve ser (substitua y_predpor y_trueem denominador):return np.mean(np.abs((y_true - y_pred) / y_true)) * 100
404pio

1
check_arraysfoi abandonado por scipy. Existe check_arrayno sklearn atual, mas não parece que funciona da mesma maneira.
kilojoules

O método check_arrays é removido de 0,16.
Arpit Sisodia


17

aqui está uma versão atualizada:

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.