推荐系统基础(一):概述
1. 简言
如果说互联网的目标就是连接一切,那么推荐系统的作用就是建立更加有效率的连接,推荐系统可以更有效率的连接用户与内容和服务,节约了大量的时间和成本。
如果把推荐系统简单拆开来看,推荐系统主要是由数据、算法、架构三个方面组成。
- 数据提供了信息。数据储存了信息,包括用户与内容的属性,用户的行为偏好例如对新闻的点击、玩过的英雄、购买的物品等等。这些数据特征非常关键,甚至可以说它们决定了一个算法的上限。
- 算法提供了逻辑。数据通过不断的积累,存储了巨量的信息。在巨大的数据量与数据维度下,人已经无法通过人工策略进行分析干预,因此需要基于一套复杂的信息处理逻辑,基于逻辑返回推荐的内容或服务。
- 架构解放了双手。架构保证整个推荐自动化、实时性的运行。架构包含了接收用户请求,收集、处理,存储用户数据,推荐算法计算,返回推荐结果等。有了架构之后算法不再依赖于手动计算,可以进行实时化、自动化的运行。例如在淘宝推荐中,对于数据实时性的处理,就保证了用户在点击一个物品后,后续返回的推荐结果就可以立刻根据该点击而改变。一个推荐系统的实时性要求越高、访问量越大那么这个推荐系统的架构就会越复杂。
2. 知识体系
3. 补充知识
- 基尼系数
1905年,统计学家洛伦茨提出了洛伦茨曲线,如图一。将社会总人口按收入由低到高的顺序平均分为10个等级组,每个等级组均占10%的人口,再计算每个组的收入占总收入的比重。然后以人口累计百分比为横轴,以收入累计百分比为纵轴,绘出一条反映居民收入分配差距状况的曲线,即为洛伦茨曲线。
为了用指数来更好的反映社会收入分配的平等状况,1912年,意大利经济学家基尼根据洛伦茨曲线计算出一个反映收入分配平等程度的指标,称为基尼系数(G)。在上图中,基尼系数定义为:
G
=
S
A
S
A
+
A
2
G=\frac{S_{A}}{S_{A}+A_{2}}
G=SA+A2SA
当A为0时,基尼系数为0,表示收入分配绝对平等;当B为0时,基尼系数为1,表示收入分配绝对不平等。基尼系数在0~1之间,系数越大,表示越不均等,系数越小,表示越均等。
基尼系数
基尼系数描述的是物品流行度的分布趋势,流行度按照《推荐系统实践》作者项亮的解释,就是人与物品发生交互的连接数
按照基尼系数定义,存在这样的分布图:
分组计算法求解基尼系数
这种方法的思路有点类似用几何定义计算积分的方法,在X轴上寻找n个分点,将洛伦茨曲线下方的区域分成n部分,每部分用以直代曲的方法计算面积,然后加总求出面积。分点越多,就越准确,当分点达到无穷大时,则为精确计算。
梯形面积公式:
(
上
底
+
下
底
)
∗
高
/
2
(上底+下底)*高/2
(上底+下底)∗高/2
B图形面积:
B
=
∑
[
1
2
×
1
n
×
(
w
i
−
1
+
w
i
)
]
B=\sum\left[\frac{1}{2} \times \frac{1}{n} \times\left(w_{i-1}+w_{i}\right)\right]
B=∑[21×n1×(wi−1+wi)]
=
1
2
1
n
(
w
0
+
w
1
)
+
1
2
1
n
(
w
1
+
w
2
)
+
…
+
1
2
1
n
(
w
n
−
1
+
w
n
)
=\frac{1}{2} \frac{1}{n}\left(w_{0}+w_{1}\right)+\frac{1}{2} \frac{1}{n}\left(w_{1}+w_{2}\right)+\ldots+\frac{1}{2} \frac{1}{n}\left(w_{n-1}+w_{n}\right)
=21n1(w0+w1)+21n1(w1+w2)+…+21n1(wn−1+wn)
=
1
2
1
n
(
0
+
2
w
1
+
2
w
1
+
…
+
2
w
n
−
1
+
1
)
=
1
n
∑
i
=
1
n
−
1
w
i
+
1
2
1
n
\begin{array}{c} =\frac{1}{2} \frac{1}{n}\left(0+2 w_{1}+2 w_{1}+\ldots+2 w_{n-1}+1\right) \\ =\frac{1}{n} \sum_{i=1}^{n-1} w_{i}+\frac{1}{2} \frac{1}{n} \end{array}
=21n1(0+2w1+2w1+…+2wn−1+1)=n1∑i=1n−1wi+21n1
代入基尼系数计算公式
G
=
S
A
S
A
+
A
2
G=\frac{S_{A}}{S_{A}+A_{2}}
G=SA+A2SA
G
=
1
2
−
1
n
∑
i
=
1
n
−
1
w
i
−
1
2
1
n
1
2
G=\frac{\frac{1}{2}-\frac{1}{n} \sum_{i=1}^{n-1} w_{i}-\frac{1}{2} \frac{1}{n}}{\frac{1}{2}}
G=2121−n1∑i=1n−1wi−21n1
- AUC值与ROC曲线
首先,在试图弄懂AUC和ROC曲线之前,一定,一定要彻底理解混淆矩阵的定义!!!
混淆矩阵中有着Positive、Negative、True、False的概念,其意义如下:
- 称预测类别为1的为Positive(阳性),预测类别为0的为Negative(阴性)。
- 预测正确的为True(真),预测错误的为False(伪)。
混淆矩阵如下:
然后,由此引出True Positive Rate(真阳率)、False Positive(伪阳率)两个概念:
- TPRate = T P T P + F N \text {TPRate}=\frac{T P}{T P+F N} TPRate=TP+FNTP
-
FPRate
=
F
P
F
P
+
T
N
\text {FPRate}=\frac{F P}{F P+T N}
FPRate=FP+TNFP
仔细看这两个公式,发现其实TPRate就是TP除以TP所在的列,FPRate就是FP除以FP所在的列,二者意义如下: - TPRate的意义是所有真实类别为1的样本中,预测类别为1的比例。
- FPRate的意义是所有真实类别为0的样本中,预测类别为1的比例。
按照定义,AUC即ROC曲线下的面积,而ROC曲线的横轴是FPRate,纵轴是TPRate,当二者相等时,即y=x,
表示的意义是:对于不论真实类别是1还是0的样本,分类器预测为1的概率是相等的。
换句话说,分类器对于正例和负例毫无区分能力,和抛硬币没什么区别,一个抛硬币的分类器是我们能想象的最差的情况,因此一般来说我们认为AUC的最小值为0.5(当然也存在预测相反这种极端的情况,AUC小于0.5,这种情况相当于分类器总是把对的说成错的,错的认为是对的,那么只要把预测类别取反,便得到了一个AUC大于0.5的分类器)。
而我们希望分类器达到的效果是:对于真实类别为1的样本,分类器预测为1的概率(即TPRate),要大于真实类别为0而预测类别为1的概率(即FPRate),即y>x,因此大部分的ROC曲线长成下面这个样子:
最理想的情况下,既没有真实类别为1而错分为0的样本——TPRate一直为1,也没有真实类别为0而错分为1的样本——FP rate一直为0,AUC为1.
示例:
首先对于硬分类器(例如SVM,NB),预测类别为离散标签,对于8个样本的预测情况如下:
得到混淆矩阵如下:
进而算得TPRate=3/4,FPRate=2/4,得到ROC曲线:
最终得到AUC为0.625。
对于LR等预测类别为概率的分类器,依然用上述例子,假设预测结果如下:
这时,需要设置阈值来得到混淆矩阵,不同的阈值会影响得到的TPRate,FPRate,如果阈值取0.5,小于0.5的为0,否则为1,那么我们就得到了与之前一样的混淆矩阵。其他的阈值就不再啰嗦了。依次使用所有预测值作为阈值,得到一系列TPRate,FPRate,描点,求面积,即可得到AUC。
4. 思考
-
为什么使用AUC?
例如0.7的AUC,其含义可以大概理解为:给定一个正样本和一个负样本,在70%的情况下,模型对正样本的打分高于对负样本的打分。可以看出这个解释下,我们关心的只有正负样本之间的分数高低,而具体的分支则无关紧要
【多高的AUC才算高】:参考文章 https://zhuanlan.zhihu.com/p/24217322 -
如何使用Embedding做召回?
参考腾讯的推荐系统 embedding 技术实践总结