Определение пользовательской функции измерения ошибки (sMAPE) - PullRequest
0 голосов
/ 03 января 2019

Я определяю пользовательскую функцию sMAPE (Симметричная средняя абсолютная процентная ошибка) в R. Я хочу добавить исключение в коде, где и фактическое, и прогнозируемое равны нулю.

Вот пример данных:

Фактический прогноз
0 0
2 1
1 0
2 4
2 1
1 3

Код показан ниже:

sMAAPE <- function(actual, predicted){
if (actual == 0 & predicted == 0){
    return(0)
       }
else {
  output<- mean(abs(actual-predicted)/(abs(actual)+abs(predicted)))
  return(output)
    }
  }

Как я уже говорил, я хочу добавить исключение, то есть, где бы ни фактическое, ни прогнозируемое не было, моя ошибка была бы равна нулю. Проблема с моим кодом состоит в том, что, когда он встречает и фактическое, и прогнозируемое значение 0 в первом наблюдении, он дает среднюю ошибку равной нулю, но на самом деле я хочу среднее значение всех ошибок.

Может кто-нибудь помочь мне с этим?

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Применение предложения @ akrun в комментариях к вашей проблеме.Я думаю, что это то, что вам нужно.

# Create a dataset    
Actual <- c(0,2,1,2,2,1)
Predicted <- c(0,1,0,4,1,3)
df <- data.frame(cbind(Actual, Predicted))
df


sMAAPE <- function(actual, predicted){
     output<- ifelse(actual == 0 & predicted == 0,0, # If actual and predicted are 0, error is 0 
     abs(actual- predicted)/(abs(actual)+abs(predicted))) # otherwise your function
     return(mean(output)) # Return mean of all errors
}

Вывод:

> sMAAPE(df$Actual, df$Predicted)
[1] 0.4166667

Что означает среднее значение для следующего вектора [1] 0 0.3333333 1.0000000 0.3333333 0.3333333 0.5000000

Вы можете добавить na.rm = T к средней функции, поэтому она также обрабатывает NA.

0 голосов
/ 03 января 2019

Проблема в том, что actual == 0 & predicted == 0 является логическим вектором, в то время как если вы поставите логический вектор в качестве условия предложения if, будет оцениваться только первый элемент.

Используйте sum(abs(actual))+sum(abs(predicted)) == 0 вместо этого в условии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...