使用k倍交叉验证来评估R中的模型预测准确性

时间:2013-11-03 23:04:11

标签: r

我有一个符合lme4 pkg中的lmer()函数的glm。我使用ROCR pkg计算ROC下的面积(我的最佳模型为.899),并指定最佳截止点。我的截止点从0.47(如果我将灵敏度和特异性的总和最小化)略微变化到0.52(如果我最大化准确度)。两个截止规格的代码均在下面供参考。

#Minimizes the sum of sensitivity and specificity
> fpr <- prefClass@x.values[[1]]
> tpr <- prefClass@y.values[[1]]
> sum <- tpr + (1-fpr)
> index <- which.max(sum)
> cutoff <- prefClass@alpha.values[[1]][[index]]
> cutoff
[1] 0.4706331

#This code was used to maximize accuracy
> BMacc <- performance(predClass, measure="acc") 
> MaxAcc <- max(BMacc@y.values[[1]])
> UnlistXacc <- unlist(BMacc@x.values[[1]])
> CutoffAcc <- UnlistXacc[which.max(BMacc@y.values[[1]])]
> CutoffAcc
     112 
0.519942

我想看看如何选择一个切割点而不是其他效果预测误差,使用k折交叉验证来评估每个切割点的准确性。但是,查看cv.glm {boot}和CVbinary {DAAG}函数既没有指定切割点值的参数,也没有讨论正在使用的切割点。

如果我理解交叉验证的理论/方法,则需要有一个指定的切割点来将概率(模型拟合值从0到1)转换为离散的0和1。将模型0和1与观察到的0和1进行比较,然后对模型预测精度进行评估。

由于切割点通常设置为0.5,是上述函数的默认默认值吗?

用户如何指定所需的切割点来评估模型预测的准确性?

我查看了很多来源,并且只找到了上面的功能。由于这是一个常见的需要,我要么忽视某些东西,要么错误地理解k-fold CV。

任何想法都将不胜感激!

1 个答案:

答案 0 :(得分:1)

这里有几点。

  1. 使用0.5:如果您预测二元结果,逻辑模型或估计事件概率的任何类似类型的模型将使用0.5作为默认切点,因为那是高于该值的模型他说事件发生的可能性更大,而且事件不太可能。您可以根据需要更改切割点,但并不总是如此简单。这让我想到了第二点:

  2. 指定切割点:有两种方法可以指定切割点。一个是使用关于您正在建模的系统的先验知识。这可能包括以下思考过程:事件是非常罕见的,所以我们将设置高点以避免过多的误报或事件非常糟糕所以我们想要抓住它们中的很多。在后一种情况下,我们将切点设置得很低。您也可以使用模型的结果来更改切割点,但您必须小心。在用于拟合模型的相同数据集上计算时,模型性能的统计数据有偏差

  3. 为了避免偏见,您可以使用交叉验证。您可以轻松编程以使其灵活。它是这样的:

    n.subjects <- nrow(data)
    predictions <- 
    for(subject in 1:n.subjects) {
      subset <- data[-subject]
      # Fit Model
      # Find Cut point (using your code above)
      predicted.value <- predict(model)
      if (predicted.value < cut.point) {
        predictions[subject] <- 'No Event'
      } else {
        predictions[subject] <- 'Event'
      }
    }
    

    现在,您可以根据向量predictions查看模型的敏感性和特异性。这将允许您评估算法找到良好切割点的能力。

    更好的方法是将一些数据留作“验证”集。使用上面的代码,找到一个最佳切割点(调整算法,直到你满意为止,通过在整个数据集上拟合模型而不是验证集来获得切割点)。然后拟合“验证”集中的数据并计算模型性能。