我正在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值。

因此,对于用户尚未看到的项目,我们也应该为每个用户为此创建一行,并将view设置为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的正确数据集格式。所以这是一个不同的问题。请不要关闭。

最佳答案

这个假设显然是错误的:


  原因是由于此数据集中没有用户和项目的所有组合,因此ALS算法不会看到用户和项目的所有组合,因此将在预测中给出Null值。


并使这个问题无效。不需要用户和项目的所有组合。您只需要为每个项目和每个用户提供一些数据。直观地,如果您没有看到用户或答案,则不会出现在计算出的因数中,并且您无法对此进行推理。而已。

对这个:


  因此,对于用户尚未看到的项目,我们也应该为每个用户为此创建一行,并将view设置为0?如下所示?


对于隐式反馈,这可能在某种程度上起作用,但是对于显式反馈,这显然是错误的。没有评分与可能的最低评分不同。

关于python - Spark中的协同过滤,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44102711/

10-09 16:45