数据挖掘与数据化运营实战. 3.11 商品推荐模型

3.11 商品推荐模型

鉴于商品推荐模型在互联网和电子商务领域已经成为一个独立的分析应用领域,并且正在飞速发展并且得到了广泛应用。因此除本节以外,其他章节将不再对商品推荐模型做任何分析和探讨,至于本节,相对于其他的分析类型来说,会花费更多的笔墨和篇幅。希望能给读者提供足够的原理和案例。

3.11.1 商品推荐介绍

电子商务推荐系统主要通过统计和数据挖掘技术,并根据用户在电子商务网站的行为,主动为用户提供推荐服务,从而来提高网站体验的。根据不同的商业需求,电子商务推荐系统需要满足不同的推荐粒度,主要以商品推荐为主,但是还有一些其他粒度推荐。譬如Query推荐、商品类目推荐、商品标签推荐、店铺推荐等。目前,常用的商品推荐模型主要分为规则模型、协同过滤和基于内容的推荐模型。不同的推荐模型有不同的推荐算法,譬如对于规则模型,常用的算法有Apriori等;而协同过滤中则涉及K最近邻居算法、因子模型等。没有放之四海而皆准的算法,在不同的电子商务产品中,在不同的电子商务业务场景中,需要的算法也是不一样的。实际上,由于每种算法各有优缺点,因此往往需要混合多种算法,取长补短,从而提高算法的精准性。

3.11.2 关联规则

1. Apriori算法

电子商务中常用的一种数据挖掘方法就是从用户交易数据集中寻找商品之间的关联规则。关联规则中常用的一种算法是Apriori算法。该算法主要包含两个步骤:首先找出数据集中所有的频繁项集,这些项集出现的频繁性要大于或等于最小支持度;然后根据频繁项集产生强关联规则,这些规则必须满足最小支持度和最小置信度。

上面提到了最小支持度和最小置信度,事实上,在关联规则中用于度量规则质量的两个主要指标即为支持度和置信度。那么,什么是支持度和置信度呢?接下来进行讲解。

给定关联规则X=>Y,即根据X推出Y。形式化定义为:

支持度(X=>Y)=

置信度(X=>Y)=

假设D表示交易数据集;K为项集,即包含k个项的集合;Lk表示满足最小支持度的k项集;Ck表示候选k项集。Apriori算法的参考文献描述如下。

在该算法中,候选集的计算过程如下所示。

L1={满足最小支持度的1项集}

for (k=2; Lk-1 ≠; k++)

         Ck=candicate_gen( Lk-1 )//计算候选项集

         for all transactions t∈D do

                           Ct=subset(Ck,t)//候选集是否包含在t中

                        for all candicates c∈Ct do

                                          c.count++

end

         Lk={c∈Ck | c.count大于等于最小支持度}

end

合并所有的Lk,得到频繁项集

首先进行连接运算如下:

insert into Ck

select p.item1, p.item2, p.itemk-1,…, q.itemk

from Lk-1 p, Lk-1 q

where p.item1=q.item1 and … and p.itemk-2=q.itemk-2 and p.itemk-1<q.itemk-1;

然后根据频繁项集定理(即频繁项集的子集必定是频繁项集)进行剪枝,过滤掉非频繁项集,过程如下所示:

 forall itemset c∈Ck

        forall (k-1) 子集 s of c do

                   if (s∈Lk-1 ) then

         delete c from Ck

从上述算法中可以看出,该算法存在一些困难点,譬如需要频繁扫描交易数据集,这样如果面临海量数据集,就难以满足实际应用需求;对于大型数据集,计算候选集算法的效率较低,这也是一个难以克服的问题。目前已经有一些优化的方法用于处理这些问题,譬如FP-growth算法。在实际应用中,随着数据的不断增长,可能还需要通过分布式计算来提高算法性能,譬如机器学习算法包Mahout中实现了的并行版本FP-growth算法。

2. Apriori算法实例

假设给定如下电子商务网站的用户交易数据集,其中,定义最小支持度为2/9,即支持度计数为2,最小置信度为70%,现在要计算该数据集的关联规则,如表3-1所示。

表3-1 用户交易数据集

交易标识         购买商品列表

2001         I1,I2,I5

2002         I2,I4

2003         I2,I3

2004         I1,I2,I4

2005         I1,I3

2006         I2,I3

2007         I1,I3

2008         I1,I2,I3,I5

2009         I1,I2,I3

计算步骤如下所示。

步骤1,根据Apriori算法计算频繁项集。

1)计算频繁1项集。扫描交易数据集,统计每种商品出现的次数,选取大于或等于最小支持度的商品,得到了候选项集,如表3-2所示。

表3-2 频繁1项集

         商品集     包含该商品集的记录数

         I1      6

         I2      7

         I3      6

         I4      2

         I5      2

2)根据频繁1项集,计算频繁2项集。首先将频繁1项集和频繁1项集进行连接运算,得到2项集,如下所示:

商品集     商品集

 I1 I1,I2

 I2 I1,I3

 I3 I1,I4

 I4 I1,I5

 I5 I2,I3

         I2,I4

         I2,I5

         I3,I4

         I3,I5

         I4,I5

扫描用户交易数据集,计算包含每个候选2项集的记录数,如表3-3所示。

表3-3 候选2项集

         商品集     包含该商品集的记录数

         I1,I2 4

         I1,I3 4

         I1,I4 1

         I1,I5 2

         I2,I3 4

         I2,I4 2

         I2,I5 2

         I3,I4 0

         I3,I5 1

         I4,I5 0

根据最小支持度,得到频繁2项集,如表3-4所示。

表3-4 频繁2项集

         商品集     包含该商品集的记录数

         I1,I2 4

         I1,I3 4

         I1,I5 2

         I2,I3 4

         I2,I4 2

         I2,I5 2

3)根据频繁2项集,计算频繁3项集。首先将频繁2项集进行连接,得到{{I1, I2, I3}, {I1, I2, I5}, {I1, I3, I5}, {I2, I3, I4}, {I2, I3, I5}, {I2, I4, I5}},然后根据频繁项集定理进行剪枝,即频繁项集的非空子集必须是频繁的,{I1, I2, I3}的2项子集为{I1,I2},{I1,I3},{I2,I3},都在频繁2项集中,则保留;

{I1, I2, I5}的2项子集为{I1,I2},{I1,I5},{I2,I5},都在频繁2项集中,则保留;

{I1, I3, I5}的2项子集为{I1,I3},{I1,I5},{I3,I5},由于{I3,I5}不是频繁2项集,移除该候选集;

{I2, I3, I4}的2项子集为{I2,I3},{I2,I4},{I3,I4},由于{I3,I4}不是频繁2项集,移除该候选集;

{I2, I3, I5}的2项子集为{I2,I3},{I2,I5},{I3,I5},由于{I3,I5}不是频繁2项集,移除该候选集;

{I2, I4, I5}的2项子集为{I2,I4},{I2,I5},{I4,I5},由于{I4,I5}不是频繁2项集,移除该候选集。通过剪枝,得到候选集{{I1, I2, I3}, {I1, I2, I5}},扫描交易数据库,计算包含候选3项集的记录数,得到表3-5。

表3-5 频繁3项集

         商品集     包含该商品集的记录数

         I1, I2, I3   2

         I1, I2, I5   2

4)根据频繁3项集,计算频繁4项集。重复上述的思路,得到{I1,I2,I3,I5},根据频繁项集定理,它的子集{ I2,I3,I5}为非频繁项集,所以移除该候选集。从而,频繁4项集为空,至此,计算频繁项集的步骤结束。

步骤2,根据频繁项集,计算关联规则。

这里以频繁3项集{I1, I2, I5}为例,计算关联规则。{I1, I2, I5}的非空子集为{I1,I2}、{I1,I5}、{I2,I5}、{I1}、{I2}和{I5}。

规则1,{I1,I2}=>{I5}, 置信度为{I1, I2, I5}的支持度除以{I1,I2}的支持度,即2/4=50%,因其小于最小置信度,所以删除该规则。

同理,最后可以得到{I1,I5}=>{I2},{I2,I5}=>{I1}和{I5}=>{I1,I2}为3条强关联规则。

然而,在实际应用Apriori算法时,需要根据不同的粒度,譬如类目、商品等,结合不同的维度(浏览行为,购买行为等)进行考虑,从而构建符合业务需求的关联规则模型。在电子商务应用中,关联规则算法适用于交叉销售的场景。譬如,有人要出行(飞往北京),根据计算出的关联规则(如:机票=>酒店)来考虑,那么,可以根据用户购买的机票,为用户推荐合适的北京酒店;再比如,在情人节,根据关联规则,将巧克力和玫瑰花进行捆绑销售等。

另外,关联规则还可以用来开发个性化电子商务推荐系统的Top N推荐。首先,根据用户的交易数据,计算用户在特定时序内购买过的商品;然后,根据关联规则算法,计算满足最小支持度和最小置信度的商品关联规则;再根据用户已经购买的商品和商品关联规则模型,预测用户感兴趣的商品,同时过滤掉用户已经购买过的商品,对于其他的商品,则按照置信度进行排序,从而为用户产生商品推荐。

3.11.3 协同过滤算法

协同过滤是迄今为止最成功的推荐系统技术,被应用在很多成功的推荐系统中。电子商务推荐系统可根据其他用户的评论信息,采用协同过滤技术给目标用户推荐商品。协同过滤算法主要分为基于启发式和基于模型式两种。其中,基于启发式的协同过滤算法,又可以分为基于用户的协同过滤算法和基于项目的协同过滤算法。启发式协同过滤算法主要包含3个步骤:1)收集用户偏好信息;2)寻找相似的商品或者用户;3)产生推荐。

“巧妇难为无米之炊”,协同过滤的输入数据集主要是用户评论数据集或者行为数据集。这些数据集主要又分为显性数据和隐性数据两种类型。其中,显性数据主要是用户打分数据,譬如用户对商品的打分,如图3-4所示。

 

图3-4 某电商网站用户对某商品的评分结果

但是,显性数据存在一定的问题,譬如用户很少参与评论,从而造成显性打分数据较为稀疏;用户可能存在欺诈嫌疑或者仅给定了部分信息;用户一旦评分,就不会去更新用户评分分值等。

而隐性数据主要是指用户点击行为、购买行为和搜索行为等,这些数据隐性地揭示了用户对商品的喜好,如图3-5所示。

隐性数据也存在一定的问题,譬如如何识别用户是为自己购买商品,还是作为礼物赠送给朋友等。

 

图3-5 某用户最近在某电商网站的浏览商品记录(左侧的3本书)

1. 基于用户的协同过滤

基于用户(User-Based)的协同过滤算法首先要根据用户历史行为信息,寻找与新用户相似的其他用户;同时,根据这些相似用户对其他项的评价信息预测当前新用户可能喜欢的项。给定用户评分数据矩阵R,基于用户的协同过滤算法需要定义相似度函数s:U×U→R,以计算用户之间的相似度,然后根据评分数据和相似矩阵计算推荐结果。

在协同过滤中,一个重要的环节就是如何选择合适的相似度计算方法,常用的两种相似度计算方法包括皮尔逊相关系数和余弦相似度等。皮尔逊相关系数的计算公式如下所示:

 

其中,i表示项,例如商品;Iu表示用户u评价的项集;Iv表示用户v评价的项集;ru,i表示用户u对项i的评分;rv,i表示用户v对项i的评分;表示用户u的平均评分;表示用户v的平均评分。

另外,余弦相似度的计算公式如下所示:

 

另一个重要的环节就是计算用户u对未评分商品的预测分值。首先根据上一步中的相似度计算,寻找用户u的邻居集N∈U, 其中N表示邻居集,U表示用户集。然后,结合用户评分数据集,预测用户u对项i的评分,计算公式如下所示:

 

其中,s(u, u')表示用户u和用户u'的相似度。

假设有如下电子商务评分数据集,预测用户C对商品4的评分,见表3-6。

表3-6 电商网站用户评分数据集

  用户     商品1      商品2      商品3      商品4

用户A      4       ?       3       5

用户B      ?       5       4       ?

用户C      5       4       2       ?

用户D     2       4       ?       3

用户E      3       4       5       ?

表中? 表示评分未知。根据基于用户的协同过滤算法步骤,计算用户C对商品4的评分,其步骤如下所示。

(1)寻找用户C的邻居

从数据集中可以发现,只有用户A和用户D对商品4评过分,因此候选邻居只有2个,分别为用户A和用户D。用户A的平均评分为4,用户C的平均评分为3.667,用户D的平均评分为3。根据皮尔逊相关系数公式来看,用户C和用户A的相似度为:

 

同理,s(C, D) =-0.515。

(2)预测用户C对商品4的评分

根据上述评分预测公式,计算用户C对商品4的评分,如下所示:

 

依此类推,可以计算出其他未知的评分。

2. 基于项目的协同过滤

基于项目(Item-Based)的协同过滤算法是常见的另一种算法。与User-Based协同过滤算法不一样的是,Item-Based 协同过滤算法计算Item之间的相似度,从而预测用户评分。也就是说该算法可以预先计算Item之间的相似度,这样就可提高性能。Item-Based协同过滤算法是通过用户评分数据和计算的Item相似度矩阵,从而对目标Item进行预测的。

和User-Based协同过滤算法类似,需要先计算Item之间的相似度。并且,计算相似度的方法也可以采用皮尔逊关系系数或者余弦相似度,这里给出一种电子商务系统常用的相似度计算方法,即基于条件概率计算Item之间的相似度,计算公式如下所示:

 

其中,s(i, j)表示项i和j之间的相似度;freq(ij)表示i和j共同出现的频率;freq(i)表示i出现的频率;freq(j)表示j出现的频率;表示阻力因子,主要用于平衡控制流行和热门的Item,譬如电子商务中的热销商品等。

接下来,根据上述计算的Item之间的相似度矩阵,结合用户的评分,预测未知评分。预测公式如下所示:

 

其中,pu, i表示用户u对项i的预测评分;S表示和项i相似的项集;s(i, j)表示项i和j之间的相似度;ru, j表示用户u对项j的评分。

3. Item-Based协同过滤实例

在电子商务推荐系统中,商品相似度计算有着很重要的作用。它既可用于一些特定推荐场景,譬如直接根据当前的商品,为用户推荐相似度最高的Top N商品。同时,它还可以应用于个性化推荐,从而为用户推荐商品。电子商务网站收集了大量的用户日志,譬如用户点击日志等。

基于Item-Based协同过滤算法,笔者提出了一种增量式商品相似度的计算解决方案。该算法计算流程如图3-6所示。

 

图3-6 增量式商品相似度计算流程图

其中,商品关系i表示第i天的商品关系数据集。

具体计算步骤如下。

1)获取当天用户点击行为数据,过滤掉一些噪声数据,譬如商品信息缺失等。从而得到用户会话sessionID、商品ID(商品标识)、浏览时间等信息,如表3-7所示。

由于A4的浏览时间和A1、A2、A3相差较大,因此将其过滤掉,这里定义为1800秒,如表3-8所示。

表3-7 用户点击行为日志表

用户会话ID    浏览商品的时间         Item Pairs

100  A1, 20:12 A1, A2   A1, A3

         A2, 20:13 A2,A1   A2, A3

         A3, 20:15 A3,A1   A3, A2

         A4, 23:30

表3-8 过滤后的用户点击行为日志表

浏览商品的时间          Item Pairs

     A1, 20:12        A1, A2   A1, A3

     A2, 20:13        A2,A1   A2, A3

     A3, 20:15        A3,A1   A3, A2

2)首先,计算任意两种商品之间的共同点击次数。然后,根据基于条件概率的商品相似度计算方法来计算商品的相似度。商品相似度公式如下。

s(i, j)

其中,s(i, j)表示项i和j之间的相似度;freq(ij)表示i和j共同出现的频率;freq(i)表示i出现的频率;freq(j)表示j出现的频率。

3)合并前一天计算的商品相似度数据,进行投票判断,选择相似度较大的作为新的商品相似度,从而实现增量式商品相似度计算。

3.11.4 商品推荐模型总结

对于商品推荐模型,除了上述介绍的基于关联规则和基于协同过滤的算法外,还有其他一些常用的算法,譬如基于内容的算法,即根据商品标题、类目和属性等信息,计算商品之间的关系,然后结合用户行为特征,为用户提供商品推荐。商品推荐模型面临着许多重要问题,譬如特征提取问题,即如何从商品标题、类目和属性中提取商品的重要特征、新用户问题,即如何解决用户行为较少,提升推荐质量、新商品问题,即如何处理长尾商品问题,让更多的商品有推荐展现的机会、稀疏性问题,即对于庞大的用户和商品数据,用户评分数据往往会显得非常稀疏等。面对这些问题,在实际应用中,需要根据业务场景,充分利用各种算法的优点,从而设计出混合推荐算法,以便提升推荐质量。
上一篇:Oracle ROWID详解


下一篇:集群版本升级——rolling upgrade在ES 单节点从 restart 到加入集群,大概要 100s 左右的时间。也就是说,这 100s 内,该节点上的所有分片都是 unassigned 状态