【发布时间】:2017-05-24 22:49:35
【问题描述】:
我正在预测批量训练模型的进程之间的评分。我正在使用此处概述的方法: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)
然后提取产品特征...
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)
但是预测的收视率似乎太高了:
('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])
这似乎是不正确的。任何提示表示赞赏。
【问题讨论】:
-
我使用这个确实得到了很好的结果,但这是带有隐式反馈的,评分为 0 表示负面或未知,1 表示正面。我确实得到了介于 0 和 1 之间的预测,并且我使用排名作为指标,即不太关注分数。
-
啊,有趣。我还没有研究隐式反馈。如果您将评论作为答案发布,如果没有其他人回答,您将默认获得赏金;)
-
@yoh.lej 啊,这就解释了为什么我的收视率像克里斯一样被夸大了!所以假设评级是二元的。 Yohan,你能简要解释一下这个公式的依据吗?我尝试用谷歌搜索相似性度量,但没有看到。我们在计算什么相似度?很感兴趣,因为我目前正在上线性代数课。从逻辑上讲,似乎我们也想确定这个新用户最相似的现有用户,并使用他们的因素来预测评级——这种方法更复杂吗?谢谢! (克里斯 - 查看 ALS.trainImplicit)
-
当然,我会在回答中详细说明
-
@yoh.lej- 你是如何使用排名作为衡量标准的?你能分享更多细节吗?
标签: apache-spark apache-spark-mllib apache-spark-ml