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


20

เรามีการสนทนาที่ดีมากมายเกี่ยวกับการแบ่งแยกที่สมบูรณ์แบบในการถดถอยโลจิสติก เช่นการถดถอยโลจิสติกใน R ทำให้เกิดการแยกที่สมบูรณ์แบบ (ปรากฏการณ์ Hauck-Donner) ตอนนี้คืออะไร และรูปแบบการถดถอยโลจิสติกไม่ได้มาบรรจบ

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


ดูโพสต์เก่านี้โดย Brian Ripley: math.yorku.ca/Who/Faculty/Monette/S-news/0027.html
kjetil b halvorsen

คำตอบ:


29

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

ก่อนอื่นเราลองถดถอยโลจิสติกโดยไม่ทำให้เป็นมาตรฐาน

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

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

ต่อไปเราลองถดถอยโลจิสติกด้วยการทำให้เป็นมาตรฐาน L2 (L1 คล้ายกัน)

  • ด้วยการตั้งค่าเดียวกันการเพิ่มการทำให้เป็นปกติของ L2 ที่มีขนาดเล็กมากจะเปลี่ยนฟังก์ชั่นวัตถุประสงค์ตามการแยกส่วนของข้อมูล

  • ในกรณีนี้เรามักจะมีวัตถุประสงค์ "นูน" ไม่ว่าจะมีการแยกข้อมูลเท่าไหร่

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

รหัส (ฉันยังใช้รหัสเดียวกันสำหรับคำตอบนี้: วิธีการทำให้เป็นมาตรฐานสำหรับการถดถอยโลจิสติก )

set.seed(0)  
d=mlbench::mlbench.2dnormals(100, 2, r=1)

x = d$x
y = ifelse(d$classes==1, 1, 0)

logistic_loss <- function(w){
  p    = plogis(x %*% w)
  L    = -y*log(p) - (1-y)*log(1-p)
  LwR2 = sum(L) + lambda*t(w) %*% w
  return(c(LwR2))
}

logistic_loss_gr <- function(w){
  p = plogis(x %*% w)
  v = t(x) %*% (p - y)
  return(c(v) + 2*lambda*w)
}

w_grid_v = seq(-10, 10, 0.1)
w_grid   = expand.grid(w_grid_v, w_grid_v)

lambda = 0
opt1   = optimx::optimx(c(1,1), fn=logistic_loss, gr=logistic_loss_gr, method="BFGS")
z1     = matrix(apply(w_grid,1,logistic_loss), ncol=length(w_grid_v))

lambda = 5
opt2   = optimx::optimx(c(1,1), fn=logistic_loss, method="BFGS")
z2     = matrix(apply(w_grid,1,logistic_loss), ncol=length(w_grid_v))

plot(d, xlim=c(-3,3), ylim=c(-3,3))
abline(0, -opt1$p2/opt1$p1, col='blue',  lwd=2)
abline(0, -opt2$p2/opt2$p1, col='black', lwd=2)
contour(w_grid_v, w_grid_v, z1, col='blue',  lwd=2, nlevels=8)
contour(w_grid_v, w_grid_v, z2, col='black', lwd=2, nlevels=8, add=T)
points(opt1$p1, opt1$p2, col='blue',  pch=19)
points(opt2$p1, opt2$p2, col='black', pch=19)

2
λ0+λ=ε

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