最近由于PAC平台自动化的需求,开始探坑推荐系统。这个乍1听去乐趣无穷的课题,对算法大神们来讲是这样的:
而对刚接触这个领域的我来讲,是这样的:
在深坑外围徘徊了1周后,我整理了1些推荐系统的基本概念和1些有代表性的简单的算法,作为初探总结,也希望能抛砖引玉,给一样想入坑的火伴们提供1些思路。
1.甚么是推荐系统
如果你是个多年电商(剁手)党,你会说是这个:
如果你是名充满文艺细胞的音乐发热友,你会答这个:
如果你是位活跃在各大社交平台的点赞狂魔,你会答这个:
没错,猜你喜欢、个性歌单、热门微博,这些都是推荐系统的输出内容。从这些我们就能够总结出,推荐系统究竟是做甚么的。
目的1:帮助用户找到想要的商品(新闻/音乐/……),发掘长尾
帮用户找到想要的东西,谈何容易。商品茫茫多,乃至是我们自己,也常常点开淘宝,面对眼花缭乱的打折活动不知道要买啥。在经济学中,有1个著名理论叫长尾理论(The Long Tail)。
套用在互联网领域中,指的就是最热的那1小部份资源将得到绝大部份的关注,而剩下的很大1部份资源却鲜少有人问津。这不但造成了资源利用上的浪费,也让很多口味偏小众的用户没法找到自己感兴趣的内容。
目的2:下降信息过载
互联网时期信息量已然处于爆炸状态,若是将所有内容都放在网站首页上用户是无从浏览的,信息的利用率将会10分低下。因此我们需要推荐系统来帮助用户过滤掉低价值的信息。
目的3:提高站点的点击率/转化率
好的推荐系统能让用户更频繁地访问1个站点,并且总是能为用户找到他想要购买的商品或浏览的内容。
目的4:加深对用户的了解,为用户提供定制化服务
可以想见,每当系统成功推荐了1个用户感兴趣的内容后,我们对该用户的兴趣爱好等维度上的形象是愈来愈清晰的。当我们能够精确描绘出每一个用户的形象以后,就能够为他们定制1系列服务,让具有各种需求的用户都能在我们的平台上得到满足。
算法是甚么?我们可以把它简化为1个函数。函数接受若干个参数,输出1个返回值。
算法如上图,输入参数是用户和item的各种属性和特点,包括年龄、性别、地域、商品的种别、发布时间等等。经过推荐算法处理后,返回1个依照用户喜好度排序的item列表。
推荐算法大致可以分为以下几类[1]:
基于流行度的算法
协同过滤算法
基于内容的算法
基于模型的算法
混合算法
基于流行度的算法非常简单粗鲁,类似于各大新闻、微博热榜等,根据PV、UV、日均PV或分享率等数据来按某种热度排序来推荐给用户。
这类算法的优点是简单,适用于刚注册的新用户。缺点也很明显,它没法针对用户提供个性化的推荐。基于这类算法也可做1些优化,比如加入用户分群的流行度排序,例如把热榜上的体育内容优先推荐给体育迷,把政要热文推给酷爱谈论政治的用户。
协同过滤算法(Collaborative Filtering, CF)是很经常使用的1种算法,在很多电商网站上都有用到。CF算法包括基于用户的CF(User-based CF)和基于物品的CF(Item-based CF)。
基于用户的CF原理以下:
分析各个用户对item的评价(通过阅读记录、购买记录等);
根据用户对item的评价计算得出所有用户之间的相似度;
选出与当前用户最相似的N个用户;
将这N个用户评价最高并且当前用户又没有阅读过的item推荐给当前用户。
示意图以下:
基于物品的CF原理大同小异,只是主体在于物品:
分析各个用户对item的阅读记录。
根据阅读记录分析得出所有item之间的相似度;
对当前用户评价高的item,找出与之相似度最高的N个item;
将这N个item推荐给用户。
示意图以下:
举个栗子,基于用户的CF算法大致的计算流程以下:
首先我们根据网站的记录计算出1个用户与item的关联矩阵,以下:
图中,行是不同的用户,列是所有物品,(x, y)的值则是x用户对y物品的评分(喜好程度)。我们可以把每行视为1个用户对物品偏好的向量,然后计算每两个用户之间的向量距离,这里我们用余弦相似度来算:
然后得出用户向量之间相似度以下,其中值越接近1表示这两个用户越相似:
最后,我们要为用户1推荐物品,则找出与用户1相似度最高的N名用户(设N=2)评价的物品,去掉用户1评价过的物品,则是推荐结果。
基于物品的CF计算方式大致相同,只是关联矩阵变成了item和item之间的关系,若用户同时阅读过item1和item2,则(1,1)的值为1,最后计算出所有item之间的关联关系以下:
我们可以看到,CF算法确切简单,而且很多时候推荐也是很准确的。但是它也存在1些问题:
依赖于准确的用户评分;
在计算的进程中,那些大热的物品会有更大的概率被推荐给用户;
冷启动问题。当有1名新用户或新物品进入系统时,推荐将无从根据;
在1些item生存周期短(如新闻、广告)的系统中,由于更新速度快,大量item不会有用户评分,造成评分矩阵稀疏,不利于这些内容的推荐。
对矩阵稀疏的问题,有很多方法来改进CF算法。比如通过矩阵因子分解(如LFM),我们可以把1个nm的矩阵分解为1个nk的矩阵乘以1个k*m的矩阵,以下图:
这里的k可以是用户的特点、兴趣爱好与物品属性的1些联系,通过因子分解,可以找到用户和物品之间的1些潜伏关联,从而弥补之前矩阵中的缺失值。
CF算法看起来很好很强大,通过改进也能克服各种缺点。那末问题来了,假设我是个《指环王》的忠实读者,我买过1本《双塔奇兵》,这时候库里新进了第3部:《王者归来》,那末明显我会很感兴趣。但是基于之前的算法,不管是用户评分还是书名的检索都不太好使,因而基于内容的推荐算法呼之欲出。
举个栗子,现在系统里有1个用户和1条新闻。通过分析用户的行动和新闻的文本内容,我们提取出数个关键字,以下图:
将这些关键字作为属性,把用户和新闻分解成向量,以下图:
以后再计算向量距离,即可以得出该用户和新闻的相似度了。这类方法很简单,如果在为1名酷爱观看英超联赛的足球迷推荐新闻时,新闻里同时存在关键字体育、足球、英超,明显匹配前两个词都不如直接匹配英超来得准确,系统该如何体现出关键词的这类“重要性”呢?这时候我们即可以引入词权的概念。在大量的语料库中通过计算(比如典型的TF-IDF算法),我们可以算出新闻中每个关键词的权重,在计算相似度时引入这个权重的影响,就能够到达更精确的效果。
sim(user, item) = 文本相似度(user, item) * 词权
但是,常常接触体育新闻方面数据的同学就会要提出问题了:要是用户的兴趣是足球,而新闻的关键词是德甲、英超,依照上面的文本匹配方法明显没法将他们关联到1起。在此,我们可以援用话题聚类:
利用word2vec1类工具,可以将文本的关键词聚类,然后根据topic将文本向量化。如可以将德甲、英超、西甲聚类到“足球”的topic下,将lv、Gucci聚类到“奢侈品”topic下,再根据topic为文本内容与用户作相似度计算。
综上,基于内容的推荐算法能够很好地解决冷启动问题,并且也不会囿于热度的限制,由于它是直接基于内容匹配的,而与阅读记录无关。但是它也会存在1些弊端,比如过度专业化(over-specialisation)的问题。这类方法会1直推荐给用户内容密切关联的item,而失去了推荐内容的多样性。
基于模型的方法有很多,用到的诸如机器学习的方法也能够很深,这里只简单介绍下比较简单的方法——Logistics回归预测。我们通过分析系统中用户的行动和购买记录等数据,得到以下表:
表中的行是1种物品,x1~xn是影响用户行动的各种特点属性,如用户年龄段、性别、地域、物品的价格、种别等等,y则是用户对该物品的喜好程度,可以是购买记录、阅读、收藏等等。通过大量这类的数据,我们可以回归拟合出1个函数,计算出x1~xn对应的系数,这即是各特点属性对应的权重,权重值越大则表明该属性对用户选择商品越重要。
在拟合函数的时候我们会想到,单1的某种属性和另外一种属性可能其实不存在强关联。比如,年龄与购买护肤品这个行动其实不呈强关联,性别与购买护肤品也不强关联,但当我们把年龄与性别综合在1起斟酌时,它们便和购买行动产生了强关联。比如(我只是比如),20~30岁的女性用户更偏向于购买护肤品,这就叫交叉属性。通过反复测试和经验,我们可以调剂特点属性的组合,拟合出最准确的回归函数。最后得出的属性权重以下:
基于模型的算法由于快速、准确,适用于实时性比较高的业务如新闻、广告等,而若是需要这类算法到达更好的效果,则需要人工干预反复的进行属性的组合和挑选,也就是常说的Feature Engineering。而由于新闻的时效性,系统也需要反复更新线上的数学模型,以适应变化。
现实利用中,其实很少有直接用某种算法来做推荐的系统。在1些大的网站如Netflix,就是融会了数10种算法的推荐系统。我们可以通过给不同算法的结果加权重来综合结果,或是在不同的计算环节中应用不同的算法来混合,到达更贴合自己业务的目的。
在算法最后得出推荐结果以后,我们常常还需要对结果进行处理。比如当推荐的内容里包括敏感辞汇、触及用户隐私的内容等等,就需要系统将其筛除;若数次推荐后用户仍然对某个item毫无兴趣,我们就需要将这个item下降权重,调剂排序;另外,有时系统还要斟酌话题多样性的问题,一样要在不同话题中挑选内容。
当推荐算法完成后,怎样来评估这个算法的效果?CTR(点击率)、CVR(转化率)、停留时间等都是很直观的数据。在完成算法后,可以通过线下计算算法的RMSE(均方根误差)或线上进行ABTest来对照效果。
用户画像是最近常常被提及的1个名词,引入用户画像可以为推荐系统带来很多改进的余地,比如:
买通公司各大业务平台,通过获得其他平台的用户数据,完全解决冷启动问题;
在不同装备上同步用户数据,包括QQID、装备号、手机号等;
丰富用户的人口属性,包括年龄、职业、地域等;
更完善的用户兴趣状态,方便生成用户标签和匹配内容。
另外,公司的优势——社交平台也是1个很好利用的地方。利用用户的社交网络,可以很方便地通过用户的好友、兴趣群的成员等更快捷地找到相似用户和用户可能感兴趣的内容,提高推荐的准确度。
随着大数据和机器学习的火热,推荐系统也将愈发成熟,需要学习的地方还有很多,坑还有很深,希望有志的同学共勉~