我正在寻求帮助,因为我已经被困在这段代码上一段时间了。我想用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。我似乎无法弄清楚错误在哪里,如果有人能帮忙,我将不胜感激!
答案 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
但请确保y
和y.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) 用于张量