Bu, seyrek SVD önerilerini pratikte uygulamak ya da ayrıntılar için kaynak kodunu incelemek isteyenler için sorunun "nasıl yapıldığını " denemek ve cevaplamaktır . Seyrek SVD'yi modellemek için kullanıma hazır bir FOSS yazılımı kullanabilirsiniz. Örneğin vowpal wabbit
, libFM
ya da redsvd
.
vowpal wabbit
"SVD benzeri" algoritmaların 3 uygulaması vardır (her biri 3 komut satırı seçeneğinden biri tarafından seçilebilir). Şüphesiz bunlar, saf "klasik" SVD "den ziyade" yaklaşık, yinelemeli, matris çarpanlaştırılması "olarak adlandırılmalıdır, ancak bunlar SVD ile yakından ilişkilidir. sıfırlar) matris.
İşte Netflix tarzı film önerileri vowpal wabbit
ve --lrq
benim için en iyi sonuç veren "düşük dereceli ikinci dereceden" ( ) seçeneğiyle yapmak için tam bir çalışma tarifi :
Veri kümesi formatı dosyası ratings.vw
(kullanıcı ve film tarafından bir satırdaki her derecelendirme):
5 |user 1 |movie 37
3 |user 2 |movie 1019
4 |user 1 |movie 25
1 |user 3 |movie 238
...
1'inci sayı (1 ile 5 yıldız arasında), ardından derecelendiren kullanıcının kimliği ve derecelendirilen film kimliği.
Test verileri aynı biçimdedir ancak (isteğe bağlı olarak) derecelendirme sütununu atlayabilir:
|user 1 |movie 234
|user 12 |movie 1019
...
isteğe bağlı olarak tahminleri değerlendirmek / test etmek için tahminleri karşılaştırmak için derecelendirmelere ihtiyacımız var. Derecelendirmeleri ihmal edersek vowpal wabbit
, yine de derecelendirmeleri tahmin eder ancak tahmin hatasını tahmin edemez (tahmin edilen değerler ve verilerdeki gerçek değerler).
Sormak eğitmek vowpal wabbit
bir dizi bulmak için N
onlar gibi (veya beğenmemek) kullanıcıları ve filmler arasındaki gizli etkileşim faktörlerinin. Bunu, benzer kullanıcıların bir film alt kümesini benzer şekilde derecelendirdiği ortak temalar bulmak ve bir kullanıcının henüz derecelendirmediği bir filmi nasıl derecelendireceğini tahmin etmek için bu ortak temaları kullanmak olarak düşünebilirsiniz .
vw
kullanmamız gereken seçenekler ve argümanlar:
--lrq <x><y><N>
"düşük dereceli ikinci dereceden" gizli faktörleri bulur.
<x><y>
: "um", veri kümesindeki kullanıcıları ve m [ovie] ad alanlarını aşmak anlamına gelir. Her ad boşluğunda yalnızca 1. harfin --lrq
seçenekle birlikte kullanıldığını unutmayın .
<N>
: N=14
aşağıda bulmak istediğimiz gizli faktörlerin sayısı
-f model_filename
: son modeli yaz model_filename
Yani basit bir tam eğitim komutu olacaktır:
vw --lrq um14 -d ratings.vw -f ratings.model
ratings.model
Model dosyasına sahip olduktan sonra , yeni bir veri setindeki ek derecelendirmeleri tahmin etmek için kullanabiliriz more_ratings.vw
:
vw -i ratings.model -d more_ratings.vw -p more_ratings.predicted
Tahminler dosyaya yazılacaktır more_ratings.predicted
.
Kaynak ağacında kullanarak demo/movielens
, 14 gizli faktörle (SVD orta matrisinin bir 14x14 satır x sütun matrisi olduğu anlamına gelir) ve bağımsız test üzerinde test vowpalwabbit
edildikten sonra 1 milyon kullanıcı / film değerlendirmesiyle ~ 0.693 MAE (Ortalama Mutlak Hata) ml-1m.ratings.train.vw
alıyorum test seti ml-1m.ratings.test.vw
. 0,69 MAE ne kadar iyi? Tümleşik tahmin (0) durumu [0 - 5] dahil, olası tahminlerin tümü için, 0.69 hatası, tüm aralığın ~% 13.8'i (0.69 / 5.0), yani yaklaşık% 86.2 doğruluktur (1 - 0.138).
Benzer bir veri seti (movielens) için github'daki vowpal wabbit
kaynak ağacında dokümantasyon içeren örnekler ve tam demo bulabilirsiniz :
Notlar:
movielens
Demo benim örnekten (basitlik için) atlanmıştır çeşitli seçenekler kullanır: özellikle --loss_function quantile
, --adaptive
ve--invariant
--lrq
İçinde uygulanması vw
çok daha hızlı daha --rank
depolamak ve modelleri yüklerken özellikle.
Kredi:
--rank
vw seçeneği Jake Hofman tarafından uygulandı
--lrq
vw seçeneği (isteğe bağlı bırakma ile) Paul Minero tarafından uygulandı
- vowpal wabbit (aka vw), John Langford'un beyin çocuğudur