专栏首页快乐学Python推荐系统流程

推荐系统流程

建立推荐系统前,首先要根据业务目标确定推荐系统的优化目标,而ctr只是可能被设置成的优化目标之一

推荐系统是个很大的概念,从物理视角来看,具体包括以下模块:

特征工程,重要且关键。挖掘user和item特征以及上下文特征,具体包括性别/年龄/类目这些基础属性特征;用户/物品历史数据统计特征;二阶或者高阶交叉组合特征;文本特征、图像特征高级特征;在对业务场景以及优化目标、算法有充分地理解前提下,才能挖掘出高效特征,该模块涉及技术栈较多,如etl工具/nlp/cv算法等。其输出内容为召回和排序模块提供数据,除了数据的准确性之外,特征工程pipeline的可靠性与实时性通常对推荐结果影响也较大,这个模块产出特征的质量决定了推荐系统的最终效果上限。

召回,重要且关键。从数以百万千万的item候选池中初步筛选出百量级的item,用作推荐排序,降低排序模型的打分压力。通常会通过规则策略、基于item的协同过滤、基于user的协同过滤等基于统计的传统算法,以上算法原理相对简单,可解释性强,但是如何在大数据上实现向量快速检索是个工程实现的难点。另外基于机器学习/深度学习的向量召回在业界也越来越普及,如矩阵分解、DSSM等,它们融合了用户和物品双方的特征来做召回,也取得了不错的效果。

排序,重要且关键。接收召回模块返回的item,并对其排序后的topK个item作为曝光的重要依据,许多场景排序依据是pctr(预估的点击率),根据业务场景与目标不同,也可能是cvr/ctcvr等等,这个模块决定了最终曝光给用户的item,这也是学术界和工业界研究比较活跃的一个模块,数据维度规模大且及其稀疏给建模带来了不小的挑战,排序模型从逻辑回归->因子分解机->深度学习不断进化中。另外,排序往往分为粗排和精排,粗排模型通常复杂度较低,其作用是扩大精排item候选池。

线上服务,重要非关键。该模块用于模型提供线上召回与排序打分服务,通常根据user id/item id从内存数据库拉取user和item特征,拼接后喂给训练好的模型,作出最终打分。拉取数据将并拼接成的数据与模型输入的接口对齐,正确地喂给模型,是这个模块实现的核心逻辑。这个模块的高性能、高并发、低时延是重点关注的点。影响inference性能的因素,除了线上服务的实现方式外,还与模型本身的复杂度直接相关。

实验与监控系统,重要非关键。评价一个算法/策略好坏,除了线下auc/loss等指标,更重要的是线上转化率等业务指标,通过ABtest系统,在小流量上验证线上效果,进而决定是否全量。如何保证流量均匀且正交,是这个模块的关键,业界一般实现方式为分层hash,保证召回/排序等各层实验互不影响。另外,netfelix的interleave也是一种新的思路。可靠且稳定的实验系统,为算法/策略的快速升级迭代,提供了基础保障

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 爬虫入门:网络请求分析

    摘要:看到有不少爬虫新手都是一头扎进代码里,一通乱弄,最后,跑通从大佬那里拿到的代码,嘿嘿嘿,抓到了数据结果,然后就没有然后,后面一出问题就又一脸懵逼,恢复到”...

    马哥Python
  • pyspark稠密向量(DenseVector)和稀疏向量(SparseVector)

    DenseVctor :稠密向量 其创建方式 Vector.dense(数据)

    马哥Python
  • 十分钟学会 pandas | pandas入门教程(译)

    Series 是一个值的序列,它只有一个列,以及索引。下面的例子中,就用默认的整数索引

    马哥Python
  • yii2 上传图片的示例代码

    第一步: 搭建上传类基础工作,具体请看://www.zalou.cn/article/120242.htm

    砸漏
  • 教妹学Spring:Aware、异步编程、计划任务

    你好呀,我是沉默王二,一个和黄家驹一样身高,刘德华一样颜值的程序员(不信围观朋友圈呗)。从 2 位偶像的年纪上,你就可以断定我的码龄至少在 10 年以上,但实话...

    沉默王二
  • Roslyn 节点的 Span 和 FullSpan 有什么区别 准备创建语法树访问语法树访问方法访问表达式不同

    本文告诉大家在使用 Roslyn 分析代码时,使用的 Span 和 FullSpan 有什么区别

    林德熙
  • iOS时间控件

    [图片上传中...(Simulator Screen Shot - iPhone XR - 2019-01-17 at 18.38.16.png-732bdf-...

    赵哥窟
  • C++项目中采用CLR的方式调用C#编写的dll

    1、注意事项:在编写C#DLL类库时,最好不要出现相同的命名空间,否则在C++中调用可能会出现编译错误。 2、将C#的源码生成的“dll”文件复制到C++项目中...

    指尖改变世界
  • 栈的基本实现

     此节我们在我们之前封装的动态数组的基础上(引用封装好的动态数组),实现基本的栈操作。

    wfaceboss
  • 数据库一个字段保存多标志位

    十毛

扫码关注云+社区

领取腾讯云代金券