我试图使用R来评估一个简单预测模型的性能,方法是将预测结果离散为定义的区间,然后将它们与相应的实际值(Binned)进行比较。
我有两个向量,实际和预测,如下所示:
> actual <- c(0,2,0,0,41,1,3,5,2,0,0,0,0,0,6,1,0,0,15,1)
> predicted <- c(3.38,98.01,3.08,4.89,31.46,3.88,4.75,4.64,3.11,3.15,3.42,10.42,3.18,5.73,4.20,3.34,3.95,5.94,3.99)我要在这里表演。首先,将实际值分解/离散为不同的级别,例如: 0-5:第1 ** 6-10级:第2*41-45级:第9级。
现在,我不得不将“预测”的值也放入上面提到的桶中。我试图使用R中的cut()函数来实现这一点:
binCount <- 5
binActual <- cut(actual,labels=1:binCount,breaks=binCount)
binPred <- cut(predicted,labels=1:binCount,breaks=binCount)但是,如果您看到预测中的第二个元素(98.01)被标记为5,但它实际上并不在所期望的间隔内。我觉得用一个不同的binCount为预测的不会help.Can,请给出一个解决方案。
发布于 2014-10-01 11:43:22
我不能百分之百肯定你想做什么。
然而,据我所知,您希望返回每个向量的每个元素,以及它所在的类。给定一组考虑两个向量中任意一个值的类,实际值和预测值。
如果这是您想要做的,那么您的脚本(正如您所说的)将为0到45之间的值创建类。通过这个切分,你可以给你的第一个向量分类。
然后,为预测的向量创建一组新的类。分类已经不一样了。
假设我理解你想做的事,我宁愿写:
actual <- c(0,2,0,0,41,1,3,5,2,0,0,0,0,0,6,1,0,0,15,1)
predicted <- c(3.38,98.01,3.08,4.89,31.46,3.88,4.75,4.64,3.11,3.15,3.42,10.42,3.18,5.73,4.20,3.34,3.95,5.94,3.99)
temporary = c(actual, predicted)
maxi <- max(temporary)
mini <- min(temporary)
binCount <- 5
s <- seq(maxi, mini, length.out = binCount)
s = sort(s)
binActual <- cut(actual,breaks=s, include.lowest = T, labels = 1:(length(s)-1))
binPred <- cut(predicted,breaks=s, include.lowest = T, labels = 1:(length(s)-1))它规定:
> binActual
[1] 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Levels: 1 2 3 4
> binPred
[1] 1 4 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Levels: 1 2 3 4我不确定这是你要找的,所以告诉我,我也许能帮你。谨致问候。
发布于 2014-10-01 11:46:16
这是你想要的吗?
intervals <- cbind(seq(0, 40, length = 9), seq(5, 45, length = 9))
cutFixed <- function(x, intervals) {
sapply(x, function(x) ifelse(x < min(intervals) | x >= max(intervals), NA, which(x >= intervals[,1] & x < intervals[,2])))
}这将给出以下结果
> cutFixed(actual, intervals)
[1] 1 1 1 1 9 1 1 2 1 1 1 1 1 1 2 1 1 1 4 1
> cutFixed(predicted, intervals)
[1] 1 NA 1 1 7 1 1 1 1 1 1 3 1 2 1 1 1 2 1https://stackoverflow.com/questions/26140151
复制相似问题