ALS 模型 - 预测 full_u * v^t * v 评级非常高
ALS model - predicted full_u * v^t * v ratings are very high
我正在预测批量训练模型的过程之间的评级。我正在使用此处概述的方法:
! 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])
这似乎不正确。任何提示表示赞赏。
如果您只关心电影的排名,我认为上述方法会奏效。如果您想获得实际评分,那么 dimension/scaling.
似乎有一些东西
这里的想法是猜测新用户的潜在表示。通常,对于已经在分解中的用户,用户 i,你有他的潜在表示 u_i
(model.userFeatures()
中的第 i 行),你可以使用 [= 获得他对给定电影(电影 j)的评分12=] 基本上将 u_i
乘以产品的潜在表示 v_j
。如果将整个 v 相乘,您可以立即获得所有预测评分:u_i*v
.
对于新用户,您必须根据 full_u_new
猜测他的潜在表示 u_new
是什么。
基本上你需要 50 个系数来代表你的新用户对每个潜在产品因素的亲和力。
为简单起见,因为它足以满足我的隐式反馈用例,我只是使用点积,基本上将新用户投射到产品潜在因子上:full_u_new*V^t
给你 50 系数,coeff i 是你的新用户的多少用户看起来像产品潜在因素 i。它特别适用于隐式反馈。
所以,使用点积会给你结果,但它不会被缩放,它解释了你所看到的高分。
要获得可用的分数,您需要更准确地缩放 u_new
,我认为您可以使用余弦相似度来获得它,就像他们在 [此处]https://github.com/apache/incubator-predictionio/blob/release/0.10.0/examples/scala-parallel-recommendation/custom-query/src/main/scala/ALSAlgorithm.scala
中所做的那样
@ScottEdwards2000 在评论中提到的方法也很有趣,但有所不同。您确实可以在训练集中寻找最相似的用户。如果有多个,你可以得到平均值。我不认为它会做得太糟糕,但它是一种非常不同的方法,您需要完整的评级矩阵(以找到最相似的用户)。获得一个亲密的用户肯定可以解决扩展问题。如果您设法使这两种方法都起作用,您可以比较结果!
我正在预测批量训练模型的过程之间的评级。我正在使用此处概述的方法:
! 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])
这似乎不正确。任何提示表示赞赏。
如果您只关心电影的排名,我认为上述方法会奏效。如果您想获得实际评分,那么 dimension/scaling.
似乎有一些东西这里的想法是猜测新用户的潜在表示。通常,对于已经在分解中的用户,用户 i,你有他的潜在表示 u_i
(model.userFeatures()
中的第 i 行),你可以使用 [= 获得他对给定电影(电影 j)的评分12=] 基本上将 u_i
乘以产品的潜在表示 v_j
。如果将整个 v 相乘,您可以立即获得所有预测评分:u_i*v
.
对于新用户,您必须根据 full_u_new
猜测他的潜在表示 u_new
是什么。
基本上你需要 50 个系数来代表你的新用户对每个潜在产品因素的亲和力。
为简单起见,因为它足以满足我的隐式反馈用例,我只是使用点积,基本上将新用户投射到产品潜在因子上:full_u_new*V^t
给你 50 系数,coeff i 是你的新用户的多少用户看起来像产品潜在因素 i。它特别适用于隐式反馈。
所以,使用点积会给你结果,但它不会被缩放,它解释了你所看到的高分。
要获得可用的分数,您需要更准确地缩放 u_new
,我认为您可以使用余弦相似度来获得它,就像他们在 [此处]https://github.com/apache/incubator-predictionio/blob/release/0.10.0/examples/scala-parallel-recommendation/custom-query/src/main/scala/ALSAlgorithm.scala
@ScottEdwards2000 在评论中提到的方法也很有趣,但有所不同。您确实可以在训练集中寻找最相似的用户。如果有多个,你可以得到平均值。我不认为它会做得太糟糕,但它是一种非常不同的方法,您需要完整的评级矩阵(以找到最相似的用户)。获得一个亲密的用户肯定可以解决扩展问题。如果您设法使这两种方法都起作用,您可以比较结果!