我正在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/