我们的一个爱好项目是名字推荐系统NamesILike.com, 这已经不是什么秘密了。在问了20个问题以找出他们的口味之后, 该网站向用户推荐了名字。将来的父母通常会使用它来为预期的孩子取一个名字。
像这样的推荐系统在数据科学领域很热门!著名的例子是Spotify, Netflix, Pandora, Last.fm和YouTube的推荐系统。
推荐系统的挑战之一是尽可能快地了解用户的口味。用户上网时的关注时间通常较短, 希望很快看到结果。我们决定通过询问20个多项选择问题来了解用户的口味。每个问题列出4个名称, 用户可以从中指出自己喜欢的名称(无需过多考虑)。下面的屏幕快照提供了一个示例:
2017年12月, 由于病毒的传播, 我喜欢的名字吸引了大约40.000名访客。所有这些用户的点击都生成了一个不错的数据集, 因为我们跟踪向每个用户呈现的一系列问题以及选择的选项。
经过一些数据处理后, 我们可以构造一个用户反馈表, 其中” q”列为问题编号, ” f”列为反馈, ” n”列为名称。反馈是” c”代表未点击, 或者是” nc”代表未点击。我们将此表称为用户反馈表。
下表显示了随机用户的用户反馈表的前10行:
F | ñ | q | |
---|---|---|---|
0 | nc | Lia | 1 |
1 | C | Bo | 1 |
2 | nc | 海伦 | 1 |
3 | nc | Zehra | 1 |
4 | nc | Lou | 2 |
5 | nc | 中学 | 2 |
6 | nc | 劳伦斯 | 2 |
7 | C | 安妮莉丝 | 2 |
8 | nc | 六月 | 3 |
9 | C | 生活 | 3 |
用户项目矩阵(也称为效用矩阵)是通过串联所有用户反馈表而得出的。在我们的案例中, 项目是名字(对于Netflix, 项目是电影, 对于Spotify, 项目是歌曲)。每个cell_ij中的值告诉我们user_i是否单击了product_j。
我们对名称为3的名称的单击进行编码, 对值-1的非单击进行编码, 这样一来, 一个用户的反馈总和为零。
下表显示了用户项目矩阵的一部分。
名称 | 阿米莉亚 | 克拉拉 | 爱丽丝 | 艾玛 | 礼来公司 | 林德 | 中学 | Lou |
---|---|---|---|---|---|---|---|---|
用户身份 | ||||||||
0044dDn5Mh1V0O9Pwa8c | 3.0 | -1.0 | -1.0 | NaN | -1.0 | -1.0 | -1.0 | NaN |
00JcVTsDJ6wqJp4ymt40 | NaN | -1.0 | NaN | 3.0 | -1.0 | NaN | 3.0 | 3.0 |
00XJDcHhXwgAs64zRsZE | -1.0 | -1.0 | NaN | NaN | 3.0 | -1.0 | 3.0 | NaN |
010BLu21DwkpbZSVppZp | -1.0 | -1.0 | -1.0 | -1.0 | 3.0 | NaN | 3.0 | 3.0 |
01HiqB25APOJYRNgoEod | NaN | -1.0 | -1.0 | NaN | -1.0 | 3.0 | -1.0 | -1.0 |
01Ib76OTt49y3wUH0feO | NaN | NaN | -1.0 | -1.0 | NaN | NaN | NaN | 3.0 |
01MGzUmLfh4opU5FC6xd | 3.0 | -1.0 | NaN | -1.0 | NaN | -1.0 | NaN | -1.0 |
01hL2EYynEQA9CQBckSM | 3.0 | NaN | 3.0 | -1.0 | -1.0 | -1.0 | NaN | NaN |
0294V1C2QYgQ35tFkJkF | -1.0 | NaN | 3.0 | -1.0 | -1.0 | -1.0 | -1.0 | NaN |
02jmn1zx5aJ3oJBdx1Qb | -1.0 | NaN | 3.0 | NaN | NaN | NaN | 3.0 | 3.0 |
该表当然有很多缺失值(NaN), 因为不是每个用户都看到每个名字。推荐算法的技巧是通过预测缺失值来完成此矩阵。这些预测代表了我们希望用户提供的反馈, 该反馈到目前为止还没有出现。然后, 我们可以简单地对这些预测进行排名, 并推荐具有最高预测的项目(名字)。
有很多方法可以完成此矩阵, 但是我们在这里集中在用潜在因子模型完成矩阵上。对于此博客文章, 解释这种方法的细节太过分了, 但是我们建议你观看此出色的Stanford教程。
简而言之, 潜在因子模型的目标是通过两个(较小)矩阵的乘积来估计用户项矩阵, 其中第一个矩阵具有与用户相同的行数, 并且许多列表示”潜在特征” “。
第二个矩阵具有与项目相同的列数, 并且现在在行上编码了潜在特征。通过这种分解不可能对原始用户项矩阵进行完美估计, 但是我们尝试构建两个矩阵, 以使它们的乘积尽可能接近原始矩阵。然后, 它们的潜在特征对原始信息的分解, 紧凑表示进行编码。
这些潜在特征(或隐藏特征)是什么?它们代表什么?
这是很难说的, 因为它们是通过优化过程选择的。
回想一下, 以这样的方式构造潜在特征, 使得潜在特征矩阵的乘积尽可能接近完整矩阵。或者换句话说, 以这样的方式选择潜在特征, 使得从完整的用户项目矩阵到使用两个较小的潜在特征矩阵进行近似的信息损失尽可能小。下图显示了每个女性名字项目的前两个潜在特征的值:
通过视觉检查此图, 我们确实观察到在新的潜在特征空间中”相似”的名称彼此靠近放置:
- 法语名称(例如(Camille, Alic, Amelie))的潜在功能2值较低;
- 佛兰德语的名字(Fien, Fenne, Nore, Janne)似乎具有较高的潜在特征2值和较高的潜在特征1值;
- 短名称(Lia, Liz, Lou)的潜在特征1值似乎较低, 而潜在特征2的值较高。
我们认为这是神奇的。尽管对于我们人类来说, 朱丽叶这个名字与Estelle和Celeste接近是合乎逻辑的, 但是算法能够理解这种主观品味似乎很奇怪。但这确实是发生了什么:该算法理解了我们所有用户原始评分中存在的主观品味, 并且能够纯粹基于用户在我们网站上的点击来提取姓氏之间的相似性。
这些潜在的功能有助于我们做两件事:提高预测的准确性, 并为多项选择题设置抽样方案。有关更多信息, 请参见后面的博客文章。