我在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的正确数据集格式。所以这是一个不同的问题。请不要关闭。
答案 0 :(得分:1)
这个假设显然是错误的:
原因是由于此数据集中没有用户和项目的所有组合,因此ALS算法将不会看到用户和项目的所有组合,因此将为这些组合提供Null值。
并使此问题无效。 不需要用户和项目的所有组合。您只需要为每个项目和每个用户提供一些数据。直观地,如果您还没有看到用户或答案,它就不会出现在计算出的因素中,您无法对其进行推理。那就是它。
关于这个:
因此,对于用户尚未看到的项目,我们应该为每个用户创建一行,并将视图设为0?如下所示?
这可能在一定程度上与隐式反馈有关,但明确的一个显然是错误的。没有评级与最低评级不同。