Misalkan kita memiliki seseorang yang membangun model prediktif, tetapi seseorang belum tentu berpengalaman dalam prinsip-prinsip statistik atau pembelajaran mesin yang tepat. Mungkin kita membantu orang itu saat mereka sedang belajar, atau mungkin orang itu menggunakan semacam paket perangkat lunak yang membutuhkan pengetahuan minimal untuk digunakan.
Sekarang orang ini mungkin sangat mengenali bahwa tes yang sebenarnya datang dari akurasi (atau apa pun metrik lainnya) pada data out-of-sample . Namun, kekhawatiran saya adalah bahwa ada banyak kehalusan di sana untuk dikhawatirkan. Dalam kasus sederhana, mereka membangun model mereka dan mengevaluasinya berdasarkan data pelatihan dan mengevaluasinya pada data pengujian yang diadakan. Sayangnya kadang-kadang bisa terlalu mudah pada saat itu untuk kembali dan mengubah beberapa parameter pemodelan dan memeriksa hasilnya pada data "pengujian" yang sama. Pada titik ini, data tidak lagi benar sebagai data out-of-sample, dan overfitting dapat menjadi masalah.
Salah satu cara potensial untuk menyelesaikan masalah ini adalah dengan menyarankan membuat banyak dataset yang tidak sampel sehingga setiap dataset pengujian dapat dibuang setelah digunakan dan tidak digunakan kembali sama sekali. Ini membutuhkan banyak manajemen data, terutama pemisahan harus dilakukan sebelum analisis (jadi Anda perlu tahu berapa banyak pemisahan sebelumnya).
Mungkin pendekatan yang lebih konvensional adalah validasi k-fold cross. Namun, dalam beberapa hal kehilangan perbedaan antara dataset "pelatihan" dan "pengujian" yang menurut saya dapat berguna, terutama bagi mereka yang masih belajar. Saya juga tidak yakin ini masuk akal untuk semua jenis model prediksi.
Apakah ada cara yang saya abaikan untuk membantu mengatasi masalah overfitting dan pengujian kebocoran sementara masih agak jelas bagi pengguna yang tidak berpengalaman?
sumber
Jawaban:
Anda benar, ini adalah masalah signifikan dalam pembelajaran mesin / pemodelan statistik. Pada dasarnya satu-satunya cara untuk benar-benar menyelesaikan masalah ini adalah dengan mempertahankan set tes independen dan tetap bertahan sampai studi selesai dan menggunakannya untuk validasi akhir.
Namun, orang akan melihat hasil pada set tes dan kemudian mengubah model mereka; namun ini tidak serta merta menghasilkan peningkatan kinerja generalisasi karena perbedaan kinerja model yang berbeda mungkin sebagian besar disebabkan oleh sampel data uji tertentu yang kami miliki. Dalam hal ini, dalam menentukan pilihan, kami secara efektif mengatasi kesalahan pengujian.
Cara untuk membatasi ini adalah dengan membuat varians dari kesalahan tes sekecil mungkin (yaitu variabilitas dalam kesalahan tes kita akan melihat apakah kita menggunakan sampel data yang berbeda sebagai set tes, yang diambil dari distribusi dasar yang sama). Ini paling mudah dicapai dengan menggunakan set uji besar jika memungkinkan, atau mis. Bootstrap atau validasi silang jika tidak banyak data tersedia.
Saya telah menemukan bahwa jenis yang terlalu pas dalam pemilihan model ini jauh lebih merepotkan daripada yang umumnya dihargai, terutama yang berkaitan dengan estimasi kinerja, lihat
GC Cawley dan NLC Talbot, Over-fitting dalam pemilihan model dan bias seleksi selanjutnya dalam evaluasi kinerja, Journal of Machine Learning Research, 2010. Penelitian, vol. 11, hlm. 2079-2107, Juli 2010 (www)
Masalah semacam ini terutama mempengaruhi penggunaan dataset benchmark, yang telah digunakan dalam banyak studi, dan setiap studi baru secara implisit dipengaruhi oleh hasil studi sebelumnya, sehingga kinerja yang diamati cenderung menjadi perkiraan optimis yang berlebihan dari kenyataan. kinerja metode. Cara saya mencoba menyiasatinya adalah dengan melihat banyak dataset (jadi metode ini tidak disetel ke satu dataset tertentu) dan juga menggunakan beberapa uji acak / pelatihan split untuk estimasi kinerja (untuk mengurangi varian estimasi). Namun hasilnya masih perlu peringatan bahwa tolok ukur ini telah over-fit.
Contoh lain di mana hal ini terjadi adalah dalam kompetisi pembelajaran mesin dengan papan pimpinan berdasarkan pada set validasi. Tak pelak beberapa pesaing terus mengutak-atik model mereka untuk semakin naik papan pemimpin, tetapi kemudian berakhir di bagian bawah peringkat akhir. Alasan untuk ini adalah bahwa beberapa pilihan mereka memiliki over-fitting set validasi (secara efektif mempelajari variasi acak dalam set validasi kecil).
Jika Anda tidak dapat menyimpan set tes murni secara statistik, maka saya khawatir dua pilihan terbaik adalah (i) mengumpulkan beberapa data baru untuk membuat set tes murni secara statistik atau (ii) membuat peringatan bahwa model baru didasarkan pada pilihan yang dibuat setelah mengamati kesalahan set tes, sehingga estimasi kinerja cenderung memiliki bias optimis.
sumber
Salah satu cara untuk memastikan ini adalah memastikan Anda telah membuat kode semua hal yang Anda lakukan agar sesuai dengan model, bahkan "bermain-main". Dengan cara ini, ketika Anda menjalankan proses berulang kali, katakan melalui validasi silang, Anda menjaga hal-hal yang konsisten antara berjalan. Ini memastikan bahwa semua sumber variasi potensial ditangkap oleh proses validasi silang.
Hal lain yang sangat penting adalah untuk memastikan bahwa Anda memiliki sampel yang representatif, di kedua set data. Jika kumpulan data Anda tidak mewakili jenis data yang Anda harapkan akan digunakan untuk memprediksi, maka tidak banyak yang dapat Anda lakukan. Semua pemodelan bertumpu pada asumsi bahwa "induksi" bekerja - hal-hal yang belum kita amati berperilaku seperti hal-hal yang telah kita amati.
Sebagai aturan umum, menjauhlah dari prosedur pemasangan model rumit kecuali (i) Anda tahu apa yang Anda lakukan, dan (ii) Anda telah mencoba metode yang lebih sederhana, dan menemukan bahwa mereka tidak bekerja, dan bagaimana metode kompleks memperbaiki masalah dengan metode sederhana. "Sederhana" dan "kompleks" dimaksudkan dalam arti "sederhana" atau "kompleks" bagi orang yang melakukan pemasangan. Alasan mengapa hal ini sangat penting adalah memungkinkan Anda untuk menerapkan apa yang saya suka sebut "tes mengendus" pada hasilnya. Apakah hasilnya terlihat benar? Anda tidak dapat "mencium" hasil dari prosedur yang tidak Anda mengerti.
CATATAN: bagian berikutnya, jawaban saya yang agak panjang didasarkan pada pengalaman saya, yang ada di area , dengan mungkin besar. Saya hampir yakin bahwa apa yang berikut di bawah ini tidak akan berlaku untuk atau kasusN>>p p N≈p N<p
Ketika Anda memiliki sampel besar, perbedaan antara menggunakan dan tidak menggunakan pengamatan yang diberikan sangat kecil, asalkan pemodelan Anda tidak terlalu "lokal". Ini karena pengaruh titik data yang diberikan umumnya urutan . Jadi dalam set data besar, residu yang Anda dapatkan dari "bertahan" pada set data uji pada dasarnya sama dengan residu yang Anda dapatkan dari menggunakannya dalam set data pelatihan. Anda dapat menunjukkan ini menggunakan kuadrat terkecil biasa. Sisa yang Anda dapatkan dari mengecualikan observasi ke- (yaitu apa kesalahan set tes akan jika kita menempatkan pengamatan di set tes) adalah , di mana adalah sisa pelatihan, dan1N i etesti=(1−hii)−1etraini etraini hii adalah leverage dari titik data ke- . Sekarang kita memiliki , di mana adalah jumlah variabel dalam regresi. Sekarang jika , maka sangat sulit untuk setiap menjadi cukup besar untuk membuat perbedaan yang cukup besar antara set tes dan kesalahan set pelatihan. Kita dapat mengambil contoh yang disederhanakan, misalkan (mencegat dan variabel), desain matriks adalah (baik set pelatihan dan pengujian), dan leveragei ∑ihii=p p N>>p hii p=2 1 N×p X
Di mana , , dan . Akhirnya, adalah variabel prediktor standar, dan mengukur berapa banyak standar deviasi dari mean. Jadi, kita tahu dari awal bahwa kesalahan set tes akan jauh lebih besar daripada kesalahan set pelatihan untuk pengamatan "di ujung" set pelatihan. Tapi ini pada dasarnya adalah masalah representatif lagi - pengamatan "di ujung" kurang representatif dari pengamatan "di tengah". Selain itu, ini untuk memesan . Jadi jika Anda memiliki pengamatan, bahkan jikax¯¯¯=N−1∑ixi x2¯¯¯¯¯=N−1∑ix2i s2x=x2¯¯¯¯¯−x¯¯¯2 x~i=xi−x¯¯¯sx xi 1N 100 x~i=5 (pencilan dalam ruang x oleh sebagian besar definisi), ini berarti , dan kesalahan pengujian oleh faktor hanya . Jika Anda memiliki kumpulan data besar, katakanlah , itu bahkan lebih kecil, , yang kurang dari . Bahkan, untuk pengamatan , Anda akan memerlukan pengamatan untuk membuat bawah perkiraan kesalahan set tes, menggunakan kesalahan set pelatihan.hii=26100 1−26100=74100 10000 1−2610000 1% 10000 x~=50 25%
Jadi untuk set data besar, menggunakan set tes tidak hanya tidak efisien, juga tidak perlu, selama . Ini berlaku untuk OLS dan juga kira-kira berlaku untuk GLM (detailnya berbeda untuk GLM, tetapi kesimpulan umumnya sama). Dalam lebih dari dimensi, "pencilan" didefinisikan oleh pengamatan dengan skor "komponen utama" yang besar. Ini dapat ditunjukkan dengan menulis Di mana adalah matriks vektor eigen (ortogonal) untuk , dengan matriks nilai eigen . Kita mendapatkan manaN>>p 2 hii=xTiEET(XTX)−1EETxi E XTX Λ hii=zTiΛ−1zi=∑pj=1z2jiΛjj zi=ETxi adalah skor komponen utama untuk .xi
Jika set pengujian Anda memiliki observasi , Anda mendapatkan versi matriks , di mana dan adalah baris-baris dari matriks desain dalam set tes. Jadi, untuk regresi OLS, Anda sudah tahu apa kesalahan "set tes" untuk semua kemungkinan pemisahan data ke dalam set pelatihan dan pengujian. Dalam hal ini ( ), tidak perlu membagi data sama sekali. Anda dapat melaporkan kesalahan set uji "kasus terbaik" dan "kasus terburuk" dari hampir semua ukuran tanpa benar-benar harus membagi data. Ini dapat menghemat banyak waktu dan sumber daya PC.k etest{k}=(Ik−H{k})−1etrain{k} H{k}=X{k}(XTX)−1XT{k} X{k} N>>p
Pada dasarnya, semua ini mengurangi penggunaan hukuman, untuk menjelaskan perbedaan antara kesalahan pelatihan dan pengujian, seperti BIC atau AIC. Ini secara efektif mencapai hasil yang sama seperti apa yang dilakukan dengan set tes, namun Anda tidak dipaksa untuk membuang informasi yang berpotensi berguna. Dengan BIC, Anda mendekati bukti untuk model, yang terlihat secara matematis seperti:
Perhatikan bahwa dalam prosedur ini, kami tidak dapat memperkirakan parameter internal apa pun - setiap model harus ditentukan sepenuhnya atau memiliki parameter internal yang terintegrasi. Namun, kita dapat membuat ini tampak seperti validasi silang (menggunakan fungsi kerugian spesifik) dengan berulang kali menggunakan aturan produk, dan kemudian mengambil log hasilnya:Mi
Ini menunjukkan bentuk validasi silang, tetapi di mana set pelatihan terus diperbarui, satu pengamatan pada satu waktu dari set tes - mirip dengan Filter Kalman. Kami memprediksi pengamatan selanjutnya dari set tes menggunakan set pelatihan saat ini, mengukur penyimpangan dari nilai yang diamati menggunakan log-kemungkinan bersyarat, dan kemudian memperbarui set pelatihan untuk memasukkan pengamatan baru. Tetapi perhatikan bahwa prosedur ini sepenuhnya mencerna semua data yang tersedia, sementara pada saat yang sama memastikan bahwa setiap pengamatan diuji sebagai kasus "out-of-sample". Ini juga tidak berubah, dalam hal apa pun yang Anda sebut "observasi 1" atau "observasi 10"; hasilnya sama (perhitungan mungkin lebih mudah untuk beberapa permutasi daripada yang lain). Fungsi kerugian juga "adaptif" dalam hal itu jika kita mendefinisikan L i iLi=log[p(yi|y1…yi−1MiI)] , maka ketajaman tergantung pada , karena fungsi kerugian terus diperbarui dengan data baru.Li i
Saya akan menyarankan bahwa menilai model prediksi dengan cara ini akan bekerja dengan baik.
sumber
Saya kira satu-satunya cara untuk menjamin ini adalah orang lain memiliki data pengujian . Dalam hubungan klien-konsultan ini dapat dikelola dengan cukup mudah: klien memberikan konsultan pelatihan yang ditetapkan untuk membangun model, dan dalam pelatihan ini konsultan dapat membagi data dengan cara apa pun yang diperlukan untuk memastikan bahwa overfitting tidak terjadi; selanjutnya model diberikan kembali ke klien untuk digunakan pada data pengujian mereka.
Untuk seorang peneliti perorangan, masuk akal bahwa karena itu praktik terbaik adalah meniru pengaturan ini. Ini berarti memberikan beberapa data untuk diuji, setelah semua pemilihan model dilakukan. Sayangnya, seperti yang Anda katakan, ini tidak dipraktikkan oleh banyak orang, dan itu bahkan terjadi pada orang - orang yang seharusnya lebih tahu!
Namun pada akhirnya itu tergantung pada apa model yang digunakan. Jika Anda hanya tertarik pada prediksi pada dataset tunggal itu, maka mungkin Anda bisa menyesuaikan semua yang Anda suka? Namun jika Anda mencoba untuk mempromosikan model Anda sebagai model yang umum, atau menggunakan model tersebut dalam beberapa aplikasi dunia nyata, maka tentu saja ini sangat penting.
Ada masalah sampingan yang saya pikir harus saya sebutkan, yaitu bahwa bahkan jika Anda mengikuti semua prosedur dengan benar, Anda masih dapat berakhir dengan model yang dilengkapi berlebihan, karena data tidak benar-benar iid . Misalnya, jika ada korelasi temporal dalam data, maka jika Anda mengambil semua data pelatihan Anda dari waktu 1-3, dan menguji pada waktu 4, maka Anda mungkin menemukan bahwa kesalahan prediksi lebih besar dari yang diharapkan. Atau bisa jadi ada artefak khusus eksperimen, seperti perangkat pengukuran yang digunakan, atau kumpulan subjek dalam eksperimen manusia, yang menyebabkan generalisasi model menjadi lebih buruk dari yang diharapkan.
sumber
view
izin basis data yang ditetapkan di mana beberapa tim uji-data-privasi dan yang lain buta data uji.Ini adalah pertanyaan yang sangat bagus dan masalah yang sangat halus. Tentu saja ada kesalahan niat buruk, yang berasal dari seseorang yang mencoba menipu Anda. Tetapi ada pertanyaan yang lebih dalam tentang bagaimana menghindari kebocoran yang tidak disengaja dan menghindari kesalahan yang jujur.
Biarkan saya daftar beberapa praktik baik operasional. Mereka semua berasal dari kesalahan jujur yang saya buat di beberapa titik:
sumber
Banyak poin penting telah dibahas dalam jawaban luar biasa yang sudah diberikan.
Akhir-akhir ini, saya telah mengembangkan daftar periksa pribadi ini untuk kemandirian statistik data uji:
Ada tipe lain dari kebocoran data di bidang saya: kami melakukan spektroskopi jaringan biologis yang diselesaikan secara spasial. Pelabelan referensi dari spektrum uji perlu dibutakan terhadap informasi spektroskopi, bahkan jika tergoda untuk menggunakan analisis kluster dan kemudian hanya mencari tahu kelas mana yang dimiliki masing-masing klaster (yang akan menjadi data uji semi-diawasi yang tidak independen sama sekali).
Terakhir, tetapi tentu tidak kalah pentingnya: Ketika mengkode validasi resampling, saya benar-benar memeriksa apakah indeks yang dihitung ke dalam set data tidak mengarah pada pengambilan baris tes dari pasien pelatihan, hari dll.
Perhatikan bahwa "pemisahan tidak dilakukan untuk memastikan independensi" dan "pemisahan sebelum terjadi perhitungan yang melibatkan lebih dari satu kasus" juga dapat terjadi dengan pengujian yang mengklaim menggunakan set pengujian independen, dan yang terakhir bahkan jika analis data diharuskan. membutakan referensi kasus uji. Kesalahan ini tidak dapat terjadi jika data uji ditahan sampai model akhir disajikan.
* Saya menggunakan pasien sebagai hierarki teratas dalam data hanya untuk kemudahan deskripsi.
** Saya ahli kimia analitik: Penyimpangan instrumen adalah masalah yang diketahui. Bahkan, bagian dari validasi metode analisis kimia adalah menentukan seberapa sering kalibrasi perlu diperiksa terhadap sampel validasi, dan seberapa sering kalibrasi perlu diulang.
FWIW: Dalam praktiknya, saya berurusan dengan aplikasi di mana
Secara pribadi, saya belum memenuhi aplikasi di mana untuk pengembangan pengklasifikasian saya mendapatkan cukup case independen untuk mengesampingkan set test independen yang tepat. Jadi, saya sampai pada kesimpulan bahwa validasi resampling yang dilakukan dengan benar adalah alternatif yang lebih baik saat metode ini masih dalam pengembangan. Studi validasi yang tepat perlu dilakukan pada akhirnya, tetapi itu adalah pemborosan sumber daya yang besar (atau hasilnya tidak akan membawa informasi yang berguna karena varians) melakukan hal itu sementara pengembangan metode berada pada tahap di mana hal-hal masih berubah.
sumber
Jika saya ingat dengan benar, beberapa kontes peramalan (seperti Netflix atau yang ada di Kaggle) menggunakan skema ini:
Ada satu set pelatihan, dengan "jawaban". Ada set tes # 1, di mana peneliti memberikan jawaban. Peneliti menemukan skor mereka. Ada set tes # 2, di mana peneliti memberikan jawaban, TETAPI peneliti tidak mengetahui skor mereka. Peneliti tidak tahu kasus prediksi mana yang ada di # 1 dan # 2.
Pada titik tertentu, set # 2 harus terlihat, tetapi Anda setidaknya membatasi kontaminasi.
sumber
Dalam beberapa kasus, seperti prediksi berbasis urutan biologis, tidak cukup untuk memastikan bahwa kasus tidak muncul dalam lebih dari satu set. Anda masih perlu khawatir tentang ketergantungan antara set.
Misalnya, untuk prediktor berbasis urutan, seseorang perlu menghapus redundansi dengan memastikan bahwa sekuens dalam set yang berbeda (termasuk set validasi silang yang berbeda) tidak berbagi tingkat kemiripan urutan yang tinggi.
sumber
Saya akan mengatakan "validasi silang k-fold" adalah jawaban yang tepat dari sudut pandang teoritis, tetapi pertanyaan Anda tampaknya lebih banyak tentang hal-hal organisasi dan pengajaran jadi saya akan menjawab secara berbeda.
Ketika orang "masih belajar" sering dianggap seolah-olah mereka sedang belajar bagaimana "dengan cepat dan kotor" menerapkan algoritma dan semua "ekstra" pengetahuan (motivasi masalah, persiapan dataset, validasi, analisis kesalahan, gotcha praktis dan sebagainya ) akan dipelajari "nanti" ketika mereka "lebih siap".
Ini benar-benar salah.
Jika kita ingin seorang siswa atau siapa pun untuk memahami perbedaan antara set tes dan set pelatihan, hal terburuk adalah memberikan dua set kepada dua orang yang berbeda seolah-olah kita berpikir bahwa "pada tahap ini" "pengetahuan tambahan" adalah berbahaya. Ini seperti pendekatan air terjun dalam pengembangan perangkat lunak - beberapa bulan desain murni, kemudian beberapa bulan pengkodean murni, kemudian beberapa bulan pengujian murni dan hasil pembuangan yang menyedihkan pada akhirnya.
Belajar seharusnya tidak seperti air terjun. Semua bagian pembelajaran - motivasi masalah, algoritma, gotcha praktis, evaluasi hasil - harus disatukan, dalam langkah-langkah kecil. (Suka pendekatan tangkas dalam pengembangan perangkat lunak).
Mungkin semua orang di sini telah membaca Andrew Ng's ml-class.org - Saya akan menjadikan kursusnya sebagai contoh "lincah" yang kuat, jika Anda mau, gaya belajar - yang tidak akan pernah menghasilkan pertanyaan tentang "bagaimana caranya". memastikan bahwa data uji tidak bocor ke dalam data pelatihan ".
Perhatikan bahwa saya mungkin benar-benar salah memahami pertanyaan Anda, jadi mohon maaf! :)
sumber