一、推荐系统架构与机器学习基础理论
1 机器学习发展历程与架构原理
1.1 发展历程
-
大数据时代: 频率近似为概率
-
计算机性能 :计算速度提升
时间段 | 发展时期 | 主流技术 |
---|---|---|
二十世纪五十年代初至七十年代初 | 推理期 | 运用基于符号知识表示的演绎推理技术 |
二十世纪七十年代中期至八十年代 | 知识期 | 基于符号知识表示,通过获取和利用领域知识来建立专家系统 |
二十世纪八十年代至今 | 学习期 | 两大主流技术分别是符号主义学习和基于神经网络的连接主义学习 |
1.2 优化问题与凸优化问题
-
任何的机器学习问题都可以归结于优化问题
-
任何优化问题都可以具体为多个凸优化
-
优化问题:也叫最优化问题,是指在一定约束条件下,求解一个目标函数的最大值(或最小值)问题。
- 优化问题一般都是通过迭代的方式来求解:通过猜测一个初始的估计值,然后不断迭代产生新的估计值,最终收敛到期望的最优解。一个好的优化算法应该是在 一定的时间或空间复杂度下能够快速准确地找到最优解。
-
凸优化:凸优化是指一种比较特殊的优化,是指求取最小值的目标函数为凸函数的一类优化问题。
- 目的是求取目标函数的最小(优)值;
- 目标函数和不等式约束函数都是凸函数,定义域是凸集;
- 若存在等式约束函数,则等式约束函数为仿射函数;
- 对于凸优化问题具有良好的性质,局部最优解便是全局最优解。
1.3 推荐系统的背景
随着移动互联网的快速发展,我们进入了信息爆炸时代。当前通过互联网提供服务的平台越来越多,相应的服务种类层出不穷,服务的种类也越来越多样,这么多的信息怎么让需要它的人找到它, 满足用户的各种需要
-
分类导航:信息缺乏,用户主动寻找信息
-
搜索引擎:信息丰富,用户主动寻找信息
-
推荐系统:信息泛滥,信息寻找用户
推荐系统是一项工程技术解决方案,通过利用机器学习等技术,在用户使用产品进行浏览交互的过程中,系统主动为用户展示可能会喜欢的物品,从而促进物品的“消费”,节省用户时间,提升用户体验, 做到资源的优化配置。从本质上讲,推荐系统提升了信息分发和信息获取的效率。
1.3.1 搜索引擎与推荐系统的区别
-
搜索引擎:满足用户有明确目的时主动查找的需求
-
推荐系统:帮助用户在没有明确目的时,发现感兴趣的内容
1.4 推荐系统的构成
- 前台为我们展示信息,会让你对这个信息进行打分,点赞,关注等
- 后台的日志系统会把你的这些操作录入日志中
- 最后我们的推荐算法,通过对你的打分,关注等的信息进行计算,为你推荐一些相同的信息
1.5 推荐系统的架构
- 推荐系统通用架构图,主要包括:底层基础数据、数据加工存储、召回内容、计算排序、过滤和展示、业务应用。
- 底层基础数据是推荐系统的基石,只有数据量足够多,才能从中挖掘出更多有价值的信息,进而更好地为推荐系统服务。
- 我们的数据量很大,并不能直接把所有的物品数据全部输送到推荐系统进行排序。在进行物品召回时可以基于一些常用的机器学习算法构建用户偏好模型、用户兴趣模型、物品相似模型、物品互补模型等。在进行内容召回时,只召回和用户有偏好关系、和用户有直接关联、和用户有直接关系的相关物品,输入排序模型,进行打分排序
- 在得到召回的物品之后,就要考虑如何对这些物品进行正确的排序。目前业界在机器学习领域最普遍的做法是将排序推荐模型作为二分类模型来训练,即在构造样本集的过程中对应的标签为0或1(未点击或点击)。常用的排序算法包括但不局限于GBDT、LR、XGBoost等
- 过滤和展示直接影响用户体验,因此在做推荐系统时一定要注意相关的过滤和展示规则。
2 80/20原则与长尾效应
2.1 80/20原则
80和20是两种不同事物的比重,因此没有合计为100的说法。前者是销量的比重,后者是产品的比重。 更糟糕的是,对于如何表达两者之间的关系,或是将哪一个变量定为常量, 我们并没有标准的惯例。你可以说一个市场呈 现出80/10的形状( 10%的产品带来80%的销量),也可以说它的形状是95/20 (20%的产品带来95%的销量)。人们用这个法则来解释截然不同的现象。80和20的经典定义是产品和收益,但这个法则同样可以应用于产品和利润的关系。
产出的原因:喜爱热门商品的用户数更多,如果不知道用户的喜好,推 荐热门商品更加保险
2.2 长尾效应
长尾效应,“头”(head)和“尾”(tail)是两个统计学名词。正态曲线中间的突起部分叫“头”;两边相对平缓的部分叫“尾”。从人们需求的角度来看,大多数的需求会集中在头部,而这部分我们可以称之为流行,而分布在尾部的需求是个性化的,零散的小量的需求。而这部分差异化的、少量的需求会在需求曲线上面形成一条长长的“尾巴”,而所谓长尾效应就在于它的数量上,将所有非流行的市场累加起来就会形成一个比流行市场还大的市场。
2.2.1 解决思路
长尾的提出是互联网发展的一项重要里程碑。通过互联网技术,可以解决传统经济学意义上的很多约束。这也就为商家们提供了更为广泛的思路。长尾是一种理念,一种指导企业自身定位以及战略和战术行为的思维方式。
-
用户分析
- 新用户:倾向于浏览热门商品
- 老用户:逐渐开始浏览冷门物品
-
新颖度
-
覆盖度
3 新算法上线流程与用户满意度收集策略
3.1 新算法上线流程
-
离线实验
- 日志生成标准数据集
- 数据集分为训练集和测试集
- 训练集上训练模型,测试集上进行预测
- 根据指标,评价预测结果
-
用户调查
- 高预测准确率不等于用户满意度
- 算法上线测试之前需要真实用户来参与测试
- 注: 要保证参与测试的用户与实际用户分布相同
-
在线AB测试
- AB测试:新算法与旧算法进行比较
- 注: 在线实验的成本更高,只有离线实验和用户调查中表现都很 好的算法才可以进行
-
新算法最终上线的条件:
- 在离线指标上优于现有算法
- 用户调查满意度不低于现有算法
- 在线AB测试结果优于现有算法
3.2 用户满意度收集策略
-
调查问卷
-
点击率
-
用户停留时间
-
转化率
-
标签反馈
4 RMSE与MAE评价准确度
4.1 RMSE和MAE
MAE和RMSE是关于连续变量的两个最普遍的度量标准。
MSE:均方误差是指参数估计值与参数真值之差平方的期望值; MSE可以评价数据的变化程度,MSE的值越小,说明预测模型描述实验数据具有更好的精确度。 MAE是一种线性分数,所有个体差异在平均值上的权重都相等
RMSE:均方误差,均方根误差是均方误差的算术平方根,表示预测值和观测值之间差异(称为残差)的样本标准偏差。 均方根误差为了说明样本的离散程度。做非线性拟合时,RMSE越小越好。
注:
- RMSE加大了预测不准评分的惩罚
4.2 准确率与召回率
准确率和召回率是广泛用于信息检索和统计学分类领域的两个度量值,用来评价结果的质量。其中精度是检索出相关文档数与检索出的文档总数的比率,衡量的是检索系统的查准率;召回率是指检索出的相关文档数和文档库中所有的相关文档数的比率,衡量的是检索系统的查全率。
准确率是我们最常见的评价指标,而且很容易理解,就是被分对的样本数除以所有的样本数,通常来说,正确率越高,分类器越好。准确率确实是一个很好很直观的评价指标,在正负样本不平衡的情况下,准确率这个评价指标有很大的缺陷。
召回率是覆盖面的度量,度量有多个正例被分为正例
注:
-
准确率:为用户推荐的,有多少是用户感兴趣的
-
召回率:用户感兴趣的,有多少被推荐了
5 信息熵与基尼系数衡量覆盖率
5.1 信息量
信息量是对信息的度量,就跟时间的度量是秒-样, 当我们考虑一个离散的随机变量的时候,当我们观察到的这个变量的-一个具体值的时候,我们接收到了多少信息呢?多少信息用信息虽来衡量,我们接受到的信息量跟具体发生的事件有关。
信息的大小跟随机事件的概率有关。越小概率的事情发生了产生的信息量越大,越大概率的事情发生了产生的信息量越小
5.1.1 信息熵
信息熵:度量一个事物中包括的信息量 ,信息量度量的是一个具体事件发生了所带来的信息,而熵则是在结果出来之前对可能产生的信息量的期望——考虑该随机变量的所有可能取值,即所有可能发生事件所带来的信息量的期望
注:
5.1.2 信息熵的性质
-
单调性,发生概率越高的事件,其携带的信息量越低;
-
非负性,信息熵可以看作为一种广度量,非负性是一种合理的必然;
-
累加性,即多随机事件同时发生存在的总不确定性的量度是可以表示为各事件不确定性的量度的和,这也是广度量的一种体现。
5.2 基尼系数
基尼是指国际上通用的、用以衡量一个国家或地区居民收入差距的常用指标。基尼系数介于0-1之间,基尼系数越大,表示不平等程度越高。基尼系数描述的是物品流行度的分布趋势,流行度就是人与物品发生交互的连接数。
是按照物品流行度p从小到大排序的物品列表中第j个物品 如果物品流行度很平均,基尼系数G就会变小。
实际的社会情况如图表示的蓝色曲线。如果蓝色曲线更接近对角线,那就说明这个社会收入更接近于平均、平等的状态。反之,如果蓝色线越靠近红色的边,则表示这个社会的收入更不公平。而在蓝色曲线和对角线之间的面积,就是人们用来衡量社会不公的状况。面积越大,社会越不公平。
基尼系数在数学上非常的简单优美,很符合人们对科学审美的追求。但是,这种数学上的优美,在解释实际社会情况的时候,是有很大问题的。根本的原因在于基尼系数反应的是一瞬间的,静态的收入分配情况,而我们的社会是连续发展的,不断变化的
推荐系统如果想要用好基尼系数,需要搜集一个原始的用户行为的基尼系数,以及推荐系统后的基尼系数。如果推荐后的基尼系数大于推荐前的,就说明推荐系统让热销更热销,而长尾更冷门…我们就需要调整推荐算法,增加商品的覆盖率,改善商品的推荐分布了。
5.3 覆盖度
覆盖度:能够推荐出来的物品种类总数占总物品种类集合的比例,描述一个推荐系统对物品长尾的发掘能力
可以通过研究物品在推荐列表中出现的次数的分布描述推荐系统挖掘长尾的能力。如果这个分布比较平,那么说明推荐系统的覆盖率比较高,而如果这个分布比较陡峭,说明这个推荐系统的覆盖率比较低。在信息论和经济学中有两个著名的指标可以用来定义覆盖率。
覆盖率为100%的推荐系统可以将每个物品都推荐给至少一个用户。一个好的推荐系统不仅需要有比较高的用户满意度,也要有较高的覆盖率。
为了更细致地描述推荐系统发掘长尾的能力,需要统计推荐列表中不同物品出现次数的分布。 如果所有的物品都出现在推荐列表中,且出现的次数差不多,那么推荐系统发掘长尾的能力就很好。因此,可以通过研究物品在推荐列表中出现次数的分布描述推荐系统挖掘长尾的能力。
如果这个分布比较平,那么说明推荐系统的覆盖率较高,而如果这个分布较陡峭,说明推荐系统的覆盖率较低。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 读取rating.csv,读取的列为:userId,movieId,rating
df_data = pd.read_csv('./data/rating.csv',sep=',',usecols=['userId','movieId','rating'])
# 打印前5行
df_data.head()
# 每个电影id对应的打分次数
movie_rating_count = df_data['movieId'].value_counts()
# 打印前5行
movie_rating_count.head()
# 深度拷贝一个movie_rating_count
movie_rating_count2 = movie_rating_count.copy()
# 重置索引,方便画图
movie_rating_count2.index = range(movie_rating_count.count())
print(movie_rating_count2.head())
# 横坐标为充值后的索引,纵坐标为打分次数
plt.plot(movie_rating_count2.index,movie_rating_count2)
plt.xlabel('Rating Count')
plt.ylabel('Movie Index')
plt.title('Movie Rating Count')
plt.show()
print(movie_rating_count.tail())
# 数据集中出现的最大的电影id
movie_id_max = movie_rating_count.index.max()
print('最大的商品id:',movie_id_max)
# 总打分数
total_rating_count = sum(movie_rating_count)
print('总打分数是:',total_rating_count)
# 参与评论的电影数量:movie_quantity = len(movie_rating_count)也可以
movie_quantity = movie_rating_count.count()
print('参与评论的电影数量:',movie_quantity)
信 息 熵 : H = − ∑ i = 1 n p ( i ) log p ( i ) 信息熵:H = -\sum_{i=1}^n p(i)\log p(i) 信息熵:H=−i=1∑np(i)logp(i)
# 计算信息熵
h = 0
for rating_count in movie_rating_count:
p = rating_count / total_rating_count
logp = np.log(p)
h += -1 * p * logp
print(h)
基 尼 系 数 : G = 1 n − 1 ∑ j = 1 n ( 2 j − n − 1 ) p ( i j ) 基尼系数:G = \frac {1} {n-1} \sum_{j=1}^n (2j-n-1)p(i_j) 基尼系数:G=n−11j=1∑n(2j−n−1)p