1

我正在尝试使用Spark和Dataframes的新ML库来构建隐式评级的推荐程序。 我的代码与ML火花和数据帧的隐式推荐

from pyspark import SparkContext 
from pyspark.sql import SQLContext 
from pyspark.sql import Row 

from pyspark.ml.recommendation import ALS 

sc = SparkContext() 
sqlContext = SQLContext(sc) 

# create the dataframe (user x item) 
df = sqlContext.createDataFrame(
    [(0, 0), (0, 1), (1, 1), (1, 2), (2, 1), (2, 2)], 
    ["user", "item"]) 
als = ALS() \ 
    .setRank(10) \ 
    .setImplicitPrefs(True) 
model = als.fit(df) 
print "Rank %i " % model.rank 

model.userFactors.orderBy("id").collect() 
test = sqlContext.createDataFrame([(0, 2), (1, 0), (2, 0)], ["user", "item"]) 
predictions = sorted(model.transform(test).collect(), key=lambda r: r[0]) 
for p in predictions: print p 

不过,我在此错误运行

pyspark.sql.utils.AnalysisException:无法解析给定的输入列用户 '评级',项目;

所以,不知道如何定义数据帧

+0

你有什么做的代码行代表'DF = sqlContext.createDataFrame任何线索(单独的API调用[ (0,0),(0,1),(1,1),(1,2),(2,1),(2,2)],[“user”,“item”])'? – eliasah

回答

1

您似乎在尝试使用(用户,产品)元组,但你需要(用户,产品,等级)三胞胎。即使对于隐性评分,您也需要评分。如果它们完全相同,你可以使用一个像1.0这样的常量。

1

我很困惑,因为MLLIB API有隐含

http://spark.apache.org/docs/latest/mllib-collaborative-filtering.html

val alpha = 0.01 
val lambda = 0.01 
val model = ALS.trainImplicit(ratings, rank, numIterations, lambda, alpha) 
+0

MLLIB计划成为[弃用](http://stackoverflow.com/questions/30231840/difference-between-org-apache-spark-ml-classification-and-org-apache-spark-mllib)。通过对典型的机器学习工作流任务进行抽象的ML包,您可以利用现有的代码进行常见任务,例如参数调整。 – RAbraham