Средняя абсолютная процентная ошибка (MAPE) в Scikit-learn [закрыто]

24

Как мы можем рассчитать среднюю абсолютную процентную ошибку (MAPE) наших прогнозов, используя Python и scikit-learn?

Из документов у нас есть только эти 4 метрические функции для регрессий:

  • 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
источник
Пошлите этот ответ на stackOverflow
Arpit Sisodia

Ответы:

24

Как отмечалось (например, в Википедии ), MAPE может быть проблематичным. Наиболее конкретно, это может вызвать ошибки деления на ноль. Я предполагаю, что именно поэтому он не включен в показатели sklearn.

Тем не менее, это просто реализовать.

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

Используйте как любой другой показатель ...:

> 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

(Обратите внимание, что я умножаю на 100 и возвращаю процент.)

... но с осторожностью:

> 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
В этом ответе есть ошибка. Должно быть (заменить y_predс y_trueв знаменателе):return np.mean(np.abs((y_true - y_pred) / y_true)) * 100
404pio
1
check_arraysбыл угроблен Сципи Есть check_arrayв текущем sklearn, но не похоже, что он работает так же.
килоджоулей
Метод check_arrays удален из .16.
Арпит Сисодия
17

вот обновленная версия:

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
Антонин Хосковец
источник