R 的引导包中 cv.glm 的成本函数是什么?

机器算法验证 r 交叉验证
2022-01-21 14:04:35

我正在使用留一法进行交叉验证。我有一个二进制响应,并且正在使用 R 的引导包和cv.glm 函数我的问题是我不完全理解这个函数中的“成本”部分。据我所知,这是决定估计值应归类为 1 还是 0 的函数,即分类的阈值。它是否正确?

而且,在 R 的帮助中,他们将此函数用于二项式模型:cost <- function(r, pi = 0) mean(abs(r-pi) > 0.5). 我如何解释这个函数?所以我可以为我的分析正确修改它。

任何帮助表示赞赏,不想使用我不理解的功能。

3个回答

r 是包含实际结果的向量,pi 是包含拟合值的向量。

cost <- function(r, pi = 0) mean(abs(r-pi) > 0.5)

这是在说cost=|ripii|. 您可以定义自己的成本函数。在你的二进制分类的情况下,你可以做这样的事情

mycost <- function(r, pi){
    weight1 = 1 #cost for getting 1 wrong
    weight0 = 1 #cost for getting 0 wrong
    c1 = (r==1)&(pi<0.5) #logical vector - true if actual 1 but predict 0
    c0 = (r==0)&(pi>=0.5) #logical vector - true if actual 0 but predict 1
    return(mean(weight1*c1+weight0*c0))
  }

并将 mycost 作为参数放入 cv.glm 函数中。

cost <- function(r, pi = 0) mean(abs(r-pi) > 0.5)

首先,您将截止值设置为 0.5。您的 r 是 0/1,但 pi 是概率。因此,如果绝对误差大于 0.5,则单个成本为 1,否则为 0。然后,此函数计算平均错误率。但请记住,在定义成本函数之前已经设置了截止值。

实际上,我认为如果截止的选择由成本函数确定,则更有意义。

@SLi 的答案已经很好地解释了您定义的成本函数的作用。但是,我想我会补充一点,成本函数用于计算 的deltacv.glm,这是对交叉验证误差的度量。然而,关键delta是成本给出的每一折的误差的加权平均值。我们通过检查代码的相关位来看到这一点:

for (i in seq_len(ms)) {
    j.out <- seq_len(n)[(s == i)]
    j.in <- seq_len(n)[(s != i)]
    Call$data <- data[j.in, , drop = FALSE]
    d.glm <- eval.parent(Call)
    p.alpha <- n.s[i]/n # create weighting for averaging later
    cost.i <- cost(glm.y[j.out], predict(d.glm, data[j.out, 
        , drop = FALSE], type = "response"))
    CV <- CV + p.alpha * cost.i # add previous error to running total
    cost.0 <- cost.0 - p.alpha * cost(glm.y, predict(d.glm, 
        data, type = "response"))
}

函数返回的值为:

  list(call = call, K = K, delta = as.numeric(c(CV, CV + cost.0)), 
    seed = seed)