2020 推荐系统入门 (1)

recommendation_sys.jpeg

推荐系统

推荐系统概观

什么是推荐系统

那么什么是推荐系统,推荐系统做了那些工作呢?其实推荐系统就是根据用户的历史信息和行为,向用户推荐他感兴趣的内容或商品。

推荐系统的重要性

这个应该不用说了,现在很多企业背后成功都少不了推荐系统,例如今日头条、淘宝、京东以及国外的 Netflix 和亚马逊。

推荐系统解决哪些问题

  • 信息过载,当前信息量过多,每次要在京东上买东西,都是看了又看,比了有比,想了又想,话费很长时间才能买到自己想要商品。我们如何提用户进行筛选过滤帮助用户快速找到自己想要东西呢。
  • 挖掘长尾,根据销量的推荐系统,就只会考虑商品销量和热度进行推荐,而这些商品可能只占有总体商品一小部分,其后大部分商品得不到推荐,而这些排在后面商品并不是没有销量,而且他们销量面积可能还要大于热门商品销售面积,所以我们需要推荐系统将他们也进行推荐给用户。
  • 提升用户体验,这个我们就不说了,想一想我们总是沉迷于抖音而忘记了时间就知道了。

推荐系统分类

  • 实时推荐系统和离线推荐系统
  • 基于统计推荐
  • 个性化推荐
  • 根据数据源进行划分基于人口统计学的推荐、基于内容推荐和基于协同过滤
    • 基于人口统计学的推荐,我们拿到用户信息然后就可以给用户打标签,然后根据用户标签进行用户聚类,也就是将相似用户划分为一类,例如 A 和 B 用户同属于一组,我们就可以把 B 喜欢商品推荐给 A。同一个用户根据我们划分维度可能属于多个组,分组可以用机器学出来。用户信息标签化的过程一般就是我们平时说的用户画像(User Profiling),这里问题就是用户信息难收集,因为用户收集过多可能影响用户体验,所以我们能做的就是通过用户行为来推荐用户信息。我们可以将用户行为映射出用户信息,从而描绘出一个完整用户。现在所有几乎所有 app 都在尝试对用户进行分析,提供用户信息。
    • 基于内容的推荐算法,是基于商品相似度进行推荐。这个应该很好理解。也就是我们说的 CB(Content-based Recommendations)。其实拿到商品数据,还需要看我们怎么搞这些数据,这个环节是重要,我们如何对商品特性进行加权,根据用户行为(评价)来调整商品特征,其实每一个商品对于每一类用户或者每一个用户其特征维度和权重应该是不同的。这是我个人一点见解。我们又可以用户信息特征和物品的特征进行匹配,就可以给用户进行推荐了。如果请专业的人员对物品进行打标签(PGC)。对于商品特征的提取,我们可以采用 PGC(专家标签)、UGC(用户自定义标签)或者是 LFM(降维分析数据,提取语义标签) 而对于文本信息提取,可以使用自然语言处理的分词、语义处理和情感分析。

推荐系统中的算法

  • 相似度计算,在推荐系统往往用到余弦相似度作为
    • 欧式距离 d(x,y) = \sqrt{\sum_{i}(x_i- y_i)^2}
    • 余弦相似度 \cos \theta = \frac{a b}{||a|| \times ||b||} = \frac{\sum_i x_i,y_i}{\sqrt{\sum_i x_i^2}\times \sqrt{\sum_i y_i^2}}
  • 在深度学习,我们通过词嵌入(embedding)来表示不同用户或商品相似度,这个也是我们随后重点讨论内容.
  • SVD

特征工程

当我们打算买一套房子,我们会考虑面积、价格、朝向以及周边设施等等因素,这些因素就是商品的特征。所谓特征工程就是对数据进行一些处理、数据清洗、异常值处理以及数据归一化等等的工作。多数人更看重模型设计和训练,其实只有好的数据才能训练结果保证,因为 ImageNet 出现才有今天深度学习的发展,所以数据处理这个工作非常重要,不可以忽视。好了我们在特征工程主要做两件事特征处理特征选择。特征选择是有一定技巧的。

特征处理

  • 数值型: 主要进行归一化和离散化,例如房屋的价格和房屋的面积幅度不同,也就是他们作为房屋特征,取值范围却相差很大,价格在几十万,而面积大概取之集中在 100 左右。因为其取值范围导致他们对最后评估有影响权重不同,我们需要通过数据处理来消除。这就是归一化的作用。x_new = \frac{x_old}{x_max - x_min},离散化h_{\theta} = g(\theta^Tx)=\frac{1}{1 + e^{-\theta^Tx}} 所谓离散化,就是我们需要将连续值划分为几个范围,例如房屋面积划分为小户型面积 30 - 60,可以通过one-hot编码来表示划分取值范围。在京东中通过价格划分价格。离散化可以进行等步长划分或者等频划分。等频不适合经常变化值的特征。例如价格在不断变换
  • 类别型: 本身就是离散取值,尽量区分开,没有大小关系,我们通常使用 one-hot 编码
颜色 R G B
Red 1 0 0
Green 0 1 0
Blue 0 0 1
  • 时间型: 可以是连续值也可以是离散值,离散值,可能为一天哪几个时间段登录,一周中的星期几。
  • 统计型: 加减平均、分位线、次序性和比例类

反馈数据

我们需要反馈数据不断评估和优化我们模型,
| 用户行为 | 类型 | 特征 |作用|
|---|---|---|---|---|---|
| 评分 | 显示 | 整数量化的偏好 | 通过用户对商品的评分 |
| 投票 | 显示 | 布尔量化的偏好 | 通过用户投票 |
| 转发 | 显示 | 布尔量化的偏好 | 通过用户投票 |
| 保存/收藏 | 显示 | 布尔量化的偏好 | 通过用户投票 |
| 打标签 | 显示 | 一些单词,需要对单词进行分析,得到偏好 | 通过用户投票 |
| 评论 | 显示 | 一段文字,需要进行文本分析,得到偏好 | 通过用户投票 |
| 点击浏览 | 隐示 | 布尔量化的偏好 | 通过用户投票 |
| 页面停留时间 | 隐示 | 布尔量化的偏好 | 用户页面停留时间一定程度反映了用户偏好,但是可能会有噪音 |
| 购买 | 隐示 | 布尔量化的偏好,取值是 0 或 1 | 通过用户投票 |

UGC 也是用户反馈一种表现。大家都知道用户行为多么重要,无论喜欢还是不喜欢只要用户给出自己评价和标签就是说明用户对该商品的重视程度,当然我们需要排除一些噪音或者认为干涉出现的效果。我们可以用(u,i,b)表示用户 u 给商品 i 打了标签 b

一个简单的算法

  • 统计每个用户最常用的标签
  • 对于每个标签,统计被打过的这个标签次数最多的商品
  • 对于每个用户,首先找到他常用的标签,然后找到具有这些标签的最热门的物品,推荐给他
  • 所以用户 u 对物品 i 的兴趣公式为
    p(u,i) = \sum_b n_{u,b}n_{b,i}
  • 其中n_{u,b}是用户 u 打过标签 b 的次数 n_{b,i} 是物品 i 被打过标签 b 的次数

UGC 简单推荐的问题

简单算法中直接将用户打出标签的次数和物品得到的标签次数相乘,可以简单地表现出用户对物品对某个特征的兴趣。
这种方法倾向于给热门标签、热门物品比较大的权重,如果一个热门物品时对应热门标签,新颖就会降低。在文本分析上统计词频时,根据词出现频率来统计关键词。