ฟังก์ชั่นค่าใช้จ่ายใน cv.glm ในแพ็คเกจการบูตของ R คืออะไร?


14

ฉันกำลังทำการตรวจสอบความถูกต้องโดยใช้วิธีการตรวจสอบ ผมมีการตอบสนองไบนารีและกำลังใช้แพคเกจการบูตสำหรับ R และฟังก์ชั่น cv.glm ปัญหาของฉันคือฉันไม่เข้าใจส่วน "ต้นทุน" ในฟังก์ชั่นนี้ จากสิ่งที่ฉันสามารถเข้าใจได้นี่คือฟังก์ชั่นที่ตัดสินว่าควรประเมินค่าที่ประมาณว่าเป็น 1 หรือ 0 นั่นคือค่าเกณฑ์สำหรับการจำแนกประเภท ถูกต้องหรือไม่

cost <- function(r, pi = 0) mean(abs(r-pi) > 0.5)และในความช่วยเหลือในการวิจัยที่พวกเขาใช้ฟังก์ชั่นนี้สำหรับรูปแบบทวินาม: ฉันจะตีความฟังก์ชั่นนี้ได้อย่างไร? ดังนั้นฉันสามารถแก้ไขได้อย่างถูกต้องสำหรับการวิเคราะห์ของฉัน

ความช่วยเหลือใด ๆ ที่ได้รับการชื่นชมไม่ต้องการที่จะใช้ฟังก์ชั่นที่ฉันไม่เข้าใจ

คำตอบ:


9

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
|ripi|0.5
|ripi|=112

@ feng-mai pi == 0 หรือ pi <0.5? (และ pi == 1 หรือ pi> 0.5?) หากใช้ 0.5 เป็นขอบเขตการตัดสินใจ ปี่ไม่ใช่ความน่าจะเป็นที่ทำนายไว้หรือไม่
PM

1
พีผม

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

ก่อนอื่นคุณต้องตัดค่าเป็น 0.5 r ของคุณคือ 0/1 แต่ pi คือความน่าจะเป็น ดังนั้นราคาแต่ละรายการคือ 1 ถ้าข้อผิดพลาดสัมบูรณ์มากกว่า 0.5 มิฉะนั้น 0 จากนั้นฟังก์ชันนี้จะคำนวณอัตราความผิดพลาดเฉลี่ย แต่โปรดจำไว้ว่าการตั้งค่าการตัดออกก่อนที่คุณจะกำหนดฟังก์ชันต้นทุนของคุณ

ที่จริงแล้วฉันคิดว่ามันสมเหตุสมผลดีกว่าหากตัวเลือกการตัดถูกกำหนดโดยฟังก์ชันต้นทุน


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)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.