คำจำกัดความที่แน่นอนของการวัด Deviance ในแพ็คเกจ glmnet พร้อม crossvalidation?


12

สำหรับการวิจัยปัจจุบันของฉันฉันใช้วิธี Lasso ผ่านแพ็คเกจ glmnet ใน R บนตัวแปรที่ขึ้นกับทวินาม

ใน glmnet แลมบ์ดาที่ดีที่สุดจะพบได้ผ่านการตรวจสอบข้ามและแบบจำลองผลลัพธ์สามารถนำมาเปรียบเทียบกับมาตรการต่าง ๆ เช่นข้อผิดพลาดการแบ่งประเภทหรือการเบี่ยงเบน

คำถามของฉัน: กำหนด deviance ใน glmnet อย่างไร มันคำนวณอย่างไร

(ในกระดาษที่สอดคล้องกัน "เส้นทางการทำให้เป็นมาตรฐานสำหรับโมเดลเชิงเส้นทั่วไปผ่านพิกัดโคตร" โดย Friedman et al. ฉันพบเฉพาะความคิดเห็นนี้เกี่ยวกับการเบี่ยงเบนที่ใช้ใน cv.glmnet: "หมายถึงการเบี่ยงเบน (ลบสองเท่า ข้อมูล) "(หน้า 17))


มันเหมือนกับความเบี่ยงเบนที่ใช้ในglm(หรืออย่างน้อยก็ควรเป็น - มันมีเพียงนิยามเดียวของความเบี่ยงเบนที่ฉันทราบ)
Hong Ooi

ใช่ แต่ฉันคิดว่าพวกเขาขยายมันในบางวิธีตามที่ระบุไว้โดยอ้างในโพสต์แรกของฉัน Deviance ที่ฉันเข้าใจสามารถเปรียบเทียบประสิทธิภาพของทั้งสองรุ่น แต่ผู้แต่งจะรวมข้อมูลด้านซ้ายของการตรวจสอบความถูกต้องไ "ลบความน่าจะเป็นสองเท่าของข้อมูลออกทางด้านซ้าย" มีเหตุผลอย่างไร
Jo Wmann

1
เอาล่ะขอบคุณตอนนี้ฉันคิดว่าฉันได้รับแล้ว: ความเบี่ยงเบนหมายถึง -2 * บันทึกความน่าจะเป็นหรือมากกว่า (2 * บันทึกความน่าจะเป็น) / / สิ่งนี้ยังอธิบายด้วยว่าทำไมการเบี่ยงเบนของพวกเขาถึงค่าต่าง ๆ ของแลมบ์ดาไม่เกินช่วง 0,2 โมเดลถูกประเมินบน k-1 เท่าของการตรวจสอบความถูกต้องไขว้และนำไปใช้กับโฟลด์ที่เหลือ สำหรับแอปพลิเคชันบนแผ่นพับที่เหลือจะคำนวณคะแนนความน่าจะเป็น นี่คือการทำซ้ำ k ครั้งและค่าเฉลี่ยของผลลัพธ์ k สำหรับแลมบ์ดาแต่ละอันของค่าเบี่ยงเบนที่กำหนดไว้ด้านบนจะถูกส่งคืน
Jo Wmann

1
ใช่มันถูกเฉลี่ยโดยเฉลี่ยทุกครั้งสำหรับแลมบ์ดาแต่ละครั้ง ฉันคิดว่าคุณสามารถใช้ความเบี่ยงเบนโดยตรงหรืออัตราส่วน wrt กับแบบจำลอง null ซึ่งอาจเป็นรูปแบบการสกัดกั้นเท่านั้น มีสองข้อผิดพลาด: ก) การพับอาจไม่เท่ากันทุกจุดข้อมูล b) การพับแต่ละครั้งมีข้อมูลที่แตกต่างกัน (ตามธรรมชาติ) เพื่อแก้ไข (a) คุณสามารถแบ่งความเบี่ยงเบนตามจำนวนจุดข้อมูลในการพับที่เลือก เพื่อแก้ไข (a) และ (b) ในเวลาเดียวกันใช้วิธีอัตราส่วน โมเดล deviance สมมติว่าชุดข้อมูลนั้นเหมือนกันในแต่ละโมเดล (ความคิดเดียวกันในการประมาณค่า MAP ที่พวกเขาเพิกเฉยต่อตัวส่วน)
Cagdas Ozgenc

1
อย่างไรก็ตามเมื่อพับเข้าไปในภาพตัวส่วนจะไม่เหมือนกันในการพับ ดังนั้นอัตราส่วนจะดูแลโดยการยกเลิกตัวส่วน แต่ฉันไม่รู้ว่าปัญหาใหญ่แค่ไหนเมื่อคุณเฉลี่ยมากกว่าเท่า
Cagdas Ozgenc

คำตอบ:


9

ในFriedman, Hastie และ Tibshirani (2010)การเบี่ยงเบนของแบบจำลองทวินามเพื่อจุดประสงค์ในการตรวจสอบข้าม

ลบความน่าจะเป็นในการบันทึกข้อมูลที่เหลือ (หน้า 17)

ระบุว่านี่เป็นกระดาษที่อ้างถึงในเอกสารประกอบสำหรับglmnet (ในหน้า 2 และ 5) นั่นอาจเป็นสูตรที่ใช้ในแพ็คเกจ

และแน่นอนในซอร์สโค้ดสำหรับฟังก์ชั่นcvlognetส่วนเบี่ยงเบนส่วนเบี่ยงเบนสำหรับการตอบสนองจะถูกคำนวณเป็น

-2*((y==2)*log(predmat)+(y==1)*log(1-predmat))

อยู่ที่ไหนpredmatง่ายๆ

predict(glmnet.object,x,lambda=lambda)

และส่งผ่านจากcv.glmnetฟังก์ชั่นการเข้ารหัส ฉันใช้ซอร์สโค้ดที่มีอยู่ในหน้า JStatSoft สำหรับกระดาษและฉันไม่รู้ว่าโค้ดนั้นทันสมัย รหัสสำหรับแพ็คเกจนี้เรียบง่ายและอ่านง่าย glmnet:::cv.glmnetคุณสามารถตรวจสอบตัวเองโดยการพิมพ์


1

นอกจากคำตอบของ @shadowtalker เมื่อฉันใช้แพ็คเกจ glmnet ฉันรู้สึกว่าความเบี่ยงเบนในการตรวจสอบความถูกต้องไขว้กันเป็นเรื่องปกติ

library(glmnet)
data(BinomialExample)

fit = cv.glmnet(x,y, family = c("binomial"), intercept = FALSE)
head(fit$cvm) # deviance from test samples at lambda value

# >[1] 1.383916 1.359782 1.324954 1.289653 1.255509 1.223706

# deviance from (test samples? all samples?) at lambda value
head(deviance(fit$glmnet.fit))

# >[1] 138.6294 134.5861 131.1912 127.1832 122.8676 119.1637

Ref: เอกสาร deviance R

เพราะถ้าฉันทำแผนก

head(deviance(fit$glmnet.fit)) / length(y))

ผลลัพธ์ที่ได้คือ

[1] 1.386294 1.345861 1.311912 1.271832 1.228676 1.191637

ซึ่งอยู่ใกล้กับพอดีกับ $ cvm

นี่อาจเป็นสิ่งที่ความคิดเห็นจาก @Hong Ooi พูดในคำถามนี้:

/programming/43468665/poisson-deviance-glmnet

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