初探推荐系统-02
文章目录
- 基于领域的算法
- 基于用户的协同过滤
- 基础算法
- 对比其他算法
- userCF算法的改进
- 1、性能优化
- 2、优化热门商品频繁被推荐的问题
- 基于物品的协同过滤
- 基础算法
- ItemCF 算法的改进
- 1、性能优化
- 2、优化热门商品频繁被推荐的问题
- 3、用户活跃度对物品相似度的影响
- 4、物品相似度的归一化
- UserCF和IemCF比较
- 隐语义模型
- 冷启动问题
- 用户冷启动
- 物品冷启动
- 系统冷启动
- 利用上下文信息
- 利用用户访问系统的时间
- 利用用户访问系统的地点
- 用户访问系统时的心情
基于领域的算法
基于领域的算法是推荐系统中最基本的算法,它主要分为两大类:
- 基于用户的协同过滤算法
- 基于物品的协同过滤算法
基于用户的协同过滤
基于用户的协同过滤是推荐系统中最古老的算法,不夸张的说,这个算法的诞生标志了推荐系统的诞生。该算法在1992年被提出,并应用于邮件过滤系统,1994年被GroupLens用于新闻过滤。在此之后知道2000年,该算法都是推荐系统领域最著名的算法。
基础算法
基于用户的协同过滤算法主要包括两个步骤:
- 找到和目标用户兴趣相似的用户集合
- 找到这个集合中的用户喜欢的,但是目标用户没有听说过的物品推荐给目标用户
为了找到和目标用户兴趣相似的用户集合,我们需要通过相似度算法计算各个用户之间的相似度。
假设现在有4个用户,他们的购买行为分别为:
用户标识 | 购买物品列表 |
---|---|
u1 | a、b、d、e |
u2 | a、c |
u3 | b、c、d |
u4 | a、c、d、e |
使用杰卡德相似系数来计算他们之间的相似度
J
(
A
,
B
)
=
∣
N
(
u
)
⋂
N
(
v
)
∣
∣
N
(
u
)
∪
N
(
v
)
∣
J(A, B)=\frac{|N(u) \bigcap N(v)|}{|N(u) \cup N(v)|}
J(A,B)=∣N(u)∪N(v)∣∣N(u)⋂N(v)∣
拿u2举例,u2和各个用户之间的相似度为:
J
(
u
1
,
u
2
)
=
{
a
}
{
a
、
b
、
c
、
d
、
e
}
=
1
5
=
0.2
J(u_1, u_2)=\frac{\{a\}}{\{a、b、c、d、e\}}=\frac{1}{5}=0.2
J(u1,u2)={a、b、c、d、e}{a}=51=0.2
J ( u 2 , u 3 ) = { c } { a 、 b 、 c 、 d } = 1 4 = 0.25 J(u_2, u_3)=\frac{\{c\}}{\{a、b、c、d\}}=\frac{1}{4}=0.25 J(u2,u3)={a、b、c、d}{c}=41=0.25
J ( u 2 , u 4 ) = { a 、 c } { a 、 c 、 d 、 e } = 2 4 = 0.5 J(u_2, u_4)=\frac{\{a、c\}}{\{a、c、d、e\}}=\frac{2}{4}=0.5 J(u2,u4)={a、c、d、e}{a、c}=42=0.5
知道用户之间的相似度后,我们就可以去寻找和目标用户最相似的K个用户了。但找到这K个用户后,我们这K个用户的物品可能会非常多,我们的推荐列表装不下,因此如何定义这些物品的优先级呢?
这时候就需要一个公式来衡量用户对物品可能得感兴趣程度:
p
(
u
,
i
)
=
∑
v
∈
S
(
u
,
K
)
∩
N
(
i
)
w
u
v
r
v
i
=
∑
v
∈
最相似的
K
个用户
∩
有购买过
i
的用户
w
u
v
r
v
i
p(u, i)=\sum_{v \in S(u, K) \cap N(i)} w_{u v} r_{v i}=\sum_{v \in 最相似的K个用户 \cap 有购买过i的用户} w_{u v} r_{v i}
p(u,i)=v∈S(u,K)∩N(i)∑wuvrvi=v∈最相似的K个用户∩有购买过i的用户∑wuvrvi
-
p(u,i):表示用户u对物品i的感兴趣程度
-
S(u,K):表示和用户u兴趣最相似的K个用户
-
N(i):表示对物品i有过行为的用户集合
-
w_uv:表示用户u和用户v的兴趣相似度
-
r_ui:表示用户v对物品i的兴趣 —— 因为用户的购买行为是一个单一行为,所以这里的r的取值都为1和0(买就是1,不买就是0)。
简单来说,这个公式就是针对物品i,我们在K个用户中找出对物品i有过行为的用户列表,之后累加这些用户和目标用户之间的相似度。
这里假设我们要对u2用户进行推进,选取K=2,那么和u2最相似的2个用户是u3、u4。用户u2对物品b、d、e都没有过行为。因此我们可以计算一下用户u2对这三个物品可能的感兴趣程度:
p
(
u
2
,
b
)
=
w
u
2
u
3
=
0.25
p(u_2,b) = w_{u2u3} = 0.25
p(u2,b)=wu2u3=0.25
p ( u 2 , d ) = w u 2 u 3 + w u 2 u 4 = 0.25 + 0.5 = 0.75 p(u_2,d) = w_{u2u3} + w_{u2u4} = 0.25 + 0.5 = 0.75 p(u2,d)=wu2u3+wu2u4=0.25+0.5=0.75
p ( u 2 , e ) = w u 2 u 4 = 0.5 p(u_2,e) = w_{u2u4} = 0.5 p(u2,e)=wu2u4=0.5
排序后用户u2对b、d、e的感兴趣程度分别为 d、e、b,因此如果只有一个推荐栏,那么肯定优先推荐物品d给用户u2。
在这个算法中,有个很重要的参数K,K的选取对userCF算法的性能表现有着比较大的影响。下面是MovieLens数据集中UserCF算法在不同K参数下的性能
我们可以分析一下参数K对UserCF算法的影响:
-
准确率和召回率:可以看到,准确率和召回率并不和参数K成线性相关。在上面的实验数据中,K=80的准确率和召回率是最高的。
-
流行度:可以看到,K越大,推荐物品的流行度就越大。这个也比较合理,因为K越大,说明参与的用户越多,那么推荐结果自然会趋近于全局比较热门的物品
-
覆盖率:可以看到,K越大,推荐物品的覆盖率越小。覆盖率其实和流行度指标呈负相关的关系,K越大,说明推荐的物品可能都是那些热门商品,覆盖率自然会下降
因此,K的选择也需要进行多次离线实验,最终才可以得到一个比较满意的结果。
对比其他算法
看到上面的实验数据,大家可能会觉的各个指标都好低,UserCF到底靠不靠谱。对此,我们可以对比下一些比较简单的推荐算法的对应指标。
-
Random:随机给用户推荐物品的算法
-
MostPopular:将平台最热门的K个物品推荐给用户的算法
对比3个算法我们可以看出,Random不用对比,除了覆盖率,其他指标基本碾压。对比MostPopular算法,UserCF的准确率和召回率相对MostPopular高了将近1倍,同时覆盖率也远高于MostPopular。
所以UserCF虽然准确率看上去只有20%+,但是比起什么都不做,乱推荐的效果还是好很多的。
userCF算法的改进
上面的UserCF基础算法有两个比较明显的问题:
- 算法的时间复杂度是O(U*U),U代表用户的个数。也就是随着用户个数增多,算法所需要的时间也会呈指数型增长
- 根据基础的UserCF算法,我们发现那些热门的商品会很容易被推荐出去,这并不符合我们的初衷
1、性能优化
算法的真正耗时是我们需要计算各个用户之间的相似度,当用户规模变多,计算量将会非常大。如果仔细分析用户行为数据,我们会发现,对于大多数用户来说,他们之间并没有对同样的物品产生过行为,即
杰卡德相似系数中的分子
:
∣
N
(
u
1
)
∩
N
(
u
2
)
∣
=
0
杰卡德相似系数中的分子: |N(u1) \cap N(u2) | = 0
杰卡德相似系数中的分子:∣N(u1)∩N(u2)∣=0
对于这些用户,他们相似度都是0,而大量的时间都耗在了计算他们相似度上面。
对此,我们可以先建立一个物品到用户的倒排表,记录对物品有过购买行为的用户列表。
之后遍历物品-用户倒排表。对于每个物品,将对该物品有过行为的用户两两进行标记,登记到用户共同行为矩阵中(这是一个N*N的矩阵,N表示用户的数量)。
拿上面这张图来举例,我们建立一个4*4的矩阵W,然后遍历倒排表,对于物品a,有A、B两个用户有过行为。因此我们令W[A][B]=1,W[B][A]=1,其他物品也以此类推。
在建立完矩阵W后,我们只要对矩阵W中值为1的两个用户计算相似度即可,其他的用户相似度都为0。就可以很大程度的减少计算的时间复杂度
2、优化热门商品频繁被推荐的问题
为什么在这个算法中热门商品会被频繁推荐呢。举个例子,《新华字典》很多人都会买,如果两个用户都购买了《新华字典》,并不能说明这两个人兴趣相似,这里《新华字典》就属于热门商品。
为了降低热门物品带来的影响,我们可以将调整一下用户的兴趣相似度算法:
w
u
v
=
∑
i
∈
N
(
v
)
∩
N
(
v
)
1
log
l
+
∣
N
(
i
)
∣
∣
N
(
u
)
∣
∣
N
(
v
)
∣
w_{u v}=\frac{\sum_{i \in N(v) \cap N(v)} \frac{1}{\log \mathrm{l}+|N(i)|}}{\sqrt{|N(u)||N(v)|}}
wuv=∣N(u)∣∣N(v)∣∑i∈N(v)∩N(v)logl+∣N(i)∣1
其中N(i)表示物品i被消费过的次数。可以看出,N(i)越大,分子就越小。因此,这个公式对那些热门的物品进行了惩罚,这样在计算用户之间的兴趣相似度时,可以尽量降低热门物品带来的影响
基于物品的协同过滤
基于物品的协同过滤算法是目前业界应用最多的算法,亚马逊网、Netflix、Hulu、Youtube的推荐算都是该算法。
基础算法
基于物品的协同过滤算法主要包括两个步骤:
- 计算物品之间的相似度
- 根据物品的相似度和用户的历史行为给用户生成推荐列表
和基于内容的推荐算法不同,ItemCF计算物品相似度时采用的是用户行为数据,而不是物品本身的标签/特征。
ItemCF中物品之间的相似度可以通过以下公式来定义:
w
i
j
=
∣
N
(
i
)
⋂
N
(
j
)
∣
∣
N
(
i
)
∣
w_{i j}=\frac{|N(i) \bigcap N(j)|}{|N(i)|}
wij=∣N(i)∣∣N(i)⋂N(j)∣
其中N(i)表示喜欢物品i的用户集合,分子表示同时喜欢物品i和物品j的用户数。因此,上面这个公式其实就可以理解为喜欢物品i的用户中有多少比例的用户也喜欢物品j。
计算出物品之间的相似度后,我们可以通过以下公式计算用户u对一个物品j的兴趣:
p
u
j
=
∑
i
∈
N
(
u
)
∩
S
(
j
,
K
)
w
j
i
r
u
i
p_{u j}=\sum_{i \in N(u) \cap S(j, K)} w_{j i} r_{u i}
puj=i∈N(u)∩S(j,K)∑wjirui
-
p(u,i):表示用户u对物品i的感兴趣程度
-
S(j,K):表示和物品j最相似的K个物品集合
-
N(u):表示用户喜欢的物品集合
-
w_ji:表示物品i和物品j的相似度
-
r_ui:表示用户v对物品i的兴趣 —— 因为用户的购买行为是一个单一行为,所以这里的r的取值都为1和0(买就是1,不买就是0)。
这个公式的含义是,和用户历史上感兴趣的物品越相似的物品,越有可能获得比较高的排名。
下面是MovieLens使用ItemCF在离线实验的结果:
可以看出,在K=10时,准确率和召回率是最高的。在实际场景中,K的最优取值也需要多次训练得出。
ItemCF 算法的改进
ItemCF有三个问题:
- 物品太多时,需要大量的时间计算
- 热门物品带来的影响
- 活跃用户带来的影响
1、性能优化
和UserCF一样,我们可以建立一个用户-物品的倒排表。之后创建一个N*N的矩阵C(N表示物品数量),之后遍历用户-物品倒排表,对于每个用户,将他物品列表中的物品两两在矩阵C中加1。
如上图,最终计算出矩阵C之后,我们想要计算物品a和物品d的相似度,需要计算共同喜欢物品a和物品d的用户数,就可以很容易得出来,也就是2。
2、优化热门商品频繁被推荐的问题
热门物品经常被大部分用户消费,因此在计算两个物品之间相似度时,热门物品经常会和很多物品相似。对于这个问题,我们可以将计算物品相似度的算法改成:
w
i
j
=
∣
N
(
i
)
∩
N
(
j
)
∣
∣
N
(
i
)
∣
∣
N
(
j
)
∣
w_{i j}=\frac{|N(i) \cap N(j)|}{\sqrt{|N(i)||N(j)|}}
wij=∣N(i)∣∣N(j)∣∣N(i)∩N(j)∣
和基础算法相比,它的分母做了些改变。原先是N(i),现在加入了N(j)作为惩罚性。这意味着,如果j是热门物品,那么N(j)就会很大,分母变大,整体相似度就会变小。(分母的是交集,比如a、b、c和c、d,最终得到4)
3、用户活跃度对物品相似度的影响
在ItemCF算法中,活跃的用户也会对物品相似度计算带来影响。举个例子,比如在当当网上,有个用户是开书店的,所以他买了当当网上80%的书。那么,这80%的书就两两之间产生了相似度(因为他们被同一个用户购买过)。
但是很明显,这个用户购买这些书并不是出于兴趣。所以就给我们计算物品之间相似度时带来干扰。对于这种情况,我们可以进一步再优化下物品的相似度公式,对那些活跃用户进行惩罚:
w
i
j
=
∑
u
∈
N
(
i
)
∩
N
(
j
)
1
log
1
+
∣
N
(
u
)
∣
∣
N
(
i
)
∣
∣
N
(
j
)
∣
w_{i j}=\frac{\sum_{u \in N(i) \cap N(j)} \frac{1}{\log 1+|N(u)|}}{\sqrt{|N(i)||N(j)|}}
wij=∣N(i)∣∣N(j)∣∑u∈N(i)∩N(j)log1+∣N(u)∣1
其中N(u)表示用户u消费过的物品数量,也就是用户u消费的用户数量越多,分子越小,整体相似度就会下降。
4、物品相似度的归一化
有研究发现,如果将ItemCF的相似度矩阵按最大值归一化,可以提高推荐的准确率。我们可以采用下面的公式对物品相似度进行归一化:
w
i
j
=
w
i
j
max
j
w
i
j
w_{i j}=\frac{w_{i j}}{\max _{j} w_{i j}}
wij=maxjwijwij
- w_ij:物品i和物品j的相似度
- 分子: 物品i和物品j的相似度
- 分母: 取物品j和其他物品最大的相似度作为分母
那么为什么需要进行归一化呢。
还是为了降低热门物品带来的影响。比如某视频网站,有动画片和纪录片分类,一般动画片看的人比较多,纪录片看的人比较少。因此动画片之间相似度往往会比纪录片之间的相似度高。
举个例子,假设现在有两类物品,A类物品之间的相似度都是0.6,B类物品之间的相似度都是0.5,A类物品和B类物品之间的相似度是0.2。有个用户买了一个A类物品和一个B类物品。那么通过ItemCF算法,因为A类物品之间的相似度比较高,那么推荐时,A类物品就会排在前面。
**如果做完归一化之后,A类物品之间的相似度会变成1,B类物品之间的相似度也会变成1。这样,推荐时A类物品和B类物品就能有相同的排名。**总的来说,归一化的目的还是对热门物品进行一点惩罚,提高冷门物品被推荐出去的概率。
下面是做了归一化前后的离线实验数据对比,可以看出,做了相似度归一化后,准确率和召回率有了一些提升,覆盖率有了比较大的提升。
UserCF和IemCF比较
- UserCF的推荐结果着重于反映和用户兴趣相似的小群体的热点,趋向社会化。—— 比如新闻网站中。用户的兴趣不是特别细化,很少有用户只看某一两个领域的新闻,因为这些领域不一定每天都有新闻。大多数用户都喜欢看热门的新闻。对于这种场景,我们就可以使用UserCF,去找和用户兴趣相似的用户看的新闻推荐给用户。
- ItemCF的推荐结果着重于维系用户的历史兴趣。趋向个性化。—— 比如电商平台或者电影网站中,则更适合用ItemCF。因为在这些网站中,用户的兴趣是比较固定和持久的,一个技术人员可能都是在购买技术方面的书,而且他们对书的热门程度并不是那么敏感,事实上越是资深的技术人员,他们看的书就越可能不热门。因此,ItemCF可以从他们本身的兴趣出发,给他们推荐商品。
除了应用场景外,其他方面也有着差异:
隐语义模型
隐语义模型它是近几年推荐系统领域最为热门的研究话题。
隐语义模型整体来说也很简单:
- 对于某个用户,得到他对哪一类物品感兴趣
- 从他感兴趣的分类中挑选他可能喜欢的物品
对于这两个步骤,一般有3个问题需要解决:
- 如何给物品分类?
- 如何确认用户对哪一类的物品感兴趣,以及感兴趣的程度?
- 如何确定物品在某一类中的权重是多少?
对于如何给物品分类这个问题,最古老的做法就是通过人为编辑给物品打标签,然后分类。但这种方法不仅费时费力,而且还有一些缺点:
- 编辑进行分类时往往有局限性,不能代表各类用户的观点。如比《具体数学》这本书,有些人可能认为是属于数学分类,有些人认为是属于计算机分类。因为从内容上看,这本书是讲数学的,但是读这本书的大部分都是用户。而编辑做分类时往往会因为内容是讲数学的而分类到数学里面去。
- 编辑很难控制分类的粒度。比如《数据挖掘导论》这本书,粗粒度来讲它是属于计算机技术,细粒度来说可能属于数据挖掘分类。对于不同的用户,他可能需要不同的粒度。比如对一个初学者来说,可以粗粒度的给他做推荐,但对于一个资深的研究人员来说,就需要细分到他的具体领域去给他做推荐。
- 编辑很难确定一个物品在类中的权重。比如《深入理解Java虚拟机》和《Java并发编程实战》这两本书都可以属于Java语言分类,这两本书在该类中哪个权重更大一些很难定义。
随着近几年机器学习技术的不断发展,就有研究人员提出,我们为什么不从数据本身出发,自动对物品进行分类,然后给用户做推荐呢?
于是隐语义技术就出现了,它是通过分析用户行为数据,基于机器学习中的聚类算法,自动对物品进行分类。基于算法进行分类,有以下好处:
- 因为分类是基于用户行为数据得出来的,因此分类的结果能完全代表用户的。比如如果两个物品同时被很多用户喜欢,那么即使他们在内容上相差很远,我们依旧可以将它们当成一个类
- 算法可以允许我们指定要划分出多少个分类,也就是我们可以动态控制分类的粒度。想要粗粒度,指定类的数量就少一些。想要细粒度,指定类的数量就多一些。
- 经过算法分析,我们可以知道对于一个指定用户,各个物品在类中应该占多大的权重,同时将权重大的物品推荐给该用户。
LFM主要通过以下公式来计算用户u对物品i的兴趣:
Preference
(
u
,
i
)
=
r
u
i
=
p
u
T
q
i
=
∑
k
=
1
K
p
u
,
k
q
i
,
k
\operatorname{Preference}(u, i)=r_{u i}=p_{u}^{T} q_{i}=\sum_{k=1}^{K} p_{u, k} q_{i, k}
Preference(u,i)=rui=puTqi=k=1∑Kpu,kqi,k
假设我们想将物品分为K类,那么:
p
u
,
k
:
表示用户
u
对第
k
类物品的感兴趣程度
p_{u, k}:表示用户u对第k类物品的感兴趣程度
pu,k:表示用户u对第k类物品的感兴趣程度
q i , k : 表示物品 i 在第 k 类物品中的权重 q_{i, k}:表示物品i在第k类物品中的权重 qi,k:表示物品i在第k类物品中的权重
这个可能还是有些抽象,假设现在有4个用户,对5个物品的购买行为如下(1表示购买过,0表示没买过):
i1 | i2 | i3 | i4 | i5 | |
---|---|---|---|---|---|
u1 | 1 | 0 | 1 | 0 | 0 |
u2 | 0 | 1 | 0 | 1 | 1 |
u3 | 0 | 1 | 0 | 0 | 1 |
u4 | 0 | 0 | 1 | 0 | 0 |
上面的这份数据我们可以看成一个 4 * 5 的矩阵。现在我们想将物品分成3个类别,那么通过矩阵分解,我们就可以得到下面面这两个矩阵:
这就是整个公式要表达的意思。现在r_ui是一个函数,p_u和q_i是函数的参数。我们想要用r_ui来预测用户对物品的感兴趣程度。为了保证预测的效果最好,必须和我们已知的用户真实行为数据越接近越好,也就是:
看到这里,熟悉机器学习的同学可能会想起最优解问题。是的,我们可以通过机器学习的方法来求出r_ui的最优解,首先还是先定义代价函数:
C
=
∑
(
u
,
i
)
∈
K
(
r
u
i
−
r
^
u
i
)
2
=
∑
(
u
,
i
)
∈
K
(
r
u
i
−
∑
k
=
1
K
p
u
,
k
q
i
,
k
)
2
+
λ
∥
p
u
∥
2
+
λ
∥
q
i
∥
2
C=\sum_{(u, i) \in K}\left(r_{u i}-\hat{r}_{u i}\right)^{2}=\sum_{(u, i) \in K}\left(r_{u i}-\sum_{k=1}^{K} p_{u, k} q_{i, k}\right)^{2}+\lambda\left\|p_{u}\right\|^{2}+\lambda\left\|q_{i}\right\|^{2}
C=(u,i)∈K∑(rui−r^ui)2=(u,i)∈K∑(rui−k=1∑Kpu,kqi,k)2+λ∥pu∥2+λ∥qi∥2
后面的 λ ∥ p u ∥ 2 + λ ∥ q i ∥ 2 是为了防止过拟合加入的正则项 后面的 \lambda\left\|p_{u}\right\|^{2}+\lambda\left\|q_{i}\right\|^{2} 是为了防止过拟合加入的正则项 后面的λ∥pu∥2+λ∥qi∥2是为了防止过拟合加入的正则项
要最小化上面的代价函数,我们可以是用梯度下降法来求解。上面定义的代价函数中有两组参数p_uk,q_ik,求梯度下降法时我们需要对他们分别求偏导:
∂
C
∂
p
u
k
=
−
2
q
i
k
+
2
λ
p
v
k
\frac{\partial C}{\partial p_{u k}}=-2 q_{i k}+2 \lambda p_{v k}
∂puk∂C=−2qik+2λpvk
∂
C
∂
q
i
k
=
−
2
p
u
k
+
2
λ
q
i
k
\frac{\partial C}{\partial q_{i k}}=-2 p_{u k}+2 \lambda q_{i k}
∂qik∂C=−2puk+2λqik
之后将两个参数沿着下降最快的方向推进:
p
u
k
=
p
u
k
+
α
(
q
i
k
−
λ
p
u
k
)
p_{u k} =p_{u k}+\alpha\left(q_{i k}-\lambda p_{u k}\right)
puk=puk+α(qik−λpuk)
q i k = q i k + α ( p u k − λ q i k ) q_{i k} =q_{i k}+\alpha\left(p_{u k}-\lambda q_{i k}\right) qik=qik+α(puk−λqik)
最终,我们可以得到我们想要的预测模型(也就是隐语义模型)。
在LFM算法中,重要的参数有4个:
- 隐特征的个数K (也就是想要分类的数量)
- 梯度下降学习速率 alpha
- 正则化参数lambda
- 负样本/正样本比例,ratio
前面的3个参数很好理解,第四个参数ratio该怎么理解呢。
因为LFM算法的本质还是从用户的兴趣出发,因此最好可以知道用户对哪些物品感兴趣,哪些物品不感兴趣。
- 感兴趣很好判定,只要用户购买了某物品,我们就认为他大概率对该物品感兴趣,这就是正样本
- 用户不感兴趣的物品我们定义为负样本。不感兴趣判定是比较模糊的,特别对于购物网站来说,用户没买某个物品不代表用户对该物品不感兴趣
在这种购物网站中,我们就没办法取得负样本,但是根据研究,负样本的数量对LFM的训练效果起着很大的影响。因此,我们一般在训练前会对数据进行一些处理,人为给用户增加一些负样本,一般有以下几种策略:
- 对于一个用户,只要他没产生过行为的物品,都作为负样本
- 对于一个用户,在他没有产生过行为的物品中,均匀采样中一些作为负样本
- 对于一个用户,在他没有产生过行为的物品中,均匀采样中一些作为负样本,同时保证负样本和正样本的数量相当
- 对于一个用户,在他没有产生过行为的物品中,均匀采样中一些作为负样本,但是采样时偏重那些不热门的物品
第一种策略明显是最差的,因为这样会产生大量的负样本(一般大部分物品用户都没消费过)。
剩下的3种,目前根据业界的研究,发现第三种效果是最好的,其次是第二种,然后是第四种。
后来,根据2011年KDD Cup的Yahoo!Music推荐比赛,我们发现对负样本进行采样时,应该尽量遵循以下原则:
- 对每个用户,要保证正负样本的平衡
- 对每个用户,采样他的负样本时,尽量选那些热门的,但是用户没有产生过行为的物品
当然,上面的原则并不适用于所有场景,比如有人基于Netflix MovieLens的数据集做了一个实验,发现随着ratio(负/正样本比例)提高,准确率也在提升,最终ratio=10时达到最好:
因此,实际训练模型的过程中,还是需要多调整各个参数,多次实验,才能得到更好的模型。
冷启动问题
无论什么推荐算法,它的核心都是数据。如果缺乏数据,几乎所有的推荐算法都无法正常使用。在推荐系统领域,没有数据一般称之为冷启动问题。
常见的会导致冷启动的场景有3个:
- 用户冷启动:也就是一个用户刚使用我们的网站,我们对他完全不了解,没有他的行为数据,这时该如何给他做推荐?
- 物品冷启动:当一个物品新加入时,它没有和任何用户有过交互行为,如何将它推荐给用户?
- 系统冷启动:如何在一个新开发的网站上设计个性化推荐系统,从而系统刚发布就能让用户体验到个性化推荐的效果。
用户冷启动
解决用户冷启动问题有很多种方式:
- 利用用户注册时提供的年龄、性别等数据进行粗粒度的推荐
- 利用用户的社交网络账号登陆,获取用户在社交网站上的好友信息(如果得到用户允许的话),基于好友喜欢的物品进行推荐
- 要求用户登陆时对一些物品进行反馈,收集用户对这些物品的兴趣信息,然后给用户推荐和这些物品相似的物品
总的来说,就是在用户刚加入我们网站时,尽可能的多获取到用户的相关信息。
现在很多网站和app都是这么做的,拿小红书举例:
可以看到,作为一个新用户,我们刚使用小红书时,小红花会让我们填写许多信息。基于这些信息,小红书就可以很快就给我们生成针对我们的个性化推荐内容了。
不要小看这些用户注册信息,根据研究,哪怕最基本的年龄、性别、国家,都可以带来不错的推荐效果,有推荐领域的研究人员对不同算法做了实验:
- MostPopular 给用户推荐最热门的歌手
- GenderMostPopular 给用户推荐对于和他同性别的用户塔热门的歌手,这里我们将用户分成男女两类
- AgeMostPopular 给用户推荐对于和他同一个年龄段的用户最热门的歌手,这里我们将 10岁作为一个年龄段,将用户按照不同的年龄段分类
- CountryMostPopular 给用户推荐对于和他同一个国家的用户最热门的歌手
- DemographicMostPopular 给用户推荐对于和他同性别、年龄段、国家的用户最热门的 歆手
最后得到实验结果:
可以看出,在这些特征里面,国家这个特性对推荐效果的影响最大。当然,我们能拿到越多的用户信息,就能获得越好的推荐效果。
物品冷启动
物品冷启动对算法的影响程度取决于使用了哪种算法:
- 基于内容的推荐算法:基本不影响。我们只要能挖掘到新加入的物品的特征/标签,通过内容相似,很快新物品就会被推荐给用户。
- UserCF:不是十分敏感。UserCF的原理是找相似的用户买过的物品推荐给用户,在大多数网站中,推荐列表都不单单是唯一的物品展示列表,因此新物品总会被用户看到,之后不断扩散出去。
- ItemCF:影响较大。ItemCF是推荐和用户消费过的物品相似的物品给用户,而新物品一开始和所有物品都没有联系,因此很难马上被推荐出去
- 隐语义模型:影响较大。隐语义模型也是基于用户真实行为数据进行训练的。新加入的物品缺乏相关交互数据,很难被推荐出去。
一般在推荐系统中,往往不会只采用单一的推荐算法。而是结合多种推荐算法来提高推荐效果。
系统冷启动
解决系统冷启动的方法是利用专家知识对物品进行标注。
拿网络电台Pandora举例。Pandora是一个给用户播放音乐的个性化电台应用。因为要通过内容挖掘技术自动分析音乐之间的相似度,是非常困难的,效果也很难令人满意。所以Pandora雇佣了一批动计算机的音乐人进行了一项称为音乐基因的项目。他们听了几万名歌手的歌,并对这些歌的各个维度进行标注。最终,他们使用了400多个特征(Pandora称这些特征为基因)。标注完所有的歌曲后,每首歌都可以表示为一个400维的向量,然后通过常见的向量相似度算法就可以算出这些歌曲的相似度。
利用上下文信息
上面我们介绍了几个推荐算法,但都是基于联系用户兴趣和物品。对于用户所处的上下文缺乏关注。
用户所处的上下文信息包括:
- 用户访问系统的时间
- 用户访问系统的地点
- 用户访问系统时的心情
- …
在很多时候,这些信息对于推荐效果都起着很大的作用。
利用用户访问系统的时间
在推荐系统中,时间是一个非常重要的上下文信息,对用户的兴趣起着深入而广泛的影响。它对用户兴趣的影响可能包括:
- 用户兴趣是不断变化的:这是显而易见的,比如一个人小时候喜欢看动画片,长大了可能就喜欢看动作片。一个程序员刚入行的时候看的是入门书籍,随着技术水平的提高,他会更倾向于更专业的书籍。
- 物品也是有生命周期的:这个在新闻类的网站中最为明显,一个过时的新闻相信大部分人都不会感兴趣。购物网站中也有这类现象,比如iPhone 14都出来了,还向用户推荐iphone 10、11,推荐效果肯定不会太好
- 季节效应:这个在一些随季节变化的物品上最为明显,比如衣服。如果一个购物网站夏天推荐用户外套,冬天推荐短袖,相信这个网站迟早药丸。
利用用户访问系统的地点
用户所在地点对推荐结果的影响主要体现在两个方面:
- 兴趣本地化:不同地区、国家的人们的兴趣肯定存在一定的差距。所以,根据用户所在地区去做推荐可以得到更好的效果。
- 活动本地化:一个用户往往大部分时间都在附近地区活动。有研究表明,45%的用户平常活动半径不超过10英里,75%的用户活动半径不超过50英里。因此,基于用户位置的推荐可以尽量将离用户比较近的物品推荐给用户。
用户访问系统时的心情
比如对一个音乐类的推荐网站,不同的心情明显会影响用户想听什么类型的歌。
比如豆瓣电台,你就可以选择当前的场景和心情,它会根据你的选择为你推荐适合的音乐。