Ini untuk mencoba dan menjawab bagian "bagaimana" dari pertanyaan bagi mereka yang ingin menerapkan rekomendasi SVD jarang atau memeriksa kode sumber untuk detailnya. Anda dapat menggunakan perangkat lunak FOSS yang tidak tersedia untuk memodelkan sparse-SVD. Sebagai contoh, vowpal wabbit, libFM, atau redsvd.
vowpal wabbitmemiliki 3 implementasi algoritma "mirip SVD" (masing-masing dapat dipilih oleh salah satu dari 3 opsi baris perintah). Sebenarnya ini harus disebut "perkiraan, iteratif, faktorisasi matriks" daripada SVD "klasik" murni tetapi mereka terkait erat dengan SVD. Anda mungkin menganggapnya sebagai faktorisasi SVD perkiraan yang sangat efisien secara komputasional dari faktor jarang (kebanyakan nol) matriks.
Inilah resep lengkap dan bekerja untuk melakukan rekomendasi film gaya Netflix dengan vowpal wabbitdan --lrqopsi "kuadrat rendah" ( ) yang tampaknya bekerja paling baik untuk saya:
File format kumpulan data ratings.vw(setiap peringkat pada satu baris menurut pengguna dan film):
5 |user 1 |movie 37
3 |user 2 |movie 1019
4 |user 1 |movie 25
1 |user 3 |movie 238
...
Di mana nomor 1 adalah peringkat (1 hingga 5 bintang) diikuti oleh ID pengguna yang memberi peringkat dan dan ID film yang diberi peringkat.
Data uji dalam format yang sama tetapi dapat (secara opsional) menghilangkan kolom peringkat:
|user 1 |movie 234
|user 12 |movie 1019
...
opsional karena untuk mengevaluasi / menguji prediksi kita perlu peringkat untuk membandingkan prediksi. Jika kami mengabaikan peringkat, vowpal wabbitmasih akan memperkirakan peringkat tetapi tidak akan dapat memperkirakan kesalahan prediksi (nilai prediksi vs nilai aktual dalam data).
Untuk melatih, kami meminta vowpal wabbituntuk menemukan serangkaian Nfaktor interaksi laten antara pengguna dan film yang mereka sukai (atau tidak suka). Anda dapat berpikir tentang hal ini sebagai menemukan tema umum di mana pengguna yang sama memberi peringkat subset film dengan cara yang sama dan menggunakan tema umum ini untuk memprediksi bagaimana pengguna akan menilai film yang belum diperingkatnya.
vw opsi dan argumen yang perlu kita gunakan:
--lrq <x><y><N> menemukan faktor laten "peringkat rendah".
<x><y>: "um" berarti menyeberangi u [sers] dan m [ovie] ruang-nama dalam kumpulan data. Perhatikan bahwa hanya huruf 1 di setiap ruang nama yang digunakan dengan --lrqopsi.
<N>: di N=14bawah ini adalah jumlah faktor laten yang ingin kita temukan
-f model_filename: tulis model akhir menjadi model_filename
Jadi perintah pelatihan penuh sederhana adalah:
vw --lrq um14 -d ratings.vw -f ratings.model
Setelah kami memiliki ratings.modelfile model, kami dapat menggunakannya untuk memprediksi peringkat tambahan pada set data baru more_ratings.vw:
vw -i ratings.model -d more_ratings.vw -p more_ratings.predicted
Prediksi akan ditulis ke file more_ratings.predicted.
Menggunakan demo/movielensdi vowpalwabbitpohon sumber, saya mendapatkan ~ 0,693 MAE (Mean Absolute Error) setelah pelatihan pada 1 juta pengguna / film peringkat ml-1m.ratings.train.vwdengan 14 faktor laten (berarti bahwa matriks tengah SVD adalah 14x14 baris x kolom matriks) dan pengujian pada independen set-tes ml-1m.ratings.test.vw. Seberapa baik 0,69 MAE? Untuk rentang penuh dari kemungkinan prediksi, termasuk case (0) [0 hingga 5] tanpa kesalahan, kesalahan 0,69 adalah ~ 13,8% (0,69 / 5.0) dari kisaran penuh, yaitu sekitar akurasi 86,2% (1 - 0,138).
Anda dapat menemukan contoh dan demo lengkap untuk kumpulan data yang serupa (movielens) dengan dokumentasi di vowpal wabbitpohon sumber di github:
Catatan:
- The
movielensdemo menggunakan beberapa pilihan saya dihilangkan (untuk kesederhanaan) dari contoh saya: khususnya --loss_function quantile, --adaptivedan--invariant
- The
--lrqimplementasi dalam vwjauh lebih cepat daripada --rank, khususnya ketika menyimpan dan memuat model.
Kredit:
--rank Opsi vw diimplementasikan oleh Jake Hofman
--lrq Opsi vw (dengan dropout opsional) diterapkan oleh Paul Minero
- vowpal wabbit (alias vw) adalah anak otak John Langford