เพิ่มประสิทธิภาพ auc vs logloss ในปัญหาการจำแนกประเภทไบนารี


12

ฉันกำลังทำงานการจำแนกประเภทแบบไบนารีที่ความน่าจะเป็นผลลัพธ์อยู่ในระดับต่ำ (ไม่เกิน 3%) ฉันกำลังพยายามตัดสินใจว่าจะเพิ่มประสิทธิภาพโดย AUC หรือบันทึกการสูญเสีย เท่าที่ฉันเข้าใจ AUC จะเพิ่มความสามารถของโมเดลในการแยกแยะระหว่างคลาสขณะที่ logloss จะลงโทษความแตกต่างระหว่างความน่าจะเป็นจริงและประมาณ ในงานของฉันเป็นสิ่งสำคัญอย่างยิ่งในการสอบเทียบความถูกต้องแม่นยำ ดังนั้นฉันจะเลือก logloss แต่ฉันสงสัยว่ารูปแบบการบันทึกที่ดีที่สุดควรเป็น AUC / GINI ที่ดีที่สุดหรือไม่

คำตอบ:


12

ดังที่คุณพูดถึง AUC เป็นสถิติอันดับ (เช่นค่าคงที่ของขนาด) และการสูญเสียบันทึกเป็นสถิติการสอบเทียบ หนึ่งอาจสร้างแบบจำลองเล็กน้อยซึ่งมี AUC เดียวกัน แต่ล้มเหลวในการลดการสูญเสียบันทึกให้น้อยที่สุดโมเดลอื่น ๆ โดยการปรับค่าที่ทำนายไว้ พิจารณา:

auc <-  function(prediction, actual) {
  mann_whit <- wilcox.test(prediction~actual)$statistic
  1 - mann_whit / (sum(actual)*as.double(sum(!actual)))
}

log_loss <- function (prediction, actual) {
  -1/length(prediction) * sum(actual * log(prediction) + (1-actual) * log(1-prediction))
}

sampled_data <- function(effect_size, positive_prior = .03, n_obs = 5e3) {
  y <- rbinom(n_obs, size = 1, prob = positive_prior)
  data.frame( y = y,
              x1 =rnorm(n_obs, mean = ifelse(y==1, effect_size, 0)))
}

train_data <- sampled_data(4)
m1 <- glm(y~x1, data = train_data, family = 'binomial')
m2 <- m1
m2$coefficients[2] <- 2 * m2$coefficients[2]

m1_predictions <- predict(m1, newdata = train_data, type= 'response')
m2_predictions <- predict(m2, newdata = train_data, type= 'response')

auc(m1_predictions, train_data$y)
#0.9925867 
auc(m2_predictions, train_data$y)
#0.9925867 

log_loss(m1_predictions, train_data$y)
#0.01985058
log_loss(m2_predictions, train_data$y)
#0.2355433

ดังนั้นเราไม่สามารถพูดได้ว่าแบบจำลองการเพิ่ม AUC ให้มากที่สุดหมายถึงการลดการสูญเสียการบันทึก ไม่ว่ารูปแบบการลดการสูญเสียบันทึกจะสอดคล้องกับ AUC ที่ขยายใหญ่สุดหรือไม่นั้นจะขึ้นอยู่กับบริบทอย่างมากหรือไม่ ความสามารถในการแยกชั้น, แบบจำลองความลำเอียง ฯลฯ ในทางปฏิบัติเราอาจพิจารณาความสัมพันธ์ที่อ่อนแอ แต่โดยทั่วไปแล้วพวกเขามีวัตถุประสงค์ที่แตกต่างกัน ลองพิจารณาตัวอย่างต่อไปนี้ซึ่งทำให้การแยกชั้นเพิ่มขึ้น (ขนาดผลกระทบของตัวทำนายของเรา):

for (effect_size in 1:7) {
  results <- dplyr::bind_rows(lapply(1:100, function(trial) {
                                    train_data <- sampled_data(effect_size)
                                    m <- glm(y~x1, data = train_data, family = 'binomial')
                                    predictions <- predict(m, type = 'response')
                                    list(auc = auc(predictions, train_data$y),
                                         log_loss = log_loss(predictions, train_data$y),
                                         effect_size = effect_size)
                                  }))
  plot(results$auc, results$log_loss, main = paste("Effect size =", effect_size))
  readline()
}

effect_1

ป้อนคำอธิบายรูปภาพที่นี่


คำตอบที่ให้ข้อมูลมาก ในคำตอบของคุณมีการคาดการณ์สองประการโดยมี AUC เดียวกัน แต่มีการสูญเสียบันทึกที่แตกต่างกันมาก ดังนั้นฉันจึงมาถึงคำถามนี้: ฉันได้ฝึกฝนแบบจำลองเพื่อเพิ่มประสิทธิภาพ AUC แต่ต่อมาฉันรู้ว่าฉันต้องไปเพื่อบันทึกการสูญเสีย ฉันไม่สามารถสั่งสอนแบบจำลองใหม่สำหรับบันทึกการสูญเสีย (ซึ่งควรเป็นกรณีที่เหมาะ) ฉันสามารถใช้การแปลงใด ๆ กับการคาดการณ์เพื่อให้มีการสูญเสียบันทึกที่ดีที่สุด (บันทึกการสูญเสียที่พิจารณาที่นี่คือความหมายไบนารีความน่าจะเป็นอ้างอิงคือ 1 หรือ 0)
Rajesh Dachiraju

1
แบบจำลองของคุณประมาณการอะไร การสูญเสียบันทึกมีเหตุผลก็ต่อเมื่อคุณสร้างความน่าจะเป็นด้านหลังซึ่งไม่น่าเป็นไปได้สำหรับรุ่นที่ได้รับการเพิ่มประสิทธิภาพของ AUC สถิติอันดับเช่น AUC พิจารณาลำดับการคาดคะเนเท่านั้นดังนั้นขนาดของช่องว่างระหว่างการทำนายจึงไม่เกี่ยวข้อง ชัดเจนว่านี่ไม่ใช่กรณีของความน่าจะเป็น การปรับขนาดใด ๆ ที่คุณทำกับการคาดการณ์ AUC ที่ปรับปรุงแล้วของคุณจะต้องแก้ไขปัญหานี้ นอกจากนี้สิ่งนี้จะเน้นเฉพาะการปรับเทียบการคาดคะเนของคุณที่มีต่อการประมาณการหลังที่เหมาะสมไม่ใช่การย่อขนาดทั่วโลกของ LL ดังที่อธิบายไว้ในโพสต์นี้
khol

1
คุณอาจสนใจแพลตสเกลเป็นจุดเริ่มต้น
khol

ฉันเข้าใจว่าไม่ใช่ทั่วโลก ฉันแค่ต้องการตั้งค่าการแปลงที่อาจมีพารามิเตอร์แล้วเล่นกับมัน
Rajesh Dachiraju

1

ป้ายขาดดุลพื้นที่ใต้เส้นโค้งแม่นยำเรียกคืนเป็นที่นิยม AUC ( https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4349800/หรืองูหลาม scikit เรียนรู้เอกสาร )

นอกจากนี้หากเป้าหมายของคุณคือเพิ่มความแม่นยำสูงสุดคุณสามารถลองทำการตรวจสอบความถูกต้องไขว้กันเพื่อเลือกแบบจำลองที่ดีที่สุด (อัลกอริทึม + พารามิเตอร์ไฮเปอร์พารามิเตอร์) โดยใช้ "ความแม่นยำ" เป็นตัวชี้วัดประสิทธิภาพ


2
ฉันลงคะแนนด้วยเหตุผลบางอย่างที่นี่ 1) คุณควรอ้างถึงแหล่งที่มาหรือเหตุผลสำหรับคำสั่งแรกของคุณ 2) คุณจะปรับความแม่นยำอย่างแม่นยำที่สุดอย่างไร? สิ่งนั้นจะไม่สร้างแบบจำลองที่เสื่อมโทรมหรือ
Matthew Drury

2
ขอบคุณที่ช่วยฉันตอบคำถามได้ดีขึ้น ฉันเพิ่มการอ้างอิง 2 รายการ และคุณเพิ่มประสิทธิภาพเพื่อความแม่นยำอย่างไร เช่นเดียวกับการวัดอื่น ๆ คุณเพียงระบุ "ความแม่นยำ" เป็นฟังก์ชันการให้คะแนนของคุณตัวอย่างเช่นใน scikit-Learn ความแม่นยำเป็นตัวชี้วัดเช่นความแม่นยำ AUC ฯลฯ
พอล

อ่าแน่นอน แต่ฉันคิดว่าเมื่อมีคนอ่าน "การเพิ่มประสิทธิภาพ" พวกเขาจะถือว่ามันอยู่ในระหว่างการฝึกอบรมโมเดลของคุณ ฉันคิดว่า sklearn ทำสิ่งนี้ผิดเพราะใช้เกณฑ์การจำแนกแบบคงที่และคุณควรปรับจูนด้วยการตรวจสอบข้าม
Matthew Drury

1
ใช่ตอนนี้ฉันเห็นว่า "การเพิ่มประสิทธิภาพ" อาจทำให้เกิดความสับสน ไม่แน่ใจว่า OP หมายถึงมันอย่างไร สำหรับฉันมันเหมือนที่คุณพูดว่า: ปรับแต่งพารามิเตอร์หลายมิติผ่านทาง CV เพื่อเพิ่มความแม่นยำให้สูงสุด และฉันคิดว่านั่นเป็นวิธีที่คุณใช้ใน sklearn เช่นกัน
พอล

แน่นอนว่าฉันคิดว่าคำตอบของคุณจะได้รับการปรับปรุงที่นี่ถ้าคุณเพิ่มการชี้แจงนั้น หัวข้อออกเล็กน้อย แต่จริง ๆ แล้วฉันคิดว่า sklearn ค่อนข้างยากจนในการสนับสนุนเนื่องจากมันปรับแต่งตามเกณฑ์การจัดหมวดหมู่คงที่ซึ่งฉันจะโต้แย้งก็คือการปฏิบัติที่ไม่ดี
Matthew Drury
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.