使用 NearestNeighbour 推荐不同的产品

数据挖掘 推荐系统 k-nn
2022-03-14 21:05:18

我正在创建一个推荐系统,根据来自同一地区的其他用户的数据为用户推荐产品。

我的数据集如下

UserId    Product    Region    Rating
  1         A         R1        1.23
  2         A         R1        1.23
  3         A         R1        1.24  
  4         B         R1        1.45
  5         B         R1        1.23

我正在使用NearestNeighbour算法来找到 k 个最近的邻居

首先对于准备步骤,我确实得到了假人

dummies = pd.get_dummies(df)

这将热列 (userIdProduct)

应用最近邻

不是确切的代码..只是写了一部分。

neigh = NearestNeighbors(algorithm="euclidean")
neigh.fit(dummies)

使用kneighbours方法获取 5 个最近的邻居

neigh.kneighbors(input_1,5, return_distance=True)

我通过了第一排假人input_1

我确实收到了结果。但建议是行索引 [2,3 5]

这也是有道理的。地区、评级和产品几乎相同,因此它返回索引 2、3 和 5。

在这种情况下,前两个邻居是相同的产品(Product A)。只有第三个是不同的产品(Product B)。

在我的数据集中,我有超过 60k 行。即使 k=50,我也得到了相同产品的所有索引。

我尝试了另一种方法,

生成假人后,我取第一行(用于输入)并删除所有包含product A相关的行,然后运行 ​​fit 和 kneighbors。- 但它似乎没有效率。这更像是对每一行一次又一次的训练模型。

问题:

方法或算法完全错误吗?如何使用 NearestNeighbour 推荐不同的产品。

1个回答

几点说明:

  • 我不明白为什么用户 ID 包含在功能中,因为目标是找到类似的产品。它可能应该被删除。
  • 实际上,另一种方法是首先根据用户对产品的评分对用户进行聚类,以找到相似用户组,然后在特定的相似用户组中获得 k-NN。
  • 这里可能存在一个问题,即实例不包含任何匹配类似产品的信息。如果有产品描述,这些词可以用来查找语义相似的产品。
  • 从技术上讲,k-NN 并不训练模型,它只是存储实例并计算每个实例的相似度。至少在理论上,它可以很容易地优化以选择实例的子集。调整预定义的库函数可能并不容易(我不知道),但手动实现算法很容易。