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