我尝试使用R评估简单预测模型的性能,方法是通过将预测结果分类为定义的间隔来离散预测结果,然后将它们与相应的实际值(分箱)进行比较。
我有两个向量 实际 和 预测 ,如下所示:
> 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)
我需要在这里执行分箱。首先,&#39;实际&#39;被分解/离散化到不同的水平,比如说: 0-5:等级1 ** 6-10:等级2 ** ...... ** 41-45:等级9
现在,我已经预测了&#39;预测&#39;也进入上面提到的水桶。 我尝试使用R中的 cut() 函数实现此目的:
binCount <- 5
binActual <- cut(actual,labels=1:binCount,breaks=binCount)
binPred <- cut(predicted,labels=1:binCount,breaks=binCount)
但是,如果你看到预测中的第二个元素(98.01)被标记为5,但它实际上并没有落在所需的时间间隔内。 我觉得为 预测 使用不同的 binCount 将无济于事。任何人都可以为此建议一个解决方案吗?
答案 0 :(得分:2)
我不能100%确定你想做什么。
但是根据我的理解,你想要为每个向量的每个元素返回它所在的类。给定一组类,它考虑实际和预测的两个向量中的任何一个值。
如果这是你想要做的,那么你的脚本(如你所说)为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
我不确定这是你在寻找什么,所以让我知道,我也许可以帮助你。 祝福。
答案 1 :(得分:0)
这是你想要的吗?
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 1