2

我有一个适合 lme4 pkg 中的 lmer() 函数的 glm。我使用 ROCR pkg 计算 ROC 下的面积(我的最佳模型为 0.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。

任何想法将不胜感激!

4

1 回答 1

1

这里有几点。

  1. 0.5 的使用:如果您要预测二元结果,逻辑模型或任何类似类型的估计事件概率的模型将使用 0.5 作为默认切点,因为该值高于该值,模型表示事件更有可能发生在它之下发生事件的可能性较小。您可以根据需要更改切点,但它并不总是像看起来那么简单。这让我想到了第二点:

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

为了避免偏见,您可以使用交叉验证。很容易对自己进行编程以使其灵活。它是这样的:

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。这将允许您评估您的算法找到一个好的切点的能力。

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

于 2013-11-04T20:20:20.613 回答