使用 ML spark 和数据帧进行隐式推荐

Posted

技术标签:

【中文标题】使用 ML spark 和数据帧进行隐式推荐【英文标题】:implicit recomendation with ML spark and data frames 【发布时间】:2015-10-04 10:03:38 【问题描述】:

我正在尝试使用带有 Spark 和 Dataframes 的新 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:无法解析给定输入列用户、项目的“评级”;

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

【问题讨论】:

你知道这行代码代表什么df = sqlContext.createDataFrame([(0, 0), (0, 1), (1, 1), (1, 2), (2, 1), (2, 2)],["user", "item"])吗? 【参考方案1】:

您似乎正在尝试使用 (user, product) 元组,但您需要 (user, product, rating) 三元组。即使对于隐式评级,您也确实需要评级。如果它们都相同,您可以使用像 1.0 这样的常量。

【讨论】:

【参考方案2】:

我很困惑,因为 MLLIB API 有一个单独的隐式 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)

【讨论】:

MLLIB 计划为deprecated。 ML 包通过抽象典型的机器学习工作流任务让您可以利用现有代码执行常见任务,例如参数调整。

以上是关于使用 ML spark 和数据帧进行隐式推荐的主要内容,如果未能解决你的问题,请参考以下文章

下载基于大数据技术推荐系统实战教程(Spark ML Spark Streaming Kafka Hadoop Mahout Flume Sqoop Redis)

Spark ML 协同过滤隐式反馈与类计数数据

推荐系统-01-简单逻辑回归

pyspark ml 推荐 - Als 推荐

使用 Pyspark 从结构化流数据帧构建 Spark ML 管道模型

Spark:测量 ALS 的性能