การแสดงภาพการสอบเทียบความน่าจะเป็นที่คาดการณ์ของแบบจำลอง


23

สมมติว่าฉันมีรูปแบบการทำนายที่สร้างความน่าจะเป็นสำหรับแต่ละคลาส ตอนนี้ฉันรู้แล้วว่ามีหลายวิธีในการประเมินโมเดลดังกล่าวหากฉันต้องการใช้ความน่าจะเป็นเหล่านั้นสำหรับการจัดหมวดหมู่ (ความแม่นยำการเรียกคืนและอื่น ๆ ) ฉันยังจำได้ว่าเส้นโค้ง ROC และพื้นที่ใต้นั้นสามารถใช้เพื่อกำหนดว่าแบบจำลองแตกต่างกันอย่างไรระหว่างคลาส นั่นไม่ใช่สิ่งที่ฉันถาม

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

ฉันได้ยินเรื่องแผนการ QQ (แต่ไม่เคยใช้) และในตอนแรกฉันคิดว่านี่คือสิ่งที่ฉันกำลังมองหา แต่ก็ดูเหมือนว่ามีความหมายจริงๆสำหรับการเปรียบเทียบสองการแจกแจงความน่าจะเป็น นั่นไม่ใช่สิ่งที่ฉันมี ฉันมีความน่าจะเป็นที่คาดการณ์ของฉันจากหลาย ๆ กรณีและไม่ว่าจะเกิดขึ้นจริงหรือไม่:

Index    P(Heads)    Actual Result
    1          .4            Heads
    2          .3            Tails
    3          .7            Heads
    4         .65            Tails
  ...         ...              ...

พล็อต QQ เป็นสิ่งที่ฉันต้องการจริงๆหรือฉันกำลังมองหาอย่างอื่นอยู่หรือ หากพล็อต QQ คือสิ่งที่ฉันควรจะใช้เป็นวิธีที่ถูกต้องในการแปลงข้อมูลของฉันเป็นการแจกแจงความน่าจะเป็นคืออะไร?

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

คำตอบ:


19

ความคิดของคุณเป็นสิ่งที่ดี

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

นี่คือตัวอย่าง (ใช้ R) ของวิธีการของ Tukey (ไม่เหมือนmletterกันทุกประการ: เขาใช้งานแตกต่างกันเล็กน้อย)

อันดับแรกให้สร้างการคาดการณ์และผลลัพธ์ที่สอดคล้องกับการคาดการณ์เหล่านี้:

set.seed(17)
prediction <- rbeta(500, 3/2, 5/2)
actual <- rbinom(length(prediction), 1, prediction)
plot(prediction, actual, col="Gray", cex=0.8)

พล็อตไม่ได้ให้ข้อมูลมากนักเนื่องจากactualค่าทั้งหมดเป็นของหลักสูตรทั้ง (ไม่เกิดขึ้น) หรือ (เกิดขึ้น) (ปรากฏเป็นพื้นหลังของวงกลมเปิดสีเทาในรูปแรกด้านล่าง) โครงเรื่องนี้ต้องปรับให้เรียบ ในการทำเช่นนั้นเราเก็บข้อมูลไว้ ฟังก์ชั่นจะแยกส่วนครึ่ง อาร์กิวเมนต์แรกคืออาร์เรย์ของแถวระหว่าง 1 ถึง(อาร์กิวเมนต์ที่สอง) มันจะส่งกลับตัวบ่งชี้ที่ไม่ซ้ำกัน (ตัวเลข) สำหรับแต่ละ bin:01mletterrn

mletter <- function(r,n) {
    lower <-  2 + floor(log(r/(n+1))/log(2))
    upper <- -1 - floor(log((n+1-r)/(n+1))/log(2))
    i <- 2*r > n
    lower[i] <- upper[i]
    lower
}

เมื่อใช้สิ่งนี้เราจะเก็บทั้งการทำนายและผลลัพธ์และค่าเฉลี่ยในแต่ละถัง ระหว่างทางเราคำนวณประชากร bin:

classes <- mletter(rank(prediction), length(prediction))
pgroups <- split(prediction, classes)
agroups <- split(actual, classes)
bincounts <- unlist(lapply(pgroups, length)) # Bin populations
x <- unlist(lapply(pgroups, mean))           # Mean predicted values by bin
y <- unlist(lapply(agroups, mean))           # Mean outcome by bin

เพื่อเป็นสัญลักษณ์พล็อตได้อย่างมีประสิทธิภาพเราควรทำให้พื้นที่สัญลักษณ์เป็นสัดส่วนกับจำนวนถัง มันจะมีประโยชน์ในการเปลี่ยนสีสัญลักษณ์เพียงเล็กน้อยด้วย:

binprop <- bincounts / max(bincounts)
colors <- -log(binprop)/log(2)
colors <- colors - min(colors)
colors <- hsv(colors / (max(colors)+1))

ด้วยสิ่งเหล่านี้ในมือเราได้ปรับปรุงพล็อตก่อนหน้านี้:

abline(0,1, lty=1, col="Gray")                           # Reference curve
points(x,y, pch=19, cex = 3 * sqrt(binprop), col=colors) # Solid colored circles
points(x,y, pch=1, cex = 3 * sqrt(binprop))              # Circle outlines

รูป

เป็นตัวอย่างของการทำนายที่ไม่ดีลองเปลี่ยนข้อมูล:

set.seed(17)
prediction <- rbeta(500, 5/2, 1)
actual <- rbinom(length(prediction), 1, 1/2 + 4*(prediction-1/2)^3)

การทำซ้ำการวิเคราะห์ทำให้เกิดพล็อตนี้ซึ่งการเบี่ยงเบนนั้นชัดเจน

รูปที่ 2

โมเดลนี้มีแนวโน้มที่จะมีมากเกินไป (ผลลัพธ์โดยเฉลี่ยสำหรับการคาดการณ์ในช่วง 50% ถึง 90% ต่ำเกินไป) ในบางกรณีที่การทำนายต่ำ (น้อยกว่า 30%) โมเดลจะมองในแง่ร้ายเกินไป


(+1) ดีมากขอบคุณ ฉันคิดว่าสีอาจเบี่ยงเบนความสนใจเล็กน้อยจากจุดประสงค์ แต่ส่วนที่เหลือเป็นแนวคิดที่ดีและคำอธิบายที่ดีมาก
Michael McGowan

ไมเคิลฉันพบว่าบางสีจำเป็นต้องช่วยดูวงกลมเล็ก ๆ ที่ปรากฏที่ปลายทั้งสองด้าน แน่นอนว่าสีคงที่จะทำให้สิ่งนี้สำเร็จแน่นอน เพียงแค่เปลี่ยนจากสีที่คุณต้องการเช่นcol=colors col="Red"
whuber

+1 นี่เป็นสิ่งที่ดีมาก อย่างไรก็ตามฉันไม่ได้ค่อนข้างฉลาดว่าทำไมเส้นอ้างอิงเป็นเส้นที่เรียบง่ายเส้นตรง 45 องศาแทนที่จะเป็นเส้นการถดถอยโลจิสติกที่เหมาะสมหรือเหลือง ฉันควรคิดว่าสิ่งเหล่านั้นจะเป็นการอ้างอิงที่เหมาะสมกว่าเพื่อพิจารณาคุณภาพของการทำนาย
gung - Reinstate Monica

@gung ลองคิดดูสิ: การคาดคะเนแม่นยำเมื่อผลลัพธ์นั้นสอดคล้องกับการทำนาย ดังนั้นในหมู่คอลเลกชันของการคาดการณ์ทั้งหมดที่อยู่ใกล้กับมันได้ดีกว่าเป็นกรณีที่ผลเฉลี่ยยังอยู่ใกล้กับพีความสัมพันธ์อื่นใดจะสะท้อนถึงความไม่ถูกต้อง โดยเฉพาะอย่างยิ่งคุณจะเสนอการวาด "สายการถดถอยโลจิสติกที่เหมาะสม" อย่างไร - ซึ่งดูเหมือนว่ามันอาจขยายไปถึงตามแกนหนึ่งหรือทั้งสอง - บนพล็อตที่จะต้องอยู่ในตารางหน่วย ? p ± [ 0 , 1 ] × [ 0 , 1 ]pp±[0,1]×[0,1]
whuber

@gung (รับ 2) สิ่งที่ฉันคิดว่าคุณอาจมีอยู่ในใจคือการปรับปรุงการสร้างภาพเพื่อการบัญชีสำหรับการเปลี่ยนแปลงที่คาดหวังในส่วนที่เหลือ การเปลี่ยนแปลงนั้นควรเป็นสัดส่วนกับสำหรับจุดที่เกี่ยวข้องกับการคาดการณ์ใกล้กับซึ่งประกอบด้วยการสังเกตการณ์จุด มันเป็นความท้าทายที่น่าสนใจที่จะคิดว่ามีประโยชน์อย่างยิ่งรวมกันวิธีที่จะเป็นตัวแทนที่เกี่ยวกับกราฟิกทางสถิติเช่นนี้ (ฉันคิดว่าคุณสามารถสร้างขีด จำกัด การทำนายได้ในแต่ละจุด ... ) pnp(1p)/npn
whuber

4

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

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

การถดถอยแบบไอโซโทปต่อความน่าจะเป็น

นี่คือการถดถอยแบบ Isotonic ซึ่งนำไปใช้กับปัญหาที่แสดงโดย Whuber

import numpy as np
import matplotlib.pyplot as plt
from sklearn.isotonic import IsotonicRegression

prediction = np.random.beta(3.0/2.0, 5.0/2.0, size=500)
actual = np.random.binomial(1,prediction, len(prediction))
plt.scatter(prediction, actual,  facecolors='none', edgecolors=[0.3,0.3,0.3], label='Data')

ir = IsotonicRegression()
isotonic = ir.fit_transform(prediction, actual)
plt.plot(prediction, isotonic,'ok', label='Isotonic Fit')

plt.xlabel('Prediction')
plt.ylabel('Actual')
plt.plot([0,1],[0,1], '--k', label='y=x line')
plt.legend(loc = 'center left')

http://fa.bianp.net/blog/2013/isotonic-regression/

http://stat.wikia.com/wiki/Isotonic_regression


0

คุณอาจต้องการดูแพ็คเกจ "การยืนยัน":

http://cran.r-project.org/web/packages/verification/index.html

มีพล็อตในบทความสั้น ๆ ที่อาจเป็นประโยชน์:

http://cran.r-project.org/web/packages/verification/vignettes/verification.pdf


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