Spark中的协作过滤

时间:2017-05-21 23:18:28

标签: python apache-spark pyspark collaborative-filtering

我在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独特的项目。但是,每个用户对每个项目都没有行,并且只有他们在这种情况下评级/查看的项目。它是一个隐式反馈数据集,其中Viewed列是否为。用户查看项目的次数。

现在这也是SparkML期望的格式(userid,itemid,rating)。

但是我的问题是,我可以像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 Collaborative过滤准备数据集?

我在这里纠正吗?

编辑:

另一个问题是关于如何创建笛卡尔连接,而不是如果笛卡尔连接是Spark ML的正确数据集格式。所以这是一个不同的问题。请不要关闭。

1 个答案:

答案 0 :(得分:1)

这个假设显然是错误的:

  

原因是由于此数据集中没有用户和项目的所有组合,因此ALS算法将不会看到用户和项目的所有组合,因此将为这些组合提供Null值。

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

关于这个:

  

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

这可能在一定程度上与隐式反馈有关,但明确的一个显然是错误的。没有评级与最低评级不同。