0

我正在尝试使用 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)

我需要在这里执行分箱。首先,“实际”的值被分解/离散到不同的级别,例如: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进行预测将无济于事。有人可以为此提出解决方案吗?

4

2 回答 2

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

我不确定它是否是您正在寻找的东西,所以请告诉我,我也许可以帮助您。最好的祝愿。

于 2014-10-01T11:43:22.623 回答
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
于 2014-10-01T11:46:16.940 回答