R的启动程序包中cv.glm中的cost函数是什么?


14

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

并且,在R的帮助下,他们将此函数用于二项式模型:cost <- function(r, pi = 0) mean(abs(r-pi) > 0.5)。如何解释此功能?因此我可以正确修改它以进行分析。

感谢您提供任何帮助,不想使用我不了解的功能。

Answers:


9

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

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

CØsŤ=|[R一世-p一世一世|

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函数中。


CØsŤ
|[R一世-p一世|0.5
|[R一世-p一世|=1个1个2

@ feng-mai pi == 0或pi <0.5?(且pi == 1或pi> 0.5?),如果使用0.5作为决策边界。圆周率不是预测的概率吗?
PM。

1
p一世

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

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

实际上,我认为,如果选择截止点是由成本函数决定的,那将更有意义。


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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.