เส้นโค้ง overfitting ข้อมูลหรือไม่


47

ปัญหาของฉัน : เมื่อเร็ว ๆ นี้ฉันได้พบกับนักสถิติที่แจ้งให้ฉันทราบว่าเส้นโค้งนั้นมีประโยชน์สำหรับการสำรวจข้อมูลเท่านั้นและอาจมีการ overfitting ดังนั้นจึงไม่มีประโยชน์ในการทำนาย เขาชอบสำรวจด้วยพหุนามอย่างง่าย ๆ ... เนื่องจากฉันเป็นแฟนตัวยงของเส้นโค้งและสิ่งนี้ขัดกับสัญชาตญาณของฉันฉันสนใจที่จะค้นหาว่าข้อโต้แย้งเหล่านี้มีเหตุผลเพียงใดและถ้ามีกลุ่มต่อต้านจำนวนมาก - นักเคลื่อนไหวออกไปที่นั่น?

ข้อมูลประกอบ : ฉันพยายามติดตาม Frank Harrell กลยุทธ์การสร้างแบบจำลองการถดถอย (1) เมื่อฉันสร้างแบบจำลอง เขาให้เหตุผลว่าลูกบาศก์ splines ที่ จำกัด เป็นเครื่องมือที่ถูกต้องสำหรับการสำรวจตัวแปรต่อเนื่อง นอกจากนี้เขายังระบุว่าชื่อพหุนามน่าสงสารในการสร้างแบบจำลองความสัมพันธ์บางอย่างเช่นเกณฑ์ลอการิทึม (2) สำหรับการทดสอบความเป็นเชิงเส้นของแบบจำลองเขาแนะนำการทดสอบ ANOVA สำหรับเส้นโค้ง:

H0:β2=β3==βk1=0

ฉัน googled สำหรับ overfitting กับ splines แต่ไม่พบว่ามีประโยชน์มาก (นอกเหนือจากคำเตือนทั่วไปเกี่ยวกับการไม่ใช้ knots มากเกินไป) ในฟอรั่มนี้ดูเหมือนว่าจะมีการตั้งค่าสำหรับการสร้างแบบจำลองเส้นโค้งเป็นKolassa , ฮาร์เรล , ยินดีปรีดา

ฉันพบหนึ่งโพสต์ในบล็อกเกี่ยวกับชื่อพหุนามปีศาจของ overfittingที่พูดคุยเกี่ยวกับการทำนายพหุนาม โพสต์ลงท้ายด้วยความคิดเห็นเหล่านี้:

ตัวอย่างบางส่วนที่แสดงในที่นี้คือการโกง - การถดถอยพหุนามเป็นที่รู้กันว่าไม่น่าเชื่อถือสูง ในทางปฏิบัติมากขึ้นคือการใช้เส้นโค้งมากกว่าชื่อพหุนาม

ตอนนี้สิ่งนี้กระตุ้นให้ฉันตรวจสอบว่า splines จะทำงานกับตัวอย่างได้อย่างไร:

library(rms)
p4 <- poly(1:100, degree=4)
true4 <- p4 %*% c(1,2,-6,9)
days <- 1:70

set.seed(7987)
noise4 <- true4 + rnorm(100, sd=.5)
reg.n4.4 <- lm(noise4[1:70] ~ poly(days, 4))
reg.n4.4ns <- lm(noise4[1:70] ~ ns(days,4))
dd <- datadist(noise4[1:70], days)
options("datadist" = "dd")
reg.n4.4rcs_ols <- ols(noise4[1:70] ~ rcs(days,5))

plot(1:100, noise4)
nd <- data.frame(days=1:100)
lines(1:100, predict(reg.n4.4, newdata=nd), col="orange", lwd=3)
lines(1:100, predict(reg.n4.4ns, newdata=nd), col="red", lwd=3)
lines(1:100, predict(reg.n4.4rcs_ols, newdata=nd), col="darkblue", lwd=3)

legend("top", fill=c("orange", "red","darkblue"), 
       legend=c("Poly", "Natural splines", "RCS - ols"))

ให้ภาพต่อไปนี้: การเปรียบเทียบเส้นโค้งและพหุนาม

โดยสรุปฉันไม่พบมากที่จะโน้มน้าวใจฉันจากการพิจารณาเส้นโค้งฉันจะหายไปอะไร

  1. FE Harrell กลยุทธ์การสร้างแบบจำลองการถดถอย: ด้วยการประยุกต์ใช้กับตัวแบบเชิงเส้นถดถอยโลจิสติกและการวิเคราะห์การอยู่รอดพิมพ์ปกอ่อนของปกแข็งฉบับที่ 1 ed 2544 Springer, 2010
  2. FE Harrell, KL Lee และ BG Pollock, "แบบจำลองการถดถอยในการศึกษาทางคลินิก: การกำหนดความสัมพันธ์ระหว่างผู้ทำนายและการตอบสนอง" JNCI J Natl Cancer Inst, vol. 80, ไม่มี 15, pp. 1198–1202, ตุลาคม 2531

ปรับปรุง

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

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

library(rms)
cmplx_line <-  1:200/10
cmplx_line <- cmplx_line + 0.05*(cmplx_line - quantile(cmplx_line, .7))^2
cmplx_line <- cmplx_line - 0.06*(cmplx_line - quantile(cmplx_line, .3))^2
center <- (length(cmplx_line)/4*2):(length(cmplx_line)/4*3)
cmplx_line[center] <- cmplx_line[center] + 
    dnorm(6*(1:length(center)-length(center)/2)/length(center))*10

ds <- data.frame(cmplx_line, x=1:200)

days <- 1:140/2

set.seed(1234)
sample <- round(rnorm(600, mean=100, 60))
sample <- sample[sample <= max(ds$x) & 
                     sample >= min(ds$x)]
sample_ds <- ds[sample, ]

sample_ds$noise4 <- sample_ds$cmplx_line + rnorm(nrow(sample_ds), sd=2)
reg.n4.4 <- lm(noise4 ~ poly(x, 6), data=sample_ds)
dd <- datadist(sample_ds)
options("datadist" = "dd")
reg.n4.4rcs_ols <- ols(noise4 ~ rcs(x, 7), data=sample_ds)
AIC(reg.n4.4)

plot(sample_ds$x, sample_ds$noise4, col="#AAAAAA")
lines(x=ds$x, y=ds$cmplx_line, lwd=3, col="black", lty=4)

nd <- data.frame(x=ds$x)
lines(ds$x, predict(reg.n4.4, newdata=ds), col="orange", lwd=3)
lines(ds$x, predict(reg.n4.4rcs_ols, newdata=ds), col="lightblue", lwd=3)

legend("bottomright", fill=c("black", "orange","lightblue"), 
       legend=c("True line", "Poly", "RCS - ols"), inset=.05)

สิ่งนี้ให้พล็อตต่อไปนี้:

พล็อตที่ไม่ใช่พหุนามที่ซับซ้อนมากขึ้น

อัปเดต 2

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


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

1
@guy: นั่นคือความเชื่อของฉันคุณสามารถทำให้ข้อมูลของคุณเกินความเหมาะสมไม่ว่าคุณจะใช้วิธีใด ในช่วงชั้นถดถอยของฉันศาสตราจารย์ของฉันบอกฉันว่าชื่อพหุนามโค้งที่ส่วนใหญ่ของข้อมูลเกิดขึ้นจึงทำให้สุดขั้วไม่น่าเชื่อถือมากขึ้น แม้ว่าฉันจะไม่พบบทความใด ๆ ที่สนับสนุนการอ้างสิทธิ์นี้
Max Gordon

เส้นโค้งทั้งหมดในกราฟแรกของคุณไม่สามารถจัดวางข้อมูลทางด้านขวามือได้
Emil Friedman

1
มิติข้อมูล 'x' ในกราฟข้างต้นเกี่ยวข้องหรือไม่ ถ้าเป็นเช่นนั้นจะไม่มีวิธีการใดที่เหมาะสมเพราะทั้งสองแบบนั้นเป็นการมองไปข้างหน้าในแง่ที่ว่าพวกเขาใช้จุดที่อยู่ใกล้เคียง (ทั้งสองด้าน) เพื่อทำแบบจำลอง
arielf

@arielf: ไม่มี x ไม่ได้มีเจตนาเป็นตัวแปรเวลา ฉันคิดว่ามันเป็นตัวแปรบางตัวที่เราสุ่มตัวอย่างจำนวนการสังเกตสูงสุดที่จุดศูนย์กลาง ในการวิจัยของฉันเราไม่ได้มองไปถึงอนาคตที่มากขนาดนั้นฉันเดาว่ามันเป็นเรื่องของการอนุมานมากกว่าการทำนาย ตัวแปรนี้มีวัตถุประสงค์เพื่อเป็นคอเลสเตอรอลความดันโลหิตค่าดัชนีมวลกายหรือตัวแปรต่อเนื่องอื่น ๆ
Max Gordon

คำตอบ:


18

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

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

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

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

จุดพื้นฐานที่นี่คือการแลกเปลี่ยน ถ้าฉันเลือกพหุนาม a-order (เช่น f (x) = 3.4) โมเดลนั้นง่ายในการจัดเก็บ แต่สำหรับค่า y ฉันจะเก็บระยะทางเป็นค่าเฉลี่ย ค่าสัมประสิทธิ์มากขึ้นทำให้ฉันมีพหุนามที่เหมาะสมยิ่งขึ้น (และรหัสที่สั้นกว่าสำหรับค่า y) แต่ฉันต้องใช้บิตเพิ่มเติมอธิบายโมเดล รูปแบบที่ให้รหัสสั้นที่สุดสำหรับข้อมูลของคุณเป็นแบบที่ดีที่สุดตามเกณฑ์ของ MDL

(โปรดทราบว่าสิ่งนี้เรียกว่า 'ดิบ MDL' และมีการปรับแต่งบางอย่างที่คุณสามารถทำได้เพื่อแก้ไขปัญหาทางเทคนิคต่างๆ)


ขอบคุณ Peter สำหรับคำตอบของคุณ ฉันพยายามคลุมหัว MDL โดยเฉพาะอย่างยิ่งวิธีการใช้ มันคงจะดีถ้าได้อธิบายตามตัวอย่างของฉัน ในฐานะที่ไม่ใช่นักสถิติฉันชอบมีสิ่งที่สุดขั้วก่อนที่จะเข้าใจโลจิสติกส์ ตัวอย่างเหรียญในบทความ Wiki ไม่ได้มาถึงฉัน ...
Max Gordon

ฉันได้เพิ่มตัวอย่าง
ปีเตอร์

ขอบคุณ Peter สำหรับตัวอย่างตอนนี้มันชัดเจนสำหรับฉันมาก
Max Gordon

20

นักสถิติได้โต้เถียงกันเกี่ยวกับการใส่ชื่อพหุนามมานานแล้วและจากประสบการณ์ของฉันมันลงมาที่นี่:

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

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

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

คำปฏิเสธ

โดยส่วนตัวแล้วฉันไม่ได้ใช้ splines หรือ polynomials ง่าย ๆ กับข้อมูลส่วนใหญ่ของฉันเพราะฉันทำงานในสาขาที่มีกรอบทฤษฎีที่กำหนดไว้ล่วงหน้าจำนวนมาก นอกจากนี้ฉันมักสังเกตการรวบรวมข้อมูลและสามารถเข้าใจอย่างถ่องแท้เกี่ยวกับสิ่งที่ขับเคลื่อนผลลัพธ์ ในกรณีนี้ฉันกำลังสร้างอัลกอริทึมแบบลอจิคัลและทดสอบความเหมาะสมของอัลกอริทึมมากกว่าการทดสอบความเหมาะสมของฟังก์ชันพหุนาม คุณสามารถเพิ่มเกลือเม็ดนี้ในคำตอบของฉัน


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

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

5
ฉันจะต้องมีความเชื่อมั่นที่ดีกว่าว่าการถดถอย splines คาดการณ์มีความเสี่ยงกว่าพหุนาม
Frank Harrell

1
นี่ไม่ใช่อะไรใหม่ ค่อนข้างเป็นความแตกต่างระหว่างสถิติที่เกิดขึ้นในช่วงแรกของการทำความเข้าใจกับระยะหลังของความเข้าใจ ยิ่งคุณเข้าใจระบบมากเท่าใดคุณก็ยิ่งพึ่งพาฟังก์ชันที่ติดตั้งได้น้อยเท่านั้นและยิ่งใช้โมเดลทางทฤษฎีมากเท่านั้น
Dinre

1
วิธีการเกี่ยวกับการใช้ลูกบาศก์ splines แบบ จำกัด ซึ่ง จำกัด การทำงานของฟังก์ชั่นให้เป็นเส้นตรงด้านนอกจุดข้อมูล (ฉันกำลังอ่านหนังสือของ Harrell) อย่างไรก็ตามการคาดการณ์อยู่เสมอที่น่าสงสัย นึกถึงการทดลองที่ค้นพบตัวนำยิ่งยวดหรือพลาสมา ทฤษฎีควรพิสูจน์ด้วยการทดลอง! ฉันคิดว่าฟังก์ชั่นที่เหมาะสมจะเกี่ยวข้องกับปัญหาการแก้ไขมากขึ้น หากไม่มีทฤษฎีฉันเดาว่าคุณจะไม่สามารถเลือกรุ่นเดียวที่มีตัวทำนายความผิดพลาด (เช่นการแจกแจงที่ไม่รู้จัก) และการแจกแจงที่ไม่รู้จักของ y | x แม้ว่าคุณจะให้ข้อมูลเพียงพอ
KH Kim
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.