Apakah splines overfitting data?

47

Masalah saya : Baru-baru ini saya bertemu dengan ahli statistik yang memberi tahu saya bahwa splines hanya berguna untuk mengeksplorasi data dan mengalami overfitting, sehingga tidak berguna dalam prediksi. Dia lebih suka menjelajahi dengan polinomial sederhana ... Karena saya penggemar berat spline, dan ini bertentangan dengan intuisi saya, saya tertarik untuk mengetahui seberapa valid argumen ini, dan jika ada kelompok besar anti-spline- aktivis di luar sana?

Latar Belakang : Saya mencoba mengikuti Frank Harrell, Regresi Modeling Strategies (1), ketika saya membuat model saya. Dia berpendapat bahwa splines kubik terbatas adalah alat yang valid untuk menjelajahi variabel kontinu. Dia juga berpendapat bahwa polinomial miskin dalam pemodelan hubungan tertentu seperti ambang batas, logaritmik (2). Untuk menguji linearitas model, ia menyarankan tes ANOVA untuk spline:

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

Saya sudah googled untuk overfitting dengan splines tetapi tidak menemukan banyak berguna (selain dari peringatan umum tentang tidak menggunakan knot terlalu banyak). Di forum ini tampaknya ada preferensi untuk pemodelan spline, Kolassa , Harrell , gung .

Saya menemukan satu posting blog tentang polinomial, setan overfitting yang berbicara tentang prediksi polinomial. Pos diakhiri dengan komentar ini:

Sampai taraf tertentu contoh yang disajikan di sini curang - regresi polinomial dikenal sangat tidak kuat. Jauh lebih baik dalam praktiknya adalah menggunakan splines daripada polinomial.

Sekarang ini mendorong saya untuk memeriksa bagaimana kinerja splines dengan contoh:

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"))

Memberikan gambar berikut: Perbandingan antara splines dan polinomial

Kesimpulannya saya belum menemukan banyak yang akan meyakinkan saya untuk mempertimbangkan kembali splines, apa yang saya lewatkan?

  1. FE Harrell, Strategi Pemodelan Regresi: Dengan Aplikasi pada Model Linier, Regresi Logistik, dan Analisis Kelangsungan Hidup, cetak ulang Softcover dari hardcover edisi pertama. 2001. Springer, 2010.
  2. FE Harrell, KL Lee, dan BG Pollock, "Model Regresi dalam Studi Klinis: Menentukan Hubungan Antara Prediktor dan Respon," JNCI J Natl Cancer Inst, vol. 80, tidak. 15, hlm. 1198–1202, Oktober 1988.

Memperbarui

Komentar membuat saya bertanya-tanya apa yang terjadi dalam rentang data tetapi dengan kurva yang tidak nyaman. Dalam sebagian besar situasi saya tidak akan keluar dari batas data, seperti contoh di atas menunjukkan. Saya tidak yakin ini memenuhi syarat sebagai prediksi ...

Bagaimanapun, ini adalah contoh di mana saya membuat garis yang lebih kompleks yang tidak dapat diterjemahkan ke dalam polinomial. Karena sebagian besar pengamatan berada di pusat data, saya mencoba mensimulasikannya juga:

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)

Ini memberikan plot berikut:

Plot garis non-polinomial yang lebih kompleks

Perbarui 2

Sejak posting ini saya telah menerbitkan sebuah artikel yang membahas usia non-linearitas pada dataset besar. Suplemen membandingkan berbagai metode dan saya sudah menulis posting blog tentang itu .

Max Gordon
sumber
16
Saya tidak benar-benar melihat dari mana teman ahli statistik Anda berasal, jujur. Anda bisa mengenakan polinomial dan spline sama saja. Overfitting berasal dari kelas model Anda yang memiliki kapasitas berlebihan; yang membedakan kinerja berbagai model adalah bagaimana mereka membatasi kapasitasnya. Untuk splines (alami), ini adalah penempatan simpul dan angka, untuk polinomial adalah derajatnya.
pria
1
@ guy: Itu juga keyakinan saya, Anda selalu bisa menyesuaikan data Anda apa pun metode yang Anda gunakan. Selama kelas regresi saya, profesor saya memberi tahu saya bahwa polinomial membungkuk di mana sebagian besar data terjadi, sehingga membuat ekstrem lebih tidak dapat diandalkan. Meskipun saya belum menemukan artikel yang mendukung klaim ini.
Max Gordon
Semua kurva di grafik pertama Anda gagal untuk mencocokkan data di sisi kanan.
Emil Friedman
1
Apakah dimensi 'x' dalam grafik di atas terkait dengan waktu? Jika ya, tidak ada metode ini yang sesuai, karena keduanya 'berpandangan ke depan' dalam arti bahwa mereka menggunakan titik-titik tetangga (di kedua sisi) untuk memodelkan.
arielf
@arielf: Tidak, x tidak dimaksudkan sebagai variabel waktu. Saya menganggapnya sebagai beberapa variabel di mana kami sampel jumlah pengamatan maksimum di pusat. Dalam penelitian saya, kami tidak melihat ke masa depan sebanyak itu, saya kira itu lebih di bidang inferensi daripada prediksi. Variabel ini dimaksudkan sebagai kolesterol, tekanan darah, IMT, atau variabel kontinu umum lainnya.
Max Gordon

Jawaban:

18

Overfitting datang karena membiarkan kelas model terlalu besar. Ini menjadi sedikit rumit dengan model dengan parameter kontinu (seperti splines dan polinomial), tetapi jika Anda mendiskritisasi parameter menjadi beberapa nilai yang berbeda, Anda akan melihat bahwa meningkatkan jumlah simpul / koefisien akan meningkatkan jumlah model yang tersedia secara eksponensial . Untuk setiap dataset ada spline dan polinomial yang pas, asalkan Anda memungkinkan cukup koefisien / simpul. Mungkin spline dengan tiga knot overfits lebih dari polinomial dengan tiga koefisien, tapi itu bukan perbandingan yang adil.

Jika Anda memiliki jumlah parameter yang rendah, dan dataset yang besar, Anda dapat yakin bahwa Anda tidak overfitting. Jika Anda ingin mencoba jumlah parameter yang lebih tinggi, Anda dapat mencoba memvalidasi silang dalam set pengujian Anda untuk menemukan angka terbaik, atau Anda dapat menggunakan kriteria seperti Panjang Deskripsi Minimum .

EDIT : Seperti yang diminta dalam komentar, contoh bagaimana seseorang akan menerapkan MDL. Pertama, Anda harus berurusan dengan fakta bahwa data Anda kontinu, sehingga tidak dapat diwakili dalam kode yang terbatas. Demi kesederhanaan, kami akan mengelompokkan ruang data ke dalam kotak sisi dan alih-alih menggambarkan titik data, kami akan menjelaskan kotak tempat data tersebut berada. Ini berarti kita kehilangan keakuratan, tetapi kita dapat membuat kecil secara sewenang-wenang, jadi tidak masalah.ϵϵϵ

Sekarang, tugasnya adalah mendeskripsikan dataset setingkat mungkin dengan bantuan beberapa polinomial. Pertama kita menggambarkan polinomial. Jika ini adalah polinomial urutan ke-n, kita hanya perlu menyimpan koefisien (n +1). Sekali lagi, kita perlu mendiskritasikan nilai-nilai ini. Setelah itu kita perlu menyimpan dulu nilai dalam pengkodean awalan bebas (jadi kita tahu kapan harus berhenti membaca) dan kemudiann + 1nn+1nilai parameter. Dengan informasi ini, penerima kode kami dapat memulihkan polinomial. Kemudian kami menambahkan sisa informasi yang diperlukan untuk menyimpan dataset. Untuk setiap titik data kami memberikan nilai x, dan kemudian berapa banyak kotak naik atau turun dari titik data terletak polinomial. Kedua nilai yang kami simpan dalam pengkodean bebas awalan sehingga nilai pendek memerlukan beberapa bit, dan kami tidak akan memerlukan pembatas di antara titik. (Anda dapat mempersingkat kode untuk nilai-x dengan hanya menyimpan kenaikan di antara nilai-nilai)

Poin mendasar di sini adalah tradeoff. Jika saya memilih polinomial a-order (seperti f (x) = 3,4), maka model ini sangat sederhana untuk disimpan, tetapi untuk nilai-y, saya pada dasarnya menyimpan jarak ke mean. Lebih banyak koefisien memberi saya polinomial pas yang lebih baik (dan dengan demikian kode lebih pendek untuk nilai-nilai y), tetapi saya harus menghabiskan lebih banyak bit untuk menggambarkan model. Model yang memberi Anda kode terpendek untuk data Anda paling sesuai dengan kriteria MDL.

(Perhatikan bahwa ini dikenal sebagai 'MDL mentah', dan ada beberapa penyempurnaan yang dapat Anda lakukan untuk menyelesaikan berbagai masalah teknis).

Peter
sumber
Terima kasih Peter atas jawaban Anda. Saya sudah mencoba membungkus kepala saya di sekitar MDL, terutama bagaimana cara menerapkannya. Akan menyenangkan untuk menjelaskannya berdasarkan salah satu contoh saya. Sebagai seorang non-ahli statistik, saya suka memiliki hal-hal yang dicontohkan sebelum saya dapat memahami logistik yang mendasarinya. Contoh koin dalam artikel-Wiki tidak sampai pada saya ...
Max Gordon
Saya telah menambahkan contoh.
Peter
Terima kasih Peter untuk contohnya, sekarang jauh lebih jelas bagi saya.
Max Gordon
20

Para ahli statistik telah memperdebatkan tentang penyesuaian polinomial selama berabad-abad, dan menurut pengalaman saya, ini berkaitan dengan ini:

Splines pada dasarnya adalah serangkaian persamaan yang berbeda yang disatukan, yang cenderung meningkatkan keakuratan nilai yang diinterpolasi dengan mengorbankan kemampuan memproyeksikan di luar rentang data. Ini bagus jika Anda tahu data Anda murni dan berasal dari sumber yang konsisten dan jika Anda mencoba menggambarkan kemungkinan kehadiran nilai yang berbeda dalam rentang nilai Anda. Namun, kami biasanya tidak belajar banyak tentang dasar-dasar teoretis yang menggerakkan data kami, karena spline baru dimulai ketika spline lama berhenti menjelaskan data secara akurat. Ini membuat prediksi nilai di luar data kami hampir tidak berharga.

Sekarang, splines tidak unik dalam hal ini. Fungsi polinomial sebenarnya mengalami masalah yang sama jika kita hanya menyesuaikan data dan tidak menggunakan kerangka kerja teoritis untuk memilih variabel. Mereka yang memiliki teori yang terbentuk dengan baik mengarahkan variabel mana yang akan bervariasi dan seberapa banyak akan lebih mempercayai kemampuan fungsi polinomial yang kompleks untuk memperkirakan prediksi di luar data.

Akan tetapi, banyak ahli statistik bekerja dengan data tanpa bantuan dari kerangka teori yang telah ditetapkan sebelumnya, dan ini mendorong beberapa orang ke arah polinomial sederhana. Mereka beralasan bahwa fungsi yang kurang fleksibel yang sesuai dengan data lebih mungkin untuk secara akurat memprediksi nilai-nilai di luar data, karena fungsi tersebut lebih kecil kemungkinannya terombang-ambing oleh anomali dalam data. Meskipun saya sudah melakukan pembicaraan tentang hal ini dengan orang-orang yang lebih suka polinomial sederhana, saya tidak pernah merasakan kelompok anti-spline. Rasanya lebih seperti polinomial sederhana yang membuat beberapa ahli statistik merasa lebih nyaman untuk menghindari overfitting.

Penolakan

Secara pribadi, saya tidak cenderung menggunakan splines atau polinomial sederhana dengan sebagian besar data saya, karena saya bekerja di bidang dengan banyak kerangka kerja teori yang telah ditetapkan sebelumnya. Juga, saya biasanya mengamati pengumpulan data dan bisa memahami dengan baik apa yang mendorong hasil. Dalam hal ini, saya sedang membangun lebih banyak algoritma logis dan menguji kebugaran algoritma, daripada menguji kebugaran fungsi polinomial. Anda dapat menambahkan butiran garam ini ke jawaban saya.

Makan malam
sumber
18
Polinomial jauh lebih sensitif terhadap anomali dalam data daripada splines. Pencilan di mana saja dalam kumpulan data memiliki efek global besar-besaran , sedangkan dalam splines efeknya bersifat lokal.
pria
Saya mengerti maksud Anda, dan itu benar jika Anda menggunakan pendekatan informasi yang sempurna atau tidak memiliki cukup informasi tentang sifat data. Banyak ahli statistik (termasuk saya) yang mengasumsikan informasi yang tidak sempurna dan berupaya menerapkan kriteria pengecualian berdasarkan informasi yang diketahui sebelum mencoba mencocokkan data. Pencilan berbahaya harus secara teoritis dikeluarkan dari upaya pemasangan. Jika Anda tidak memiliki informasi yang diketahui tentang sifat data (dan ini sangat umum), maka Anda akan terjebak untuk bekerja di sekitar outlier.
Makan malam
5
Saya harus lebih yakin bahwa regresi splines memperkirakan lebih berbahaya daripada polinomial.
Frank Harrell
1
Ini bukan hal baru. Sebaliknya, perbedaannya terlihat antara statistik yang dilakukan pada tahap awal pemahaman versus tahap pemahaman selanjutnya. Semakin Anda memahami suatu sistem, semakin sedikit Anda mengandalkan fungsi yang dipasang dan semakin Anda bergantung pada model teoritis.
Makan malam
1
Bagaimana kalau menggunakan splines kubik terbatas, yang membatasi fungsi menjadi linier di luar titik data (saya membaca buku Harrell). Bagaimanapun ekstrapolasi selalu mencurigakan. Pikirkan eksperimen yang menemukan superkonduktivitas atau plasma. Teori harus dibuktikan melalui eksperimen! Saya pikir fungsi apa yang cocok lebih relevan dengan masalah interpolasi. Tanpa teori, saya kira Anda tidak akan dapat memilih hanya satu model dengan kesalahan prediktor (juga distribusi tidak diketahui) dan distribusi y | x yang tidak diketahui, bahkan ketika Anda memberikan data yang cukup.
KH Kim