Точность Функция: MAPE коррекция - PullRequest
1 голос
/ 13 апреля 2020

Я пытаюсь прогнозировать почасовые визиты в больницу ЭД. В течение нескольких часов фактическое значение равно 0, и это реальная проблема, когда я вычисляю MAPE для каждой модели. Я видел этот вопрос , где предлагается использовать MASE (средняя абсолютная масштабная ошибка), которая также является метри c, определяемой точностью функции (пакет прогноза). Однако в моем случае это невозможно, потому что MASE выдает NaN.

Итак, я пытаюсь изменить исходный код функции MAPE и использую только те функции, которые мне нужны для моего проекта: Сначала я попробовал это код для MAPE, но он не работает, поскольку .resid и .actual являются векторами.

root_squared_error <- function(.resid, na.rm = TRUE, ...){sqrt(MSE(.resid, na.rm = na.rm))}
Mean_Abs_error <- function(.resid, na.rm = TRUE, ...){ mean(abs(.resid), na.rm = na.rm)}    
Mean_Abs_percentage_error <- function(.resid, .actual, na.rm = TRUE, ...){
      if(.resid == 0){
        if(.actual == 0){
          mean(abs(0), na.rm = na.rm)  
        } else{
          mean(abs(100), na.rm = na.rm)
        }
      }
      mean(abs(.resid / .actual * 100), na.rm = na.rm)
    }

> accuracy(demand_fc_test,test,  measures = list(RMSE = root_squared_error, MAE = Mean_Abs_error, MAPE = Mean_Abs_percentage_error))
        # A tibble: 6 x 6
          .model    MTS    .type   RMSE     MAE  MAPE
          <chr>     <chr>  <chr>  <dbl>   <dbl> <dbl>
        1 Benchmark Blue   Test  0.459  0.192     Inf
        2 Benchmark Green  Test  3.07   2.16      Inf
        3 Benchmark Orange Test  0.579  0.280     Inf
        4 Benchmark Red    Test  0.0673 0.00453   100
        5 Benchmark White  Test  0.229  0.0516    Inf
        6 Benchmark Yellow Test  2.38   1.74      Inf
        Warning messages:
        1: In if (.resid == 0) { :
          the condition has length > 1 and only the first element will be used

Это сообщение об ошибке появляется 10 раз. После некоторых исследований я увидел примеры, когда функция ifelse решала подобные проблемы. Тем не менее, это не совсем работает, потому что он рассчитывает каждую ошибку для каждого значения и не представляет сводную таблицу.

Mean_Abs_percentage_error <- function(.resid, .actual, na.rm = TRUE, ...){
  ifelse(.resid == 0,
         ifelse(.actual == 0, 0, 100),
         abs(.resid / .actual * 100)
  )}

> accuracy(demand_fc_test,test,
+          measures = list(RMSE = root_squared_error, MAE = Mean_Abs_error, MAPE = Mean_Abs_percentage_error))
# A tibble: 13,248 x 6
   .model    MTS   .type  RMSE   MAE  MAPE
   <chr>     <chr> <chr> <dbl> <dbl> <dbl>
 1 Benchmark Blue  Test  0.459 0.192     0
 2 Benchmark Blue  Test  0.459 0.192     0
 3 Benchmark Blue  Test  0.459 0.192     0
 4 Benchmark Blue  Test  0.459 0.192     0
 5 Benchmark Blue  Test  0.459 0.192     0
 6 Benchmark Blue  Test  0.459 0.192     0
 7 Benchmark Blue  Test  0.459 0.192     0
 8 Benchmark Blue  Test  0.459 0.192     0
 9 Benchmark Blue  Test  0.459 0.192     0
10 Benchmark Blue  Test  0.459 0.192     0
# ... with 13,238 more rows

Я думаю, что проблема в том, как я использую функцию ifelse , Мне нужно применить это условие к каждому значению каждого прогноза (в случае, если у меня есть несколько моделей), и оно должно возвращать среднее значение каждой модели. Я пытаюсь получить тот же вывод, как если бы я применял функцию точности без каких-либо изменений, то есть мне нужна циблле с n строками и 6 столбцами, где n - количество моделей.

Любые предложения о том, как решить мою проблему? Заранее спасибо.

Пример моих данных:

library(fpp3)
library(fasster)
> dados
# A tsibble: 140,400 x 7 [1h] <UTC>
# Key:       MTS [6]
   Date                  Weekday  MTS     Demand   Temperature  DaysToHoliday DaysAfterHoliday
   <dttm>                <int>   <chr>    <int>       <dbl>         <int>            <int>
 1 2017-05-01 00:00:00    1       Blue     0          11.4            0                0
 2 2017-05-01 01:00:00    1       Blue     0          11.2            0                0
 3 2017-05-01 02:00:00    1       Blue     1          11.2            0                0
 4 2017-05-01 03:00:00    1       Blue     0          10.9            0                0
 5 2017-05-01 04:00:00    1       Blue     1          10.9            0                0

1 Ответ

1 голос
/ 13 апреля 2020

На основании быстрого поиска в Интернете это известный недостаток MAPE в отношении временных рядов, которые имеют нулевые значения в них. Предлагаем использовать sMAPE. Вот страница википедии, которую я посмотрел, и когда я искал пару других постов в блоге: https://en.wikipedia.org/wiki/Mean_absolute_percentage_error

Отказ от ответственности: хотя это должен быть комментарий, поскольку он не является точным Решение, я не могу оставить комментарий из-за моего текущего рейтинга ниже 50. Я надеюсь, что это помогает.

...