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:
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:
Kesimpulannya saya belum menemukan banyak yang akan meyakinkan saya untuk mempertimbangkan kembali splines, apa yang saya lewatkan?
- 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.
- 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:
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 .
sumber
Jawaban:
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 + 1n n+1 nilai 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).
sumber
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.
sumber