Set pelatihan saya berisi sekitar 50k entri yang saya gunakan untuk pembelajaran awal. Setiap minggu, ~ 5k entri ditambahkan; tetapi jumlah yang sama "menghilang" (karena ini adalah data pengguna yang harus dihapus setelah beberapa waktu).
Karena itu saya menggunakan pembelajaran online karena saya tidak memiliki akses ke dataset lengkap di lain waktu. Saat ini saya menggunakan SGDClassifier
yang berfungsi, tetapi masalah besar saya: kategori baru muncul dan sekarang saya tidak dapat menggunakan model saya lagi karena mereka tidak di awal fit
.
Apakah ada cara dengan SGDClassifier
atau model lain? Belajar mendalam?
Tidak masalah jika saya harus mulai dari awal SEKARANG (yaitu menggunakan sesuatu selain SGDClassifier
), tetapi saya membutuhkan sesuatu yang memungkinkan pembelajaran online dengan label baru.
Jawaban:
Sepertinya Anda tidak ingin mulai melatih ulang model setiap kali kategori label baru muncul. Cara termudah untuk menyimpan informasi maksimal data masa lalu adalah melatih satu classifier per kategori.
Dengan cara ini Anda dapat terus melatih setiap classifier secara bertahap ("online") dengan sesuatu seperti
SGDClassifier
tanpa harus melatihnya kembali. Setiap kali kategori baru muncul, Anda menambahkan classifier biner baru untuk kategori itu. Anda kemudian memilih kelas dengan probabilitas / skor tertinggi di antara set pengklasifikasi.Ini juga tidak jauh berbeda dari apa yang Anda lakukan hari ini, karena
scikit's SDGClassifier
sudah menangani skenario multikelas dengan memasang beberapa pengklasifikasi "Satu vs Semua" di bawah tenda.Jika banyak kategori baru terus muncul, tentu saja, pendekatan ini mungkin menjadi sedikit sulit untuk dikelola.
sumber
warm_start
opsi.Jika kategori baru datang sangat jarang, saya sendiri lebih suka solusi "satu vs semua" yang disediakan oleh @oW_ . Untuk setiap kategori baru, Anda melatih model baru pada jumlah sampel X dari kategori baru (kelas 1), dan jumlah sampel X dari sisa kategori (kelas 0).
Namun, jika kategori baru sering datang dan Anda ingin menggunakan model bersama tunggal , ada cara untuk melakukannya dengan menggunakan jaringan saraf.
Singkatnya, setelah kedatangan kategori baru, kami menambahkan node baru yang sesuai ke lapisan softmax dengan nol (atau acak) bobot, dan menjaga bobot lama tetap utuh, kemudian kami melatih model yang diperluas dengan data baru. Berikut ini adalah sketsa visual untuk ide tersebut (digambar sendiri):
Berikut ini adalah implementasi untuk skenario lengkap:
Model dilatih pada dua kategori,
Kategori baru tiba,
Format model dan target diperbarui sesuai,
Model dilatih tentang data baru.
Kode:
yang keluaran:
Saya harus menjelaskan dua poin mengenai output ini:
Performa model menurun dari
0.9275
menjadi0.8925
hanya dengan menambahkan node baru. Ini karena output dari simpul baru juga termasuk untuk pemilihan kategori. Dalam prakteknya, output dari simpul baru harus dimasukkan hanya setelah model dilatih pada sampel yang cukup besar. Sebagai contoh, kita harus memuncak dua entri pertama terbesar[0.15, 0.30, 0.55]
, yaitu kelas 2, pada tahap ini.Kinerja model yang diperluas pada dua kategori (lama)
0.88
kurang dari model yang lama0.9275
. Ini normal, karena sekarang model extended ingin menetapkan input ke salah satu dari tiga kategori, bukan dua. Penurunan ini juga diharapkan ketika kami memilih dari tiga pengklasifikasi biner dibandingkan dengan dua pengklasifikasi biner dalam pendekatan "satu vs semua".sumber
Saya harus mengatakan bahwa saya belum menemukan literatur mengenai topik ini. Sejauh yang saya tahu, apa yang Anda minta tidak mungkin. Anda harus mengetahui hal ini, dan pemilik produk juga harus tahu. Alasannya adalah bahwa setiap fungsi kerugian bergantung pada label yang dikenal, jadi tidak mungkin Anda dapat memprediksi label yang tidak ada dalam data pelatihan. Juga, adalah fiksi ilmiah bahwa algoritma pembelajaran mesin dapat memprediksi sesuatu yang belum dilatih
Karena itu, saya pikir mungkin ada solusi (izinkan saya menunjukkan bahwa ini adalah pendapat yang tidak didasarkan pada literatur formal). Jika classifier adalah probabilistik, output adalah probabilitas untuk setiap kelas menjadi benar dan keputusannya adalah prob yang lebih tinggi. Mungkin Anda bisa menetapkan ambang batas untuk probabilitas itu, sehingga model memprediksi "tidak diketahui" jika semua probabilitas di bawah ambang itu. Biarkan saya memberi Anda sebuah contoh.
Biarkan menjadi model sedemikian rupa sehingga: diberi , memutuskan apakah milik satu dari tiga kategori . Output dari adalah vektor probabilitas . Keputusan dibuat dengan mengambil prob tertinggi di . Jadi output dari akan sesuai dengan keputusan milik . Anda dapat mengubah keputusan ini dengan menetapkan seperti itu jika tidak ada maka keputusannya adalah milik kelas yang tidak dikenalM(x) x x c1,c2,c3 M p p M(x)=p(x)=(0.2,0.76,0.5) x c2 τ pi≥τ x
Apa yang Anda lakukan dengan yang tidak diketahui itu tergantung pada logika bisnis. Jika mereka penting, Anda dapat membuat kumpulan mereka dan melatih kembali model menggunakan data yang tersedia. Saya pikir Anda dapat melakukan semacam "transfer pembelajaran" dari model yang terlatih dengan mengubah dimensi output. Tapi ini adalah sesuatu yang belum saya hadapi, jadi saya hanya mengatakan
Ambil hitungan yang
SGDClassifier
menggunakan diSVM
bawahnya, yang bukan algoritma probabilistik. BerikutSGDClassifier
dokumentasi Anda dapat memodifikasiloss
argumen untukmodified_huber
ataulog
untuk mendapatkan output probabilistik.sumber
Ada dua opsi:
Memprediksi peluang titik data milik
unk
kategori atau tidak diketahui . Setiap kategori baru yang muncul dalam aliran harus diprediksi sebagaiunk
. Ini biasa terjadi di Natural Language Processing (NLP) karena selalu ada token kata baru yang muncul di aliran kata.Latih kembali model setiap kali kategori baru muncul.
Karena Anda menyebutkan
SGDClassifier
, saya menganggap Anda menggunakan scikit-belajar. Scikit-belajar tidak mendukung pembelajaran online dengan sangat baik. Akan lebih baik untuk beralih kerangka kerja yang lebih baik mendukung streaming dan pembelajaran online, seperti Spark .sumber