我是机器学习世界的初学者和Apache Spark的使用者.
我已经按照https://databricks-training.s3.amazonaws.com/movie-recommendation-with-mllib.html#augmenting-matrix-factors上的教程进行了操作,并成功开发了该应用程序.现在,由于需要今天的Web应用程序需要由实时建议提供支持,我希望我的模型能够为不断出现在服务器上的新数据做好准备.该网站引用了:
获得推荐的更好方法是首先训练矩阵分解模型,然后使用您的评级来扩充模型.
我怎么做?我正在使用Python来开发我的应用程序.另外,请告诉我如何让模型再次使用它,或者我如何将其与Web服务进行交互.感谢您
我正在预测批量训练模型的流程之间的评级.我正在使用此处概述的方法:ALS模型 - 如何生成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)
Run Code Online (Sandbox Code Playgroud)
然后提取产品功能......
import json
import numpy as np
pf = model.productFeatures()
pf_vals = pf.sortByKey().values().collect()
pf_keys …Run Code Online (Sandbox Code Playgroud) 我试图弄清楚 ALS 模型如何预测新用户在批处理更新之间的值。在我的搜索中,我遇到了这个stackoverflow answer。为方便读者,我复制了以下答案:
您可以使用经过训练的模型(无需更新)获取对新用户的预测:
要获得模型中用户的预测,您可以使用其潜在表示(大小为 f(因子数)的向量 u),乘以乘积潜在因子矩阵(由所有产品的潜在表示组成的矩阵,一堆大小为 f) 的向量,并为您提供每个产品的分数。对于新用户,问题在于您无法访问他们的潜在表示(您只有大小 M(不同产品的数量)的完整表示,但您可以做的是使用相似度函数来计算相似的潜在通过乘以乘积矩阵的转置来表示这个新用户。
即,如果您的用户潜在矩阵是 u 并且您的产品潜在矩阵是 v,对于模型中的用户 i,您可以通过执行以下操作获得分数: u_i * v 对于新用户,您没有潜在表示,因此请使用完整表示 full_u 并执行: full_u * v^t * v 这将近似于新用户的潜在因素,并应该给出合理的建议(如果模型已经为现有用户提供了合理的建议)
为了回答训练问题,这允许您为新用户计算预测,而无需对模型进行繁重的计算,而您现在只能偶尔进行一次。因此,您可以在晚上进行批处理,并且仍然可以在白天对新用户进行预测。
注意:MLLIB 允许您访问矩阵 u 和 v
上面引用的文字是一个很好的答案,但是,我很难理解如何以编程方式实现这个解决方案。例如,矩阵 u 和 v 可以通过以下方式获得:
# pyspark example
# ommitted for brevity ... loading movielens 1M ratings
model = ALS.train(ratings, rank, numIterations, lambdaParam)
matrix_u = model.userFeatures()
print(matrix_u.take(2)) # take a look at the dataset
Run Code Online (Sandbox Code Playgroud)
这将返回:
[
(2, array('d', [0.26341307163238525, 0.1650490164756775, 0.118405282497406, -0.5976635217666626, -0.3913084864616394, -0.1379186064004898, …Run Code Online (Sandbox Code Playgroud) 我正在使用Apache Spark(Pyspark API for Python)ALS MLLIB开发一项服务,为我的站点中的匿名用户(不在训练集中的用户)执行实时推荐.在我的用例中,我以这种方式在用户评级上训练模型:
from pyspark.mllib.recommendation import ALS, MatrixFactorizationModel, Rating
ratings = df.map(lambda l: Rating(int(l[0]), int(l[1]), float(l[2])))
rank = 10
numIterations = 10
model = ALS.trainImplicit(ratings, rank, numIterations)
Run Code Online (Sandbox Code Playgroud)
现在,每次匿名用户选择目录中的项目时,我想在ALS模型中折叠其向量并获得建议(就像recommendedProducts()调用一样),但避免重新训练整个模型.
在Apache Spark中训练ALS模型后,有没有办法轻松完成新匿名用户向量的折叠?
提前致谢
python collaborative-filtering apache-spark pyspark apache-spark-mllib
我想尝试Spark使用MLlib进行协同过滤,如本教程中所述:https://databricks-training.s3.amazonaws.com/movie-recommendation-with-mllib.html 该算法基于"协作过滤"一文对于隐式反馈数据集",进行矩阵分解.
使用1000万个Movielens数据集,一切都正常运行.数据集分为80%培训10%测试和10%验证.
虽然具有不同的训练参数,但这些值与教程类似.
我尝试了几次运行算法,总是得到对我没有任何意义的建议.即使只评价儿童电影,我也会得到以下结果:
对于评级:
结果:
推荐给你的电影:
除了昨天以外似乎没有任何意义.
如果有人知道如何解释这些结果或获得更好的结果,我将非常感谢您分享您的知识.
最好的祝福
编辑:
如我所建议的那样,我训练了另
不同的个人评分:
machine-learning collaborative-filtering matrix-factorization apache-spark