Modelleri toplu olarak eğiten işlemler arasında derecelendirmeler tahmin ediyorum. ALS model - öngörülen full_u * v^t * v puanları çok yüksek
import json
import numpy as np
pf = model.productFeatures()
pf_vals = pf.sortByKey().values().collect()
pf_keys = pf.sortByKey().keys().collect()
Vt = np.matrix(np.asarray(pf_vals))
full_u = np.zeros(len(pf_keys))
def set_rating(pf_keys, full_u, key, val):
try:
idx = pf_keys.index(key)
full_u.itemset(idx, val)
except:
pass
set_rating(pf_keys, full_u, 260, 9), # Star Wars (1977)
set_rating(pf_keys, full_u, 1, 8), # Toy Story (1995)
set_rating(pf_keys, full_u, 16, 7), # Casino (1995)
set_rating(pf_keys, full_u, 25, 8), # Leaving Las Vegas (1995)
set_rating(pf_keys, full_u, 32, 9), # Twelve Monkeys (a.k.a. 12 Monkeys) (1995)
set_rating(pf_keys, full_u, 335, 4), # Flintstones, The (1994)
set_rating(pf_keys, full_u, 379, 3), # Timecop (1994)
set_rating(pf_keys, full_u, 296, 7), # Pulp Fiction (1994)
set_rating(pf_keys, full_u, 858, 10), # Godfather, The (1972)
set_rating(pf_keys, full_u, 50, 8) # Usual Suspects, The (1995)
recommendations = full_u*Vt*Vt.T
top_ten_ratings = list(np.sort(recommendations)[:,-10:].flat)
print("predicted rating value", top_ten_ratings)
top_ten_recommended_product_ids = np.where(recommendations >= np.sort(recommendations)[:,-10:].min())[1]
top_ten_recommended_product_ids = list(np.array(top_ten_recommended_product_ids))
print("predict rating prod_id", top_ten_recommended_product_ids)
tahmin derecelendirme yol çok yüksek görünüyor Ancak ...
ALS model - how to generate full_u * v^t * v?
! rm -rf ml-1m.zip ml-1m
! wget --quiet http://files.grouplens.org/datasets/movielens/ml-1m.zip
! unzip ml-1m.zip
! mv ml-1m/ratings.dat .
from pyspark.mllib.recommendation import Rating
ratingsRDD = sc.textFile('ratings.dat') \
.map(lambda l: l.split("::")) \
.map(lambda p: Rating(
user = int(p[0]),
product = int(p[1]),
rating = float(p[2]),
)).cache()
from pyspark.mllib.recommendation import ALS
rank = 50
numIterations = 20
lambdaParam = 0.1
model = ALS.train(ratingsRDD, rank, numIterations, lambdaParam)
Ardından ürün özelliklerini ayıklamak:
('predicted rating value', [313.67320347694897, 315.30874327316576, 317.1563289268388, 317.45475214423948, 318.19788673744563, 319.93044594688428, 323.92448427140653, 324.12553531632761, 325.41052886977582, 327.12199687047649])
('predict rating prod_id', [49, 287, 309, 558, 744, 802, 1839, 2117, 2698, 3111])
Bu görünür Burada belirtilen yaklaşımı kullanıyorum yanlış olmak. Herhangi bir ipucu takdir edildi.
Bunu kullanarak iyi sonuçlar elde ettim, ancak bu örtük geri bildirimle yapıldı, derecelendirmeler negatif veya bilinmeyen için 0 ve pozitif için 1 idi. 0 ile 1 arasında bir tahmin aldım ve bir metrik olarak rütbe kullanıyorum, yani puanlara fazla dikkat etmedim. –
Ah, ilginç. Henüz gizli bir geri bildirim almadım. Yorumunuzu bir yanıt olarak gönderirseniz, başka kimse cevap vermezse varsayılan olarak ödül kazanırsınız;) –
@ yoh.lej Ah, bu neden Chris gibi şişirilmiş derecelendirmeler aldığımı açıklıyor! Yani varsayım, o zaman derecelendirmelerin ikili olduğunu. Yohan, bu formülün neye dayandığını kısaca anlatabilir misin? Benzerlik ölçütlerini denedim ve görmedim. Benzerliği neye hesaplıyoruz? İlgi duyuyorum çünkü şu anda lineer cebir sınıfını alıyorum. Sadece mantıksal olarak, bu yeni kullanıcının hangi kullanıcıya benzediğini belirlemek istiyoruz ve derecelendirmeleri öngörmek için faktörlerini kullanıyoruz - bu yaklaşım daha karmaşık mı? Teşekkürler! (Chris - ALS'yi kontrol et.trainImplicit) – ScottEdwards2000