我正在使用留一法进行交叉验证。我有一个二进制响应,并且正在使用 R 的引导包和cv.glm 函数。我的问题是我不完全理解这个函数中的“成本”部分。据我所知,这是决定估计值应归类为 1 还是 0 的函数,即分类的阈值。它是否正确?
而且,在 R 的帮助中,他们将此函数用于二项式模型:cost <- function(r, pi = 0) mean(abs(r-pi) > 0.5)
. 我如何解释这个函数?所以我可以为我的分析正确修改它。
任何帮助表示赞赏,不想使用我不理解的功能。
我正在使用留一法进行交叉验证。我有一个二进制响应,并且正在使用 R 的引导包和cv.glm 函数。我的问题是我不完全理解这个函数中的“成本”部分。据我所知,这是决定估计值应归类为 1 还是 0 的函数,即分类的阈值。它是否正确?
而且,在 R 的帮助中,他们将此函数用于二项式模型:cost <- function(r, pi = 0) mean(abs(r-pi) > 0.5)
. 我如何解释这个函数?所以我可以为我的分析正确修改它。
任何帮助表示赞赏,不想使用我不理解的功能。
r 是包含实际结果的向量,pi 是包含拟合值的向量。
cost <- function(r, pi = 0) mean(abs(r-pi) > 0.5)
这是在说. 您可以定义自己的成本函数。在你的二进制分类的情况下,你可以做这样的事情
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 的答案已经很好地解释了您定义的成本函数的作用。但是,我想我会补充一点,成本函数用于计算 的delta
值cv.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)