Функция за точност: MAPE корекция

Опитвам се да прогнозирам почасовите посещения в спешната болница. За няколко часа действителната стойност е 0 и това е истински проблем, когато изчислявам MAPE за всеки модел. Видях този въпрос, където се предлага използването на MASE (средно абсолютно мащабирано грешка), която също е метрика, дадена от функцията точност (прогнозен пакет). В моя случай обаче това не е възможно, защото 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. Трябва да приложа това условие към всяка стойност на всяка прогноза (в случай, че имам няколко модела) и то трябва да върне средната стойност на всеки модел. Опитвам се да получа същия изход, както ако прилагах функцията за точност без никакви промени, това е, че имам нужда от ciblle с 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

person Diana Serrano    schedule 13.04.2020    source източник


Отговори (1)


Въз основа на бързо търсене онлайн това е известен недостатък на MAPE по отношение на времеви редове, които имат нулеви стойности в тях. Предложението е да използвате sMAPE. Ето страницата в wikipedia, която разгледах и имаше няколко други публикации в блогове, когато търсих: https://en.wikipedia.org/wiki/Mean_absolute_percentage_error

Отказ от отговорност: Въпреки че това трябва да е като коментар, тъй като не е точното решение, не мога да публикувам коментар, тъй като текущото ми класиране е под 50. Надявам се това да помогне.

person Sally_ar    schedule 13.04.2020
comment
Имам нужда от MAPE стойността, но ако не работи, sMAPE е еквивалентна алтернатива? Благодаря ти за помощта. - person Diana Serrano; 15.04.2020
comment
Няма проблем, препоръчвам, ако имате нужда от допълнително обяснение, да публикувате въпроса си в обмен на стекове. Също така научавам за MAPE и sMAPE и въз основа на това, което прочетох, това е добър заместител за този вид ситуации, но трябва да внимавате коя формула се използва за изчисляване на sMAPE. - person Sally_ar; 16.04.2020