【发布时间】:2017-10-21 12:17:14
【问题描述】:
我正在 SparkML 中为隐式反馈数据集运行协同过滤。
假设我的数据集如下所示。
User Item viewed
1 A 1
1 B 2
2 A 3
2 C 4
3 A 3
3 B 2
3 D 6
所以我有大约 56K 的唯一用户和 8.5K 的唯一项目。但是,在这种情况下,每个用户没有每个项目的行,而只有他们评价/查看的项目。这是一个隐式反馈数据集,其中“查看”列是第。用户查看项目的次数。
现在这也是 SparkML 期望的格式(用户 ID、项目 ID、评级)。
但是我的问题是,我可以像 SparkML ALS 算法一样直接输入这个数据集,还是需要创建所有用户和项目的笛卡尔连接?原因是由于此数据集中没有用户和项目的所有组合,ALS 算法不会看到用户和项目的所有组合,因此会在预测中给出 Null 值。
所以对于用户还没有看到的项目,我们也应该为每个用户创建一个行并将视图设为 0?像下面这样?
User Item Viewed
1 A 1
1 B 2
1 C 0
1 D 0
2 A 3
2 C 4
2 B 0
2 D 0
3 A 3
3 B 2
3 D 6
3 C 0
如果这是正确的,那么我有 56K 唯一用户和 8.5K 唯一项目。这将使 56*8.5K= 400MM 行。
想象一下,如果用户数以百万计,物品数以百万计。在那种情况下,它将是巨大的数据集。
我做了笛卡尔的事情,它似乎给出了正确的预测,没有像之前那样的 Null 值。但我想确认这是否需要为 Spark 协作过滤准备数据集?
我说的对吗?
编辑:
另一个问题是关于如何创建笛卡尔连接,而不是笛卡尔连接是否是 Spark ML 的正确数据集格式。所以这是一个不同的问题。请不要关闭。
【问题讨论】:
-
嘿@baktaawar,您找到问题的明确答案了吗?我会很感兴趣的!
-
@Duesentrieb 不完全是,但我认为我在这里写的是正确的。对于隐式反馈,您必须进行笛卡尔连接,除非您可以接受没有一些建议。我与来自 Cloudera 的 Sean Owen 在电子邮件中就此进行了长时间的讨论,他后来同意我所说的有道理。我认为这是 Spark ppl 没有意识到的事情,可能就像一个错误。
标签: python apache-spark pyspark collaborative-filtering