Середня абсолютна процентна помилка (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)

Див цей відповідь на stackOverflow- stackoverflow.com/questions/42250958 / ...
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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.