最近在写一些关于推荐系统的介绍,找了不少案例及资料,总觉得不够具体及深入,没有一些可作为基础及科普类,于是萌生自己来写一篇试试。
定义:推荐系统是信息过滤系统的子类,旨在预测用户对产品或服务的“评分”或“偏好”。
在过去的几年中,无论国内或国际上各大公司在推荐系统上投入了大量资金。2009 年,Netflix 向一个开发团队颁发了 100 万美元的奖金,用于奖励其将公司推荐引擎的准确性提高 10% 的算法。
推荐系统主要有两种类型:个性化和非个性化。
一、非个性化推荐
非个性化推荐系统(如基于流行度的推荐器)向用户推荐最受欢迎的Item,例如前 10 部电影、最畅销的书籍、最常购买的产品。
什么是好的推荐?
- 个性化的(与该用户相关)
- 多样化的(包括不同的用户兴趣)
- 第二次不向用户推荐相同商品的人
- 推荐可用产品的一种
二、个性化推荐
个性化推荐系统更详细地分析用户数据、他们的购买、评分以及他们与其他用户的关系。这样,每个用户都将获得定制的推荐。
目前最流行的个性化推荐系统类型是基于内容和协同过滤。
1、基于内容
基于内容的推荐系统使用item或用户元数据来创建特定的推荐。观察用户的购买历史。例如,如果用户已经阅读了一位作者的书或购买了某个品牌的产品,则假定该客户偏好该作者或该品牌,并且用户有可能在未来购买该品牌类似产品。假设 小红喜欢科幻小说,而她最喜欢的作家是 刘慈欣。如果她读 刘慈欣的书,那么她推荐的书将是疯狂的外星人,也是刘慈欣 写的科幻书。
实践中的协同过滤比基于内容的方法可实现更好的推荐结果。也许是因为结果的多样性不如协同过滤。
基于内容的推荐缺点:
- 滤泡现象:如果用户阅读了一本关于某种政治意识形态的书籍,并且向他推荐了与该意识形态相关的书籍,那么他将处于“他先前兴趣的泡沫”中。
- 需要收集有关用户及其偏好的大量数据以获得最佳推荐
- 在实践中,有 20% 的商品吸引了 70-80% 的用户关注,而 70-80% 的商品吸引了 20% 的用户关注。推荐的目标是介绍其他用户第一眼看不到的产品。在基于内容的方法中,这个目标没有在协同过滤中实现。
2、协同过滤
协同过滤的思路很简单:利用用户组行为向其他用户进行推荐。由于推荐基于其他用户的偏好,因此称为协作。
协同过滤有两种类型:基于内存的和基于模型的。
2.1 基于内存
基于内存的技术无需预处理即可应用于原始数据。它们易于实施,由此产生的建议通常易于解释。每次都需要对所有推荐的数据进行预测。
有两种类型:基于用户和基于Item的协同过滤。
- 基于用户:“与你相似的用户也喜欢……”产品是根据与观察到的用户相似的用户购买/喜欢的推荐给用户的。如果我们说用户相似,那是什么意思?例如,小明和小红喜欢科幻书籍。当一本新的科幻书出现时,小明买了那本书,因为小红也喜欢科幻书,那么我们可以向小红也推荐小明购买的书。
- 基于Item:“喜欢这个产品的用户也喜欢......”如果小明、小红和小花对科幻书籍 《时间简史》 和 《时间机器》 给予高度评价,例如给 5 星,那么当 小红购买 《时间简史》 这本书时,那么《时间机器》这本书也被推荐给他,因为系统根据用户评分将书籍识别为相似。
如何计算用户-用户和Item-Item相似度?
与使用关于用户或Item的元数据的基于内容的方法不同,基于协同过滤的方法观察并记忆用户行为,例如用户是否喜欢或Item是否被某个用户喜欢或评价。
例如,这个想法是向小明推荐新的科幻小说。
步骤:
- 创建用户Item评分矩阵
- 创建用户-用户相似度矩阵 (以下是示例)
- 计算每两个用户之间的余弦相似度(替代方案:调整余弦相似度、皮尔逊相似度、斯皮尔曼等级相关性)。这样就得到了一个用户-用户矩阵。该矩阵小于初始用户Item评分矩阵。
- 查找相似用户
- 在用户-用户矩阵中,观察到与小明最相似的用户
- 候选生成
- 当找到小明最相似的用户时,我们会查看这些用户阅读的书籍以及他们给出的评分。
- 候选人评分
- 根据评分,从小明最相似的用户最喜欢的书籍到他们最不喜欢的书籍进行排名。
- 结果被归一化(从 0 到 1)
- 候选过滤
- 正在检查小明是否已经购买了这些书。那些书应该被淘汰,因为他已经读过了。
Item相似度的计算以相同的方式完成,并且具有与用户-用户相似度相同的步骤。
基于用户和基于Item的方法的比较
Item之间的相似度比用户之间的相似度更稳定,因为数学书永远是一本数学书,但用户可以改变主意,例如他上周喜欢的东西下周可能不喜欢。另一个优点是产品比用户少。这导致得出的结论是,具有相似性分Item-Item矩阵将小于用户-用户矩阵。如果新用户访问该站点,而基于用户的方法在这种情况下是存在的,那么基于Item的方法也是一种更好的方法。
2.2 基于模型
这些模型是使用机器学习算法开发的。创建一个模型并基于它提供推荐候选结果,从而加快系统的工作。这种方法有更好的可扩展性。这种方法经常使用降维,最著名的方案是矩阵分解。
矩阵分解
如果有来自用户的反馈,例如,用户观看了特定的电影或阅读了特定的书并给出了评分,则可以以矩阵的形式表示,其中每行代表特定用户,每列代表一个特定Item。由于用户几乎不可能对每一个Item进行评分,因此该矩阵将有许多未填充的值,这称为稀疏性。矩阵分解方法用于找到一组潜在因素并使用这些因素确定用户偏好。可以通过分析用户行为来评价潜在信息,潜在因素也称为特征。
为什么要分解?
评分矩阵是两个较小矩阵的乘积:Item特征矩阵和用户特征矩阵。
矩阵分解步骤:
随机用户和Item矩阵的初始化
Ratings矩阵由用户乘以转置的item矩阵得到
矩阵分解的目标是最小化损失函数(预测矩阵和实际矩阵的评级差异必须最小)。每个评分可以描述为用户矩阵中的行和Item矩阵中的列的点积。
为了最小化损失函数,我们可以应用随机梯度下降(SGD)或交替最小二乘法(ALS)。这两种方法都可用于随着新评级的出现而增量更新模型。SGD 比 ALS 更快、更准确。
3、混合推荐
混合推荐代表不同推荐者的组合。一般是几个不同推荐器的组合将比单个算法提供更好的结果,实际上大多公司都是使用混合推荐
4、推荐系统指标
将使用哪些指标取决于要解决的业务指标。如果我们认为我们已经做出了最好的推荐方案并且指标很好,但在实践中它很不理想,那么我们的推荐方案就是不理想的。最重要的是用户对推荐系统要有信心,使用推荐系统的结果。如果我们向他推荐前 10 个产品,而只有 2 或 3 个与他相关,用户会认为推荐系统不好。出于这个原因,我们的想法不是总是推荐前 10 个Item,而是推荐超过某个阈值的Item项目。
指标:
- 准确度(MAE、RMSE)
- 测量前 N 个推荐人:
命中率:首先在训练数据中找到该用户历史中的所有Item;删除其中一项(交叉验证);使用所有Item作为推荐者并找到前 10 条推荐;如Item出现在前 10 条推荐中,则它是成功的。如果没有,它是不理想的。
平均互惠命中率(ARHR):我们推荐用户在排名中排名靠前的Item比排名靠Item更多。
累积命中率:那些低于某个阈值的评分被拒绝,例如低于 4 的评分
评分命中率- 计算每个item的评分,以确定哪种评分获得更多点击。将 top-N 列表中每种评分的命中数相加,然后除以 top-N 列表中每个评分的Item总数。
在线 A/B 测试:A/B 测试是对推荐系统进行在线评估的最佳方式。
推荐系统实际使用中的挑战
1、冷启动问题:出现了新用户,推荐什么?
- 例如前 10 名最畅销的产品
- 10大促销产品
- 可以采访用户以了解他喜欢什么
2、新用户出现了,新产品如何被用户认可?
- 使用基于内容的属性
- 随机添加新产品到用户推荐
- 推广新产品
3、行为搅动
- 由于用户随时间改变行为,一定量的随机化应该是推荐系统的一部分,以刷新推荐Item的前 N 个列表
4、注意不要对用户进行任何形式的区别对待
5、避免推荐结果包含粗俗词语、宗教和政治话题或毒品的商品