Calibration Slope: Overfitting, ความสุดโต่ง และ Shrinkage

On this page
บทคัดย่อ
โมเดลทำนายอาจให้ระดับความเสี่ยงโดยรวมถูกต้อง แต่ยัง miscalibrated ได้ — ถ้ามัน over-fit การทำนายจะสุดโต่งเกินไป คือความเสี่ยงสูงสูงเกิน ความเสี่ยงต่ำต่ำเกิน รูปแบบนี้วัดด้วย calibration slope $B$ ซึ่งเป็นความชันของ outcome ที่สังเกตได้บน linear predictor ของโมเดล ค่าอุดมคติคือ $B=1$ ค่า slope ต่ำกว่า 1 คือลายนิ้วมือของ overfitting และบนกราฟ calibration จะเห็นเป็นเส้นที่แบนกว่าเส้น 45° และตัดผ่านมันตรงกลาง บทความนี้แยก slope ออกจาก level ประเมิน $B$ (ที่นี่ ≈ 0.57) และแสดงว่า shrinkage — $\text{logit}(p)=A+B\cdot\text{LP}$ ที่คูณทุกสัมประสิทธิ์ด้วย $B$ — หมุนเส้น calibration กลับมาแนบเส้นทแยงโดยไม่เปลี่ยนการจัดลำดับผู้ป่วย พร้อม dial ปรับ slope แบบโต้ตอบและ terminal R/Python ทีละบรรทัด บทความนี้เป็น Part 2 จากซีรีส์สามตอนเรื่อง calibration และ recalibration
Part 2 จาก 3 · Calibration & Recalibration. ก่อนหน้า: Part 1 — calibration in the large [[calibration-in-the-large]] ถัดไป: Part 3 — recalibration in practice [[recalibration-in-practice]]
ถูกโดยเฉลี่ย แต่ผิดที่การกระจาย
Part 1 แก้ "ระดับ" ความเสี่ยงโดยรวมด้วย intercept แต่โมเดลอาจผ่านการตรวจ calibration in the large — ค่าเฉลี่ยความเสี่ยงที่ทำนายใกล้อัตราที่เกิดจริง — และยังผิดได้ เพราะระดับไม่ได้บอกอะไรเกี่ยวกับ "การกระจาย" ของการทำนาย โมเดล over-fit เรียนรู้ noise ราวกับเป็น signal สัมประสิทธิ์จึงใหญ่เกินไป พูดด้วยความมั่นใจมากเกินไป ดันผู้ป่วยความเสี่ยงต่ำให้ต่ำเกินและความเสี่ยงสูงให้สูงเกิน ค่าเฉลี่ยยังลงตรงที่ได้ แต่ค่าสุดขั้วถูกขยายเกินจริงอย่างเป็นระบบ
โมเดลเดิมที่ระดับใช้ได้
ในกลุ่มจำลอง 3,000 คนของเรา อัตราการเกิดจริง ~31% และโมเดลเดิมทำนายเฉลี่ย ~34% — อัตราส่วน calibration in the large ราว 1.1 คือเกือบตรงเป้า "ระดับ" ไม่ใช่ปัญหาในที่นี้ ปัญหาคือผลของตัวแปรทำนายในโมเดลแรงเกินไป (slope ~1.6 ทั้งที่ความจริงคือ 1.0) ความเสี่ยงที่ทำนายจึงกระจายกว้างเกินไป
ภาพ: เส้นที่ตัดผ่านเส้นทแยง
วาดอัตราที่เกิดจริงเทียบกับความเสี่ยงที่ทำนาย แบ่งเป็นสิบส่วนตามความเสี่ยง โมเดลที่มั่นใจเกินจะให้เส้น calibration ที่ แบนกว่าเส้น 45° และตัดผ่านมัน ที่ปลายล่างอัตราที่เกิดจริง สูงกว่า ที่ทำนาย (โมเดลทำนายความเสี่ยงต่ำ ต่ำเกินไป) และที่ปลายบนอัตราที่เกิดจริง ต่ำกว่า ที่ทำนาย (ทำนายความเสี่ยงสูง สูงเกินไป) การทำนายกระจายออกไปไกลกว่าที่ความจริงรองรับ
ตัววัด: calibration slope $B$
เราวัดสิ่งนี้ด้วย calibration slope โดย regress outcome ที่สังเกตได้บน linear predictor ของโมเดล แล้วอ่านค่าความชัน
$$\text{logit}\{P(Y=1)\}=A+B\cdot\text{LP},\qquad \text{LP}=\hat\beta_0+\hat\beta_1x_1+\cdots+\hat\beta_kx_k.$$
ค่าอุดมคติคือ $B=1$ ตีความได้ว่า
- $B<1$ — การทำนายสุดโต่งเกินไป (overfitting) ความเสี่ยงสูงสูงเกิน ความเสี่ยงต่ำต่ำเกิน
- $B>1$ — การทำนายยังไม่สุดโต่งพอ
ในการจำลอง $B\approx0.57$ ต่ำกว่า 1 ชัดเจน ยืนยันการกระจายที่สุดโต่งเกิน ค่า $B=0.80$ จะบ่งว่าผลของตัวแปรทำนายต้องการ shrinkage ราว 20%
ลองหมุน dial ด้านล่างเพื่อดูโดยตรง ที่ $B=1.6$ โมเดลมั่นใจเกิน กด Fit B เพื่อกระโดดไปยัง slope ที่ fit แล้วทำให้เส้นแนบเส้นทแยง และ Reset เพื่อกลับ ค่าเฉลี่ยความเสี่ยงที่ทำนายถูกตรึงไว้ที่อัตราที่เกิดจริงตลอด คุณจึงดู "slope" อย่างเดียว
วิธีแก้: shrinkage
การ recalibrate slope คือใส่
$$\text{logit}(p_{\text{updated}})=A+B\cdot\text{LP},$$
ซึ่งดึงทุกการทำนายเข้าห่ากลางและหมุนเส้น calibration ลงบนเส้นทแยง เพราะ $B$ คูณ linear predictor ทั้งก้อน มันจึงคูณสัมประสิทธิ์เดิม ทุกตัว ด้วยค่าเดียวกัน
$$\beta_{j,\text{shrunk}}=B\cdot\beta_j.$$
ในตัวอย่าง สัมประสิทธิ์ของตัวแปรทำนาย shrink จาก ~1.6 ลงมา ~0.92 และ calibration slope ของโมเดลที่ recalibrate แล้วกลายเป็น 1.00 สำคัญคือ การคูณทุกการทำนายด้วยค่าคงที่บนสเกล log-odds ไม่เคยจัดลำดับผู้ป่วยใหม่ — discrimination ไม่เปลี่ยน shrinkage ทำให้โมเดลถ่อมตัวลง ไม่ได้ทำให้จัดลำดับดีขึ้น
ข้อควรระวัง — ทำไมจึงแทบไม่แก้ slope อย่างเดียว
มีจุดละเอียดที่ Part 3 จะขยาย การเปลี่ยน $B$ ยังเปลี่ยนค่าเฉลี่ยความเสี่ยงที่ทำนายด้วย การ update เฉพาะ slope จึงมักรบกวน calibration in the large — สิ่งที่ Part 1 เพิ่งแก้ การตรึง $A=0$ ขณะเปลี่ยน $B$ สมมติว่าระดับยังถูกต้องหลัง re-scale ซึ่งมักไม่สมเหตุผล ในทางปฏิบัติ เมื่อ slope ต้องแก้ ให้ประเมิน intercept และ slope พร้อมกัน $\text{logit}(p)=A+B\cdot\text{LP}$ — คือการ update พร้อมกันใน Part 3
ลองรันเอง — R และ Python
Terminal ด้านล่างรันการวิเคราะห์จริงทีละบรรทัดบนข้อมูลจำลอง คือ ใช้โมเดลเดิมที่มั่นใจเกินแต่ระดับใช้ได้ ยืนยัน calibration in the large ประเมิน calibration slope $B$ แล้วดูกราฟ calibration หมุนลงแนบเส้นทแยงหลัง shrinkage พิมพ์บรรทัดที่ไฮไลต์ (หรือกด Enter) กด Tab เพื่อรับคำที่ระบบเดา และสลับแท็บ R / Python ไม่มีการคำนวณในเบราว์เซอร์ ทุกค่าและกราฟถูกคำนวณไว้ก่อนแล้ว
โมเดลทำนายที่ให้ระดับความเสี่ยง โดยรวม ถูกต้อง ก็ยังพลาดได้ถ้ามันถูก over-fit จนทำนาย "สุดโต่งเกินไป" — สูงเกินไปสำหรับคนเสี่ยงสูง และต่ำเกินไปสำหรับคนเสี่ยงต่ำ เทอร์มินัลนี้รันการวิเคราะห์จริงทีละบรรทัดบนข้อมูล จำลอง 3,000 คน โมเดลเดิมที่ถูก "แช่แข็ง" มี intercept ที่ถูกต้อง (calibration in the large เกือบพอดี) แต่ slope ชันเกินไป เราวัดด้วย calibration slope (B) ได้ค่า ~0.57 (ต่ำกว่า 1 = ทำนายสุดโต่งเกิน) แล้วใช้ shrinkage คูณ linear predictor ด้วย B จนเส้น calibration ที่แบนเกินหมุนกลับมาแนบเส้นทแยง คุณเป็นคนพิมพ์เอง กด Enter เพื่อเติมและรัน กด Tab เพื่อรับคำที่ระบบเดา แผง Stage ด้านขวาจะโชว์ค่าและ กราฟ calibration ที่เปลี่ยนไป สลับแท็บ R / Python ได้ ไม่มีการคำนวณในเบราว์เซอร์ ทุกค่าและกราฟถูกคำนวณไว้ก่อนด้วย R และ Python
A prediction model can get the overall risk level right and still fail if it was over-fit — making predictions that are too extreme: too high for high-risk patients, too low for low-risk ones. This terminal runs the real analysis one line at a time on a simulated cohort of 3,000 patients. A frozen original model has the right intercept (calibration-in-the-large is about right) but too steep a slope. We measure it with the calibration slope (B) — here ~0.57, well below 1, the formal sign of too-extreme predictions — then apply shrinkage, multiplying the linear predictor by B until the too-flat calibration curve rotates back onto the 45° line. You drive it: press Enter to autofill and run, Tab to accept the autocomplete ghost, and the Stage on the right shows the numbers and the calibration plot changing. Switch between the R and Python tabs for the same analysis in either language. Nothing runs in your browser; every value and plot was computed in R and Python beforehand.
สรุปประเด็นสำคัญ
- Calibration slope $B$ วัดว่าการทำนายสุดโต่งเกิน ($B<1$, overfitting) หรือแบนเกิน ($B>1$) ค่าอุดมคติ $B=1$
- โมเดลอาจ calibrated in the large แต่มี $B<1$ — ระดับถูกแต่การกระจายเกินจริง บนกราฟเส้นตัดผ่านเส้นทแยง
- Shrinkage $\text{logit}(p)=A+B\cdot\text{LP}$ คูณทุกสัมประสิทธิ์ด้วย $B$ หมุนเส้นลงแนบเส้นทแยงโดยไม่เปลี่ยนลำดับผู้ป่วย
- การแก้ slope อย่างเดียวมักไม่สมเหตุผลเพราะรบกวนระดับ ให้ประเมิน $A$ และ $B$ พร้อมกัน (Part 3)
กลับไปที่ Part 1 — calibration in the large [[calibration-in-the-large]] หรือไปต่อ Part 3 — recalibration in practice [[recalibration-in-practice]] สำหรับการ update พร้อมกันด้วย validation ที่ซื่อตรง