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 wabbit
memiliki 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 wabbit
dan --lrq
opsi "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 wabbit
masih akan memperkirakan peringkat tetapi tidak akan dapat memperkirakan kesalahan prediksi (nilai prediksi vs nilai aktual dalam data).
Untuk melatih, kami meminta vowpal wabbit
untuk menemukan serangkaian N
faktor 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 --lrq
opsi.
<N>
: di N=14
bawah 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.model
file 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/movielens
di vowpalwabbit
pohon sumber, saya mendapatkan ~ 0,693 MAE (Mean Absolute Error) setelah pelatihan pada 1 juta pengguna / film peringkat ml-1m.ratings.train.vw
dengan 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 wabbit
pohon sumber di github:
Catatan:
- The
movielens
demo menggunakan beberapa pilihan saya dihilangkan (untuk kesederhanaan) dari contoh saya: khususnya --loss_function quantile
, --adaptive
dan--invariant
- The
--lrq
implementasi dalam vw
jauh 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