Saya sedang mengerjakan kompetisi sains data di mana distribusi set tes saya berbeda dari set pelatihan. Saya ingin mengambil sampel pengamatan dari set pelatihan yang sangat mirip dengan set tes.
Bagaimana saya bisa melakukan ini?
Saya sedang mengerjakan kompetisi sains data di mana distribusi set tes saya berbeda dari set pelatihan. Saya ingin mengambil sampel pengamatan dari set pelatihan yang sangat mirip dengan set tes.
Bagaimana saya bisa melakukan ini?
Jawaban:
Pertanyaan besar, ini adalah apa yang dikenal dalam paradigma Pembelajaran Mesin sebagai "Kovariate Shift", atau "Model Drift" atau "Nonstationarity" dan seterusnya.
Salah satu asumsi kritis yang akan dibuat seseorang untuk membangun model pembelajaran mesin untuk prediksi di masa depan adalah bahwa data yang tidak terlihat (tes) berasal dari distribusi yang sama dengan data pelatihan! Namun, dalam kenyataannya, asumsi yang agak sederhana ini mudah dipatahkan dan data yang akan datang (distribusinya) berubah seiring waktu karena berbagai alasan. Bagi mereka yang mungkin tidak terbiasa dengan masalah yang sangat penting ini, saya sarankan mencari di sini atau mengirim !
Bagi saya, pertanyaan Anda termasuk dalam kategori yang sama. Meskipun saya tidak memiliki solusi yang sempurna (implementasi untuk menawarkan), tetapi saya pikir Anda mungkin melihat:
Pembaruan CEPAT (solusi yang baik) : Saya menemukan implementasi Python dari algoritma KLIEP dari makalah penelitian (poin terakhir) untuk menemukan bobot tersebut. Agaknya mudah digunakan! Pada dasarnya, pelatihan ini memberi contoh pelatihan dengan meletakkan beban (melalui algoritma KLIEP) sehingga asumsi memiliki distribusi kereta dan tes yang sama berlaku sebanyak mungkin.
Saya ingin mengambil sampel pengamatan dari set pelatihan yang sangat mirip dengan set tes.
Saya tidak yakin Anda ingin melakukan itu. Seluruh tujuannya bukan untuk melatih algoritma Anda sehingga generalisasi dengan baik untuk data yang tak terlihat.
Biasanya, seseorang harus menyesuaikan data pengujiannya dengan data kereta api (mis. Standarisasi data uji menurut data kereta ) dan bukan sebaliknya. Dalam praktiknya, Anda tidak tahu data pengujian Anda.
Subsampling set kereta mungkin bukan solusi terbaik!
Perbedaan antara set tes / pelaksanaan dan distribusi / fitur set pelatihan sangat umum dalam tugas pembelajaran yang diawasi (ini adalah salah satu alasan mengapa kompetisi seperti Kaggle menantang). Itu sebabnya kami mengatakan kinerja masa lalu mungkin (hanya) digunakan sebagai panduan untuk memperkirakan kinerja masa depan tetapi tidak menunjukkan / menjamin itu . Oleh karena itu, model yang dapat digeneralisasi selalu lebih disukai daripada model yang disetel dengan baik yang dapat berkinerja sangat baik pada set (sub) kereta tetapi berkinerja buruk pada data yang tidak terlihat.
Sementara perbedaan seperti itu normal, kesenjangan terlalu besar antara sampel masa lalu dan masa depan dapat disebut sebagai contoh drift konsep yang merupakan bidang penelitian aktif dengan sendirinya. Dengan pertanyaan Anda, saya tidak dapat menilai bahwa kasus Anda adalah kasus ML normal atau penyimpangan konsep benar-benar terjadi.
Ini saran saya:
Latih sejumlah model dengan kemampuan generalisasi tinggi. Menggunakan bootstrap pengambilan sampel dari dataset kereta Anda, Anda dapat dengan mudah menghitung Bias dan varians komponen kesalahan. Ingatlah bahwa Anda mencari model varians rendah (di mana perubahan data akan memiliki efek marjinal pada kinerjanya) daripada model bias rendah tetapi varians tinggi (yang mungkin cocok dengan set pelatihan (sub) Anda). Sekarang, Anda dapat memilih algoritma terbaik dan mengevaluasinya terhadap set tes. Perhatikan bahwa dalam waktu pelatihan kita seharusnya tidak melihat set tes!
Alih-alih beberapa downsampling acak, cari standardisasi / normalisasi dan pemilihan fitur / teknik. Teknik-teknik ini mungkin praktis dalam mempelajari model yang lebih umum. Misalnya, kadang-kadang rentang domain fitur dapat berubah dari waktu ke waktu sementara bentuk distribusi (apa pun itu) tetap hampir sama (misalnya distribusi yang sama yang bergeser ke kiri atau kanan). Dalam kasus seperti itu, standarisasi sederhana (yaitu memetakan kereta dan menguji sampel ke ruang yang telah ditentukan seperti [0,1] menggunakan fungsi pemetaan yang berbeda) dapat mengurangi gejala.
Downsampling sistematis hanya bisa menjadi solusi yang tepat jika Anda melakukannya berdasarkan beberapa pengetahuan tentang masalah (tidak hanya untuk tujuan mendapatkan akurasi yang lebih baik pada dataset uji). Misalnya, Anda mungkin tahu bahwa beberapa catatan dalam data kereta diambil sampelnya sejak lama, dari lapangan jauh, atau dipengaruhi oleh faktor-faktor tertentu yang tidak akan terjadi di masa depan (dalam pengumpulan data uji). Dalam kasus seperti itu, Anda dapat menghapus sampel yang mungkin tidak relevan karena Anda yakin bahwa Anda tidak akan melihat pola seperti itu di masa mendatang (maksud saya Anda harus memiliki alasan di balik pemilihan subset pelatihan daripada melihat ke set tes yang pada kenyataannya, Anda tidak memiliki akses ke sana). Dalam hal demikian, saya menyebutnya penghapusan outlier daripada downsampling.
Ada paket yang bagus dalam python (scikit belajar)
http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html
Anda dapat melakukan subsampel pengamatan Anda dari set pelatihan menggunakan paket ini.