推荐系统的训练-测试拆分

数据挖掘 数据集 推荐系统 软件推荐
2021-09-28 14:07:19

到目前为止,在我见过的所有推荐系统的实现中,训练-测试拆分都是以这种方式执行的:

+------+------+--------+
| user | item | rating |
+------+------+--------+
| u1   | i1   |    2.3 |
| u2   | i2   |    5.3 |
| u1   | i4   |    1.0 |
| u3   | i5   |    1.6 |
| ...  | ...  |    ... |
+------+------+--------+

这被转换为以下形式的评级矩阵:

+------+-------+-------+-------+-------+-------+-----+
| user | item1 | item2 | item3 | item4 | item5 | ... |
+------+-------+-------+-------+-------+-------+-----+
| u1   | 2.3   | 1.7   |   0.5 |   1.0 | NaN   | ... |
| u2   | NaN   | 5.3   |   1.0 |   0.2 | 4.3   | ... |
| u3   | NaN   | NaN   |   2.1 |   1.3 | 1.6   | ... |
| ...  | ...   | ...   |   ... |   ... | ...   | ... |
+------+-------+-------+-------+-------+-------+-----+

其中NaN对应于用户没有评价该特定项目的情况。

现在,从矩阵的每一行(用户)中,删除一定百分比的数字(非 NaN)值,并将其放入一个新矩阵中,表示测试集。然后在初始矩阵上训练模型,移除测试样本,推荐器的目标是填充缺失值,尽可能减小误差。

我的问题是,训练测试拆分可以以某种方式以用户方式完成吗?例如,为了保持一组用户分开,在其余用户集上训练推荐器,然后尝试预测新用户的评分?我知道这有点违背“如果推荐者不认识你,它就不能推荐你喜欢的东西”的想法,但我想知道是否可以做一些 k-NN。

2个回答

我的两分钱,
评估推荐引擎的结果,其中测试集仅是看不见的用户,将允许你做到这一点。
仅评估未见过用户的结果。
如果这确实是您推荐引擎背后的动机(产品/业务方面),我建议您尝试直接解决这个问题。
如果评估“看不见的”用户的性能是一个额外的指标,而不是我在当前训练/测试拆分范围内保留的唯一指标(这应该在测试集中创建一些看不见的用户)。

关于如何最好地向看不见的用户推荐的方法,你的直觉(K-nn)是一种常见的解决方案。例如
这个

如果您使用的是稀疏矩阵,则可以使用 LightFM 中的此函数拆分训练/测试数据集:
lightfm.cross_validation.random_train_test_split

上面的链接说:

随机拆分训练和测试之间的交互。
该函数接受一个交互集并将其拆分为两个不相交的集,一个训练集和一个测试集。请注意,没有努力确保在测试集中有交互的所有项目和用户在训练集中也有交互;这可能会导致测试集中出现部分冷启动问题。

参数: 交互(包含交互的 scipy 稀疏矩阵)– 要拆分的交互。test_percentage (float, optional) -- 放置在测试集中的交互部分。random_state (np.random.RandomState, optional) – 用于随机播放的随机状态。返回:
(train, test) – scipy.sparse.COOMatrix) (train data, test data)的元组

返回类型:
scipy.sparse.COOMatrix,