一个标签上的 Vowpal Wabbit 矩阵分解

Vowpal Wabbit Matrix Factorization on one label

我所追求的是网络推荐系统,类似于 "related products"。根据用户购买的商品,我想根据其他用户购买的商品查找相关商品。我已经按照 MovieLens 教程 (https://github.com/JohnLangford/vowpal_wabbit/wiki/Matrix-factorization-example) 制作推荐系统。

在上面的示例中,用户给电影打了分 (1-5)。然后该模型可以预测用户会给特定项目打分。

另一方面,我的数据只知道用户喜欢什么。我不知道他们不喜欢什么,也不知道他们有多喜欢。所以我尝试发送 1 作为我所有条目的值,但这只给我一个模型,每个预测都是 returns 1。

关于如何构造我的数据以便我可以预测用户喜欢 0 到 1 之间的项目的可能性的任何想法?

示例数据:

1.0 |user 1 |item 1
1.0 |user 1 |item 2
1.0 |user 2 |item 2
1.0 |user 2 |item 3
1.0 |user 3 |item 1
1.0 |user 3 |item 3

训练命令:

cat test.vw | vw /dev/stdin -b 18 -q ui --rank 10 --l2 0.001 --learning_rate 0.015 --passes 20 --decay_learning_rate 0.97 --power_t 0 -f test.reg --cache_file test.cache

问题的简答:

要获得类似于 "probabilities" 的预测,您可以使用 --loss_function logistic --link logistic。请注意,在此单标签设置中,您的概率可能会迅速趋向于 1.0(即变得毫无意义)。

补充说明:

  • 从没有目标分离的意义上说,使用单个标签是有问题的。最终,学习者会将所有预测与 1.0 挂钩。为了解决这个问题——建议使用 --noconstant、使用强正则化、降低学习率、避免多次传递等(IOW:任何避免过度拟合单个标签的方法)
  • 更好:添加用户没有的示例 bought/clicked,它们应该很丰富,这将使您的模型更加健壮和有意义。
  • vw 中有更好的矩阵分解实现(大模型的 IO 更快更轻)。检查 --lrq 选项和源代码树中 demo/movielens 下的完整演示。
  • 您应该将训练集直接传递给 vw 以避免 Useless use of cat