R中的RMSLE评估

时间:2016-06-11 12:58:40

标签: r

我正在寻求帮助,因为我已经被困在这段代码上一段时间了。我想用RMLSE(Root Mean Squared Logarithmic Error)评估我的回归模型,使用这段代码:

rmlse <- function(model) { 
  y <- testset$Counts
  y.pred <- predict(model, testset)
  return(sqrt(1/nrow(y)*sum((log(y.pred +1)-log(testset$Counts +1))^2)))
}

其中Counts是我的因变量。但是,这只会产生NaN。数据集中没有NA。我似乎无法弄清楚错误在哪里,如果有人能帮忙,我将不胜感激!

3 个答案:

答案 0 :(得分:1)

我认为您的问题位于nrow(y) y <- testset$Counts,因为y是一个向量而nrow(y)应该返回NULL。见这个例子:

set.seed(10)
mydat<-data.frame(a=1:10, b = rnorm(10), c = rpois(10, 1))

y<-mydat$a
nrow(y)
NULL

如果您将nrow()更改为length(),那么您应该没问题。

model<-lm(a~b+c, data = mydat[1:5,])
rmlse <- function(model) { 
  y <- mydat$a
  y.pred <- predict(model, mydat[6:10,])
  return(sqrt(1/length(y)*sum((log(y.pred +1)-log(mydat$a +1))^2)))
}

rmlse(model)
[1] 0.6234257

但请确保yy.pred最终长度相同,否则会引发错误,正如我之前发现的那样。我编辑它运行正常,但我想我会告诉你。如果它们的长度不同,您将得到:

Warning message:
  In log(y.pred + 1) - log(mydat$a + 1) :
  longer object length is not a multiple of shorter object length

答案 1 :(得分:0)

我遇到了同样的问题:如何解决NANa的错误-并计算出RMSLE!

如果条目包含负值,则log()将创建NAN。现在,如果您可以重新检查t.pred变量,则该变量应为负值。因此会产生NAN。

解决方案:计算RMSLE-将条目转换为abs():负值将转换为正值。

predicted_value = abs(预测值) actual_value = abs(actual_value)

SLE =(log(预测值+ 1)-log(实际值+ 1))^ 2

RMSLE = sqrt(平均值(SLE))

得分= 1 /(1 + exp(RMSLE))

注意:得分越高-性能越高。

答案 2 :(得分:0)

如果预测值小于 0,则对数的实际值不存在,因此结果为 nan 值。 您必须剪辑以下值: y_pred[y_pred<0]=0 对于 np.array y_pred=tf.clip_by_value(y_pred,clip_value_min=0,clip_value_max=np.inf) 用于张量