当前位置: 首页 > 编程日记 > 正文

一个推荐系统,实现完整的设计-在百度搜索关键词推荐案例

在之前一篇博文中, 有同学在评论中问了个问题: 怎样解决因式分解带来的推荐冷门。热门关键词的问题。 在回答这个问题的时候, 想到了近几年在做搜索推荐系统的过程中, 学术界和工业界的一些差别。 正好近期正在做技术规划, 于是写偏文章说下工业界完整推荐系统的设计。结论是: 没有某种算法可以全然解决这个问题, 多重算法+交互设计, 才干解决特定场景的需求。

下文也对之前的一些博文进行梳理。构成一个完整工业界推荐系统所具有的方方面面(主要以百度关键词搜索推荐系统为例)

完整的推荐系统肯定不会仅仅用一种推荐算法

在学术界。 一般说到推荐引擎, 我们都是环绕着某一种单独的算法的效果优化进行的, 比如按内容推荐, 协同过滤(包含item-based, user-based, SVD分解等),上下文推荐。Constraint-based推荐。图关系挖掘等。

非常多比較牛的单个算法。 就能在某个指标上取得较好效果。 比如MAE。RMSE。。。只是有自己的长处。 每种算法也有自己的缺点。 比如按内容推荐主要推荐和用户历史结果相似的item,一般的item-basedeasy推荐热门item(被很多其它人投票过)。。。。   所以在工业界。比如各互联网公司, 都会使用多种算法进行互相配合, 取长补短, 配合产品提升效果。

并且在完整的推荐系统中,不仅有传统的Rating推荐。 还须要辅以许多的挖掘, Ranking来达到预期效果

推荐系统3大件:User Profile、基础挖掘推荐、Ranking

在实践中, 一个完整的推荐系统会主要由3部分组成:

  1. User Profile
  2. 基础推荐挖掘算法
  3. Ranking

此处之所以将Ranking单独列出来,是由于其在推荐任务中过于重要。直接决定了推荐的效果。

下面为整个推荐的数据流: CPR策略架构

User Profile

A user profile is a representation of information about an individual user that is essential for the (intelligent) application we are considering user profile主要是用户(注冊)信息,以及对用户反馈的信息进行处理,聚合,用于描写叙述用户的特征。 是兴许推荐和排序的基石。 普通情况下。user profile会包括下面详细内容:

  1. 用户兴趣数据
  2. 用户的基础注冊信息,背景信息:比如用户出生地,年龄,性别,星座,职业等。这些信息一般从用户注冊信息中获取。比如高德,百度地图注冊用户,淘宝注冊用户等
  3. 用户行为反馈:包含显示的反馈(explicit)和隐藏(implicit)的反馈,显示的反馈包含用户的评分,点赞等操作。百度关键词搜索推荐工具上的点赞(正向显示反馈)和垃圾桶(负向显示反馈),淘宝上的评分;隐式反馈包含用户的浏览行为,比如在百度关键词搜索推荐上搜过那些词,淘宝上点击了那些页面,在高德上点击了那些POI等
  4. 用户交互偏好比如用户喜欢使用哪些入口,喜欢哪些操作,以及从这些操作中分析出来的偏好,比方在高德地图上依据用户行为反馈分析出来的用户对美食的偏好:更喜欢火锅,粤菜,还是快餐
  5. 用户上下文信息:这些信息有些是分析出来的,比如在LBS中分析出来的用户的家在哪儿,公司在哪儿,常常活动的商圈,常常使用的路线等

user profile常常是一份维护好的数据。在使用的时候,会直接使用该数据,或是将该数据存储在KV系统中。供Online系统实时使用。 在搜索或是推荐的场景下,每次请求一般仅仅会涉及到一次user profile的KV请求,所以online使用的时候。基本的实现困难是存储。以及高速KV的高速响应。

基础挖掘推荐算法

基础挖掘推荐算法, 主要使用传统推荐算法, 结合分析的item profile和user profile, 建立user和item的关系,此时并不会过多考虑其它因素。比如是否冷门/热门,最基本的就是建立user和item的关系。 在各种论文中狭义的推荐。主要就是指该部分内容。 主要环绕着Rating,以及Top N进行该处的Top N(更像是直接Rating值最高的Top N) 传统的推荐算法研究主要围着这块工作进行。如今已经有非常多比較成熟的算法。这些算法相关的研究可參见博文:《推荐系统经典论文文献及资料》;当中也能找到业界较多成功推荐系统的实践分享 主要包括下面几类:

  1. Content Based推荐: 按内容推荐,基本的工作是user profile, item profile的提取和维护,然后研究各种相似度度量方法(详细相似度度量參见博文:《推荐系统中的相似度度量》)
  2. 协同过滤:相当于应用了用户的行为进行推荐(差别于Content based算法)。比較经典的算法包含传统的item-based/user-based算法(參见博文:《协同过滤中item-based与user-based选择依据》,《collaborative-filtering依据近邻推荐时须要考虑的3要素》)。SVD,SVD++(详细原理及源代码參见博文:《SVD因式分解实现协同过滤-及源代码实现》)
  3. 上下文相关推荐:和传统推荐相比, 考虑很多其它上下文因素。LBS。 移动场景下使用比較多(详细參见博文:《context-aware-recommendation》)
  4. 基于图的关系挖掘推荐:主要是利用图论原理,依据item,user之间的数据,反馈关联关系。挖掘更深层次的关系进行推荐。该类方法一般效果都不错,当然资源要求也较高。

    详细參见博文:《级联二步图关系挖掘关键词推荐系统》,《频繁二项集合的hadoop实现》《itemrankrandom-walk-based-scoring-algorithm-for-recommener-system》

  5. Constrainted-based推荐:依据限制性条件进行演绎推荐

在实际应用时。我们常常使用按内容推荐,item-based寻找从感知的角度比較靠谱的结果。使用SVD,SVD++。图关系寻找更深层次的联系结果。

同一时候在推荐时,会结合非常多因素来进行综合排序,比如关键词, 或是LBS中POI的热度等。详细可參见下文ranking部分。

算法效果衡量

以上这些算法。 我们在离线的时候。使用Cross-Validation方式,就能够分析出其效果。并且离线分析的时候,代价比較小,比較easy操作。当然,对于不同的问题会使用相应的指标进行衡量。 对于预測Rating准确性主要是用RMSE,或是MAE;详细可參见博文:《关键词搜索推荐系统中的推荐准确性度量》 假设是排序。 则很多其它使用NDCG,MAP,  MRR等指标。详细可參见博文:《使用ndcg评估关键词推荐系统的相关性》 在详细应用场景中。对于特定推荐问题,会涉及到选用哪种算法的问题。推荐不像CTR预估这种问题,目标比較单一,常常我们须要考虑多个指标,并且这些指标可能此消彼长。须要做权衡。比如须要考虑算法的准确性(accuracy),同一时候也须要考虑算法的覆盖(coverage)。置信度(confidence),新奇度(novelty)和惊喜度(Serendipity)。同一时候还须要考虑推荐为系统带来的收益和效用(utility)。 这些指标常常须要权衡,并且常常提升某一个的时候会导致其他下降,所以有时候存在一定的主观性:我们究竟看中哪一个指标?  并且这个问题可能随着系统,平台所处的阶段而不同。 比如在建立口碑的时候,我们可能不太关注coverage,而更关注accuracy,由于要让用户建立一种:该系统非常准的认知;假设在系统已经比較成熟了,此时可能须要考虑novelty, serendipity的同一时候,还须要考虑utility:该推荐能为系统带来什么收益。比如对百度的变现有多大收益? 对淘宝的销售有多少收益等 详细这些指标的选择可參见博文:《选择推荐算法时须要考虑得因素》

Ranking,此部分是成熟的搜索,推荐系统具有的核心逻辑

比較简单的实现方法, 是直接对各种特征拍阈值进行线性加权,比較成熟的系统通常会使用机器学习的方式和综合个维特征, 学习出模型后进行排序, 比如使用Learning to rank技术。 该部分须要考虑的因素较多较为复杂。 和传统的推荐相比, 此处单独将Ranking拿出来。 基础推荐挖掘, 和传统的推荐部分比較类似,主要结合user profile, 挖掘哪些item适合推给哪些user。

但仅依据这些挖掘就直接进行推荐是不够的。 真实online推荐场景中, 须要考虑很多其它其它因素。 比如:相关性,推荐的上下文,CTR预估,以及商业业务规则。

  1. 相关性: item与用户的相关性,这是大多数搜索和推荐任务的基石。比如在搜索中判定一个query和一个document的相关性,或是一个query 和 还有一个query的相关性,或是在特征比較多的情况下。 一个user 和一个item 记录的相关性;实现方式能够非常easy,比如传统的相似度度量方式(參见博文:《推荐系统中的相似度度量》),对于文本,业界使用简单的TF*IDF,或是BM25。 只是非常多时候我们须要添加很多其它维度特征,包含推荐item本身的重要性,比如IDF,Pagerank(详细參见博文:《pagerank的经济学效用解释》)。同一时候使用模型来提升相关性推断的准确性。

    使用模型的方式会更加复杂,但效果提升也非常明显。详细可參见博文:《集成树类模型及其在搜索推荐系统中的应用》。《分类模型在关键词推荐系统中的应用》,《adaboost》

  2. 推荐的上下文:比如推荐产品的入口。交互方式。 不同的入口,甚至同一入口的不同交互方式。 推荐的结果有可能都须要不一样; 在LBS生活服务中, 请求发生的时间, 地点也是推荐须要重点考虑的上下文因素。比如饭点对餐饮item的提权。 异地情况下对酒店等结果的加权等
  3. CTR预估:成熟的商业系统都会使用模型来完毕CTR预估,或是转化预估
  4. 以及商业业务规则:比如黑白名单,或者强制调权。

    比如在百度关键词搜索推荐中。某些有比較高变现潜力的词。 就应该加权往前排; 比方在高德LBS服务中,有些海底捞的店点评评分较低。 但我们也应该往前排;或是在搜索引擎中。搜国家领导人的名字。 有些最相关的结果可能由于法律因素是须要屏蔽的

算法评估

非常直接,离线调研的时候看就看算法的评估指标,參见博文:《关键词搜索推荐系统中的推荐准确性度量》。《使用ndcg评估关键词推荐系统的相关性》 上线的时候,进行圈用户(圈定某两个user集合作为实验/对比用户组)实验, 或者圈请求实验(比如随机圈定5%流量进行实验),之后依据系统效果监控中的指标值推断实验效果。

下面为一个典型的效果监控截图: 实验假设证明成功,达到预期效果。一般之后推广到全流量;反之,假设实验未达到预期效果,则须要分析什么地方有问题。怎样改进,之后继续调整算法继续实验。

当实验较多时。还会涉及较多project问题,比如分层实验框架等。

系统效果监控

对于整个系统,须要建立晚上的效果监控平台进行效果的实时监控,以便发现用户的行为模型,系统的不足,分析兴许的发力点等。

一般这种监控平台会使用Dashboard来完毕,主要的框架是前段UI + 后端数据库。非常多时候,离线统计策略在hadoop上处理统计日志计算指标,并将计算出来的指标存入数据库。前端UI訪问数据库。拉出指定时间段内某些指标的值,并进行简单分析。 详细的监控指标,及指标体系的建立。可參见博文:《搜索引擎变现策略指标体系》

交互设计

完整的产品包含便捷的交互和背后牛叉的算法。非常多时候,要提升推荐的效果,须要算法和交互配合,才干达到理想的效果: 交互须要有健壮的算法产出结果;而算法也须要有配套的交互,才干达到预期效果。否则再牛叉的算法,对结果的影响也可能没那么明显。

一些交互的样例參见博文:

《关键词推荐工具中的用户引导机制之中的一个:总述》

《关键词推荐工具中的用户引导机制之二:suggestion架构》

《关键词推荐工具中的用户引导机制之三:相关搜索query技术》

《关键词推荐工具中的用户引导机制之四:种子query推荐》

说了那么多,中心就是想说明, 一个完整的推荐系统。远远不止是一两个rating算法可以覆盖的。并且此处还未涉及project部分。

很多其它内容,也可以直接访问: http://semocean.com


版权声明:本文博主原创文章。博客,未经同意不得转载。

转载于:https://www.cnblogs.com/bhlsheji/p/4834765.html

相关文章:

如何充分利用JavaScript(ES6)中的解构功能

by Joanna Gaudyn乔安娜高登(Joanna Gaudyn) Destructuring was a new addition to ES6. It took inspiration from languages like Python and allows you to extract data from arrays and objects into distinct variables. It might sound like something you’ve done in…

React 开发环境搭建

先来一个 React 官方文档的链接 点击跳转 搭建 React 的前期准备:你的本地环境需要安装 cnpm、node。 注:代码块中的 $ 代表: $后面是在命令行输入的命令,举例 $ npm start 解:实际上是应该打开命令行输入 npm st…

c++中的友元重载

1 语法 返回值类型 operator 运算符名称(形参列表) { 重载实体 } --------->operator和运算符名称在一起构造成新的函数名 2 案例 1 #include <iostream>2 3 using namespace std;4 5 class Complex6 {7 public:8 9 Complex(float x0,float y0) 10 :_…

WPF解析TTF 字体

偶遇需要自己解析 TTF 字体并显示&#xff0c;此做。。。 using System; using System.Collections.Generic; using System.Drawing.Text; using System.IO; using System.Linq; using System.Runtime.Serialization; using System.Text; using System.Windows; using System.W…

redux logic_Redux-Logic简介

redux logicby Sam Ollason通过萨姆奥拉森(Sam Ollason) Redux-Logic简介 (An Introduction to Redux-Logic) This article will go through a high-level overview of Redux-Logic. We will look at what is it, why it is needed, how it differs from other Redux middlewa…

[SDOI2009]HH的项链

题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链。HH 相信不同的贝壳会带来好运&#xff0c;所以每次散步完后&#xff0c;他都会随意取出一段贝壳&#xff0c;思考它们所表达的含义。HH 不断地收集新的贝壳&#xff0c;因此&#xff0c;他的项链变得越来越长。有一…

DvaJS 入门, 快速上手Dva

为什么要使用Dva? React 没有解决的问题 React 本身只是一个 DOM 的抽象层&#xff0c;使用组件构建虚拟 DOM。 如果开发大应用&#xff0c;还需要解决一个问题。 通信&#xff1a;组件之间如何通信&#xff1f;数据流&#xff1a;数据如何和视图串联起来&#xff1f;路由…

Static、DynamicResource学习笔记一

定义了资源后&#xff0c;我们可以在元素中直接使用该资源&#xff0c;但又分为StaticResource及DynamicResource两种方式。 StaticResource 静态资源在首次创建窗口时一次性的设置完毕&#xff0c;之后源资源对象本身发生的任何变化都会影响到使用该资源的元素&#xff0c;如果…

javascript迭代器_JavaScript迭代器概述

javascript迭代器by Joanna Gaudyn乔安娜高登(Joanna Gaudyn) JavaScript迭代器概述 (An overview of JavaScript iterators) for&#xff0c;for…in和for…of循环之间的区别 (The difference between for, for…in and for…of loops) Iteration might be one of the most c…

knockout学习笔记目录

关于knockout学习系列的文章已经写完&#xff0c;这里主要是做个总结&#xff0c;并且将目录罗列出来&#xff0c;方便查看。欢迎各位大神拍砖和讨论。 总结 kncokout是一个轻量级的UI类库&#xff0c;通过MVVM模式使前端的UI简单话&#xff0c;减少javascript代码的编写。通常…

ant Design Pro 登录状态管理

未登录自动跳转到登录页面&#xff0c;登录成功不跳转回登录页面的实现代码调用流程。 ant Design Pro 是一个企业中后台管理框架&#xff0c;开始做他&#xff0c;第一个肯定是要做登录&#xff0c;下面来看一下它是怎么登录的。 先看路由配置 Authorized.jsx代码&#xff1…

初级java开发学习路线_成为初级全栈Web开发人员的10分钟路线图

初级java开发学习路线So you have started your journey into the world of web development. But what do you learn first? The Internet is overloaded with a wealth of information about the millions of different technologies that a web developer can know.因此&am…

国外物联网平台初探(四):Ayla Networks

定位 Ayla企业软件解决方案为全球部署互联产品提供强大的工具 功能 Ayla的IoT平台包含3个主要组成部分&#xff1a; (1) Ayla嵌入式代理Ayla Embedded Agents (2) Ayla云服务Ayla Cloud Services (3) Ayla应用库Ayla Application Libraries 设备 开发者使用任何微控制器、操作系…

《英语语法新思维初级教程》学习笔记(一)名词短语

参考资料&#xff1a; 1. 《英语语法新思维初级教程》 ▶ 知识点 ▼ 英语是“固定词序语言&#xff08;a fixed-word-order language&#xff09;”。 ▼ 语言的构造级别分五个层次&#xff1a;1. 词&#xff08;word&#xff09;&#xff1b;2. 短语&#xff08;phase&#xf…

根据数组中对象的属性值排序倒叙

数组中对象的属性值排序倒叙demo function compare(e) {return function (a, b) {var value1 a[e];var value2 b[e];return parseInt(value1) - parseInt(value2);} } var arr[{a:2},{a:3},{a:1}];var arr2 arr.sort(compare(time)).reverse();console.log(arr2) //[{a:3}…

!! javascript_产量! 产量! 生成器如何在JavaScript中工作。

!! javascriptby Ashay Mandwarya ?️??由Ashay Mandwarya提供吗&#xff1f; 产量&#xff01; 产量&#xff01; 生成器如何在JavaScript中工作。 (Yield! Yield! How Generators work in JavaScript.) If the title doesn’t already give a hint, we will be discussin…

ACM 竞赛高校联盟 练习赛 第二场 BC

B. 题解&#xff1a; 枚举约数即可&#xff0c;判断n个数能否填约数的整数倍 #include <iostream> #include <cstring> #include <cstdio> using namespace std; typedef long long LL; int main(){LL T, n, m;cin>>T;while(T--){cin>>n>>…

在一个数组中查找两个重复出现的数字

题目如下&#xff1a;现有一个数组长度为n1&#xff0c;里面存放有1到n-2&#xff0c;顺序不定&#xff0c;其中有两个数字出现了两次&#xff0c;现在要找出那两个数字。 例子A{2, 3, 1, 4, 5, 2, 4}&#xff0c; 这个数组长度为7&#xff0c;存放了1到5&#xff0c;但2和4出现…

React 组件生命周期

组件的生命周期可分成三个状态&#xff1a; Mounting&#xff1a;已插入真实 DOMUpdating&#xff1a;正在被重新渲染Unmounting&#xff1a;已移出真实 DOM 生命周期的方法有&#xff1a; componentWillMount 在渲染前调用,在客户端也在服务端。 componentDidMount : 在第一…

银行软件开发实习生_如何找到学生的软件开发人员实习生

银行软件开发实习生by Grazietta Hof由Grazietta Hof 如何找到学生的软件开发人员实习生 (How to find a Software Developer Internship as a student) Side note: Although this article is directed at students (because I am one so I can easily relate), I’m sure a l…

MAC OS X El CAPITAN 搭建SPRING MVC (1)- 目录、包名、创建web.xml

一、 下载STS&#xff08;Spring Tool Suite&#xff09; 官方地址&#xff1a;http://spring.io/tools/sts 下载spring tool suite for mac 最新版本。这个IDE是很不错的&#xff0c;其中spring插件已经配置好了。下载解压缩&#xff08;一定要英文目录下&#xff09;&#xf…

iOS小知识点记录

1>UITextField实现leftView: self.inputTextField [[UITextField alloc]initWithFrame:CGRectMake(10, 10, 200, 25)];self.inputTextField.delegate self;self.inputTextField.font [UIFont systemFontOfSize:15];self.inputTextField.placeholder " 想说点什么?…

Ant Design Pro 网络请求,视图绑定model并且渲染到页面 umi-request

封装网络请求,在service中新建接口,在model调用service,在视图绑定model并且得到网络请求的回调函数,获取网络请求的数据渲染到页面。 网络请求数据走向; 1.在utils/request.js 封装网络请求; /*** request 网络请求工具* 更详细的 api 文档: https://github.com/umijs…

2019机器学习比赛_2019顶尖的机器学习课程

2019机器学习比赛With strong roots in statistics, Machine Learning is becoming one of the most interesting and fast-paced computer science fields to work in. There’s an endless supply of industries and applications machine learning can be applied to to mak…

HTML5 canvas画图

HTML5 canvas画图 HTML5 <canvas> 标签用于绘制图像&#xff08;通过脚本&#xff0c;通常是 JavaScript&#xff09;。不过&#xff0c;<canvas> 元素本身并没有绘制能力&#xff08;它仅仅是图形的容器&#xff09; - 您必须使用脚本来完成实际的绘图任务。getCo…

排序算法7---快速排序算法

原理&#xff1a; 通过一趟排序将待排记录分割成独立的两部分&#xff0c;其中一部分记录的关键字均比另一部分记录的关键字小&#xff0c;则可分别对这两部分记录继续进行排序&#xff0c;以达到整个序列有序的目的。 #include <stdio.h> #define MAXSIZE 9typedef stru…

dispatch callback ant design pro 网络请求回调函数

index.jsx 代码解析:在组件初次渲染时调用 model 中 命名空间为 a_models 的 getData 网络请求,传了一个patload 参数和 callback 回调函数过去,然后通过 this.setState ()更新视图的 state。 import { Form, Tabs,Affix, Button,Input,Table } from antd; import Re…

bigquery使用教程_如何使用Python和Google BigQuery构建机器人以自动执行您的笨拙任务...

bigquery使用教程Do you have repetitive tasks? Something that you do regularly, every week or even every day? Reporting might be one of your weekly or daily tasks. You query or ask for the data, and do some visualizations, then give it to your boss. What …

5S后返回首页

1 <!DOCTYPE html>2 <html>3 <head>4 <title>5S后返回首页</title> 5 <meta http-equiv"Content-Type" content"text/html; charsetgkb"/> 6 </head>7 <body>8 <h2>操作成功</h2>…

TypeScript 1

TypeScript 的由来 TypeScript 是 JavaScript 的一个超集&#xff0c;支持 ECMAScript 6 标准。 TypeScript 由微软开发的自由和开源的编程语言。 TypeScript 设计目标是开发大型应用&#xff0c;它可以编译成纯 JavaScript&#xff0c;编译出来的 JavaScript 可以运行在任何…