个性化推荐 101

导语

本文聚焦在如何做个性化推荐的流程,算法则采用常用的逻辑回归LR,这里主要介绍怎么用LR这个工具来做推荐,并不涉及算法本身的研究和细节;本文主要讨论4个问题,什么是个性化推荐?为什么做?什么时候做?怎么做?希望服务于新人或感兴趣的人能快速上手,提升各自业务效果,我们运用此流程在数据中心推荐大赛中获得了最佳效果第一。

一、What?

什么是推荐?顾名思义就是把你认为他可能会喜欢的东西推荐给他,其中的方法其实有很多,如简单的基于人口统计或内容的推荐、也有复杂点的协同过滤、逻辑回归、决策树等等,而复杂之于简单的本质区别就在于是否个性化,也就是说你推荐给不同用户的东西是否相同?是否有强调不同用户的喜好区别来做推荐。

从上述个性化推荐的阐述可以得到两方面信息:

  • 1、推荐存在两个主体,用户(USER)和物品(ITEM);
  • 2、推荐是个性化的,每个用户得到推荐的物品是不同的,是极大程度上符合个人喜好的。

其实个性化推荐最常出现且大家都很熟悉的场景就是电商了,大家经常会有这样的感觉,经常看和点击甚至购买的物品及其类别,甚至相关物品和品类,总是会经常出现,这里面就是多种推荐算法打分组合后输出的结果。

二、Why?

那我们为什么要做个性化推荐呢?其实从上述介绍已经明白,只有这样做才能输出用户最可能产生行为的东西,最大程度提升KPI,如点击率、安装率、付费率等,这些指标也是评价最终推荐效果的依据。

如上图所示是游戏个性化推荐和人工运营精品推荐的效果对比,可以看出自个性化推荐上线后点击率效果差别是很大的。为什么会这样呢?因为尽管是人工精选出来的高质量游戏,但是无可避免的会带有一定的主观意见,并且如果没有正好对用户的胃口,会产生行为的可能性也是很低的。现在这种个性化的需求越来越普遍,也促成了各产品各业务对个性化的强烈需求。

三、When?

什么时候需要做个性化推荐呢?一般来说必须要有两个主体,用户和物品,如果只是单一的提升用户对某一个东西的行为效果,并不需要用到个性化推荐。

四、How?

下面重点讲下怎么做个性化推荐,上图是整个流程图,我们一步步讲。

1、先明确地点、人物、时间、事件以及数据

  • i. 在什么地方推荐?也就是推荐的场景是哪里,这里在后面会影响到你的样本和特征怎么取;
  • ii. 推荐给什么人?也就是你的受众人群,这个决定你的样本和用户画像特征怎么取?
  • iii. 在什么时间推荐?也就是用户对物品的行为一般集中在什么时间?之后引入这个特征能极大化推荐效率;
  • iv. 推什么东西?这个会影响最终物品特征的提取;
  • v. 明确能获取到些什么数据、数据结构是什么样的,这个直接影响特征搭建的质量。

2、搭建特征

第一步:首先你需要选取3大类数据指标。

  • i. 和场景相关的用户行为指标,如用户对游戏的曝光、点击、下载、点击率、下载率等;
  • ii. 和人物相关的用户画像指标,如年龄、性别、学历、是否会员、是否黄钻等等;
  • iii. 和物品相关的属性指标,如游戏类型、游戏题材等等。

然后生成4类特征,用户行为特征、用户画像特征、物品画像特征、物品属性特征。

Tips:用户行为特征包括两类,一类是单纯的行为特征,如曝光、点击、下载、点击率、载率等,另一类很重要(后续会用作特征的Cross),是用户对物品属性的行为特征,如用户对不同游戏题材的点击率;物品画像特征是指某个物品在某个用户画像下的行为占比,比如某款游戏在不同性别上的下载占比,后续会用于做特征的cross,很重要;特征的时间覆盖范围可视具体情况而定,最好能覆盖足够量级的稳定用户,且最好包括统计日近期的数据。

第二步:组合上一步中的特征,分为用户特征和物品特征,分别组合为两部分(两个表)。

Tips:最好把各特征数据UNION起来,这样如果你的特征种类比较丰富,则会引入一些目标业务外的新用户,有拉新的作用,会不断引入新鲜用户,避免后续预测出现瓶颈。

第三步:在导入LR模型进行训练之前还需要做一些特征工程的工作:

  • i. 清洗,删除或补齐一些会影响训练的脏数据,如空值、异常值等等;
  • ii. 标准化,为了消除不同特征之间由于量纲不同带来对模型拟合影响,需要对特征做标准化,不仅能加快模型拟合,还能提升效果。方法可根据情况使用如下几种:

(a) Min-Max:S(x) = (x – min(x))/(max(x) – min(x))

(b) Z-Score:S(x) = (x-avg(x))/stddev(x)

(c) Log:S(x) = ln(1+x)/(1+ln(1+x))

(d) 其他:

正向特征:S(x) = (1-exp(ln(1/3)/avg(x)*x))/ (1+exp(ln(1/3)/avg(x)*x))

负向特征:S(x) = 1-(1-exp(ln(1/3)/avg(x)*x))/ (1+exp(ln(1/3)/avg(x)*x))

  • iii. 平滑化,某些转化率特征,如点击率、留存率等,当分母很小的时候,往往会出现转化率极高的反常情况,会影响模型判断的准确性,所以需要做平滑。方法有几个:

(a)使用足够多的历史数据平滑;

(b)在分母大于某个量级才采用此转化率,否则为0或其他;

(c)在分母都加一个足够大的数据来稀释这种负面效果,如这个特征的平均值;

(d) 贝叶斯参数估计平滑。

  • iv. 离散化,即把原来的特征值分段,离散为一系列0、1向量,离散特征有几个优势:

(a)离散特征的增加和减少都很容易,易于模型的快速迭代;

(b)稀疏向量内积乘法运算速度快,计算结果方便存储,容易扩展;

(c)离散化后的特征对异常数据有很强的鲁棒性:比如一个特征是年龄>30是1,否则0;如果特征没有离散化,一个异常数据“年龄300岁”会给模型造成很大的干扰;

(d)逻辑回归属于广义线性模型,表达能力受限;单变量离散化为N个后,每个变量有单独的权重,相当于为模型引入了非线性,能够提升模型表达能力,加大拟合;

(e)离散化后可以进行特征交叉,由M+N个变量变为M*N个变量,进一步引入非线性,提升表达能力;

(f)特征离散化后,模型会更稳定,比如如果对用户年龄离散化,20-30作为一个区间,不会因为一个用户年龄长了一岁就变成一个完全不同的人。当然处于区间相邻处的样本会刚好相反,所以怎么划分区间是门学问;

Tips:用户画像特征、物品属性特征必须做离散化,用户对物品属性的行为特征和物品画像特征也必须做离散化,用于后续特征组合Cross;其他连续型特征可以看情况做,如需快速上线,可考虑省略,也可考虑直接用GBDT这样的算法来自动做特征离散化。

  • v. 特征组合 cross,上一步做离散化其中一个目的就是为了方便做 cross,cross 不仅能从数据上真正实现把用户最可能感兴趣的物品推荐给他,而且还能帮模型引入非线性,提高模型表达能力,提升效果;常用的 Cross 方法一般有内积和笛卡尔积两种,可能更具具体情况使用,笛卡尔积带来的特征膨胀会比较厉害。

Tips:以下两类 cross 必须要做,用户画像特征X 物品画像特征;用户对物品属性行为特征X 物品属性特征。用户对用户和物品对物品的 cross 可以根据具体情况考虑来做。

  • vi. 特征筛选,目的是选择模型最优特征子集。特征与特征之间多多少少会有一些相互作用,比如有些特征是包含其他特征,有些特征与另一些特征存在相关性的,也有一些特征需要与其他特征组合起来才能起作用,还有一些特征是会存在负相关的;正是因为特征之间的这些关系,合理的选择适合的特征集合对于模型效果有非常大的作用。比较可行的选择方法有以下两类:

(a) Filter,这种方法是衡量单个特征值与目标变量也就是样本label值之间的关联,常用的方法有:相关系数,卡方检验,信息增益,基尼系数;

(b)Embedded,这种方法我觉得是一个比较可行的一种方法,它的思想是使用模型自身自动的选择特征,比如正则化—L1 Lasso具有特征选择能力,决策树,每次选择分类节点时,都会选择最佳的分类特征来进行切分。

Tips:可以抽样样本数据到R中去训练,结果会输出一个特征显著性p值打分,很方便我们进行初步特征筛选,如下图;也可能在LR训练前,先尝试用RF训练一次,能得出特征对label的重要性排序,然后在根据这个排序选择比重较大的特征放到LR去训练。

3、选择样本及模型训练预测

本文主要介绍用逻辑回归模型做推荐,所以先大概介绍下什么是逻辑回归(LR):逻辑回归实际上是一种广义线性模型,y=θx,通过引入Sigmoid函数1/(1+exp(-x)),使其形式变为1/(1+exp(-θx)),结果映射在[0,1]之间,通过极大似然法和梯度下降法可求出θ参数,最后能以一种概率方式决定样本属于正类还是负类,所以LR就是一种二分类机器学习算法。

第一步:通过具体场景和人物选择好正负样本,比如游戏的曝光和点击,这里会生成如下几个数据,时间分区、用户ID、物品ID,Label(0,1),然后把上述准备好的特征通过用户ID和物品ID合成一个整体。

Tips:有可能会出现正样本相比负样本少得多的情况,这样就需要针对负样本重构,正样本全选,然后按1:(4-6)的比例去随机选取负样本子集,来作为最终样本放入模型;样本及其特征选取的时间段最好不要包含节假期等特殊时间,不然会对预测准确性造成负面影响。

第二步:模型训练,把第一步准备好的样本及特征分训练集和测试集两部分(一般6:4或7:3)放入模型进行训练。

第三步:模型评估,通过模型训练输出的结果AUC、TPR、FPR值来评估模型效果,一般AUC和TPR越大越好,FPR越小越好。 第四步:预测,通过模型训练出的特征权重,然后用之前搭建好的用户和物品特征,当得到一个用户和物品时,去拉取对应的用户和物品特征,乘以权重,就可以得到这个用户对物品喜好的打分了。

Tips:逻辑回归对线性回归做了一个1/(1+exp(-x)),所以最终得分要反过来才是真正的打分。

另外,如果能在用户特征中实时引入行为时间段,物品特征中引入时间段热门操作特征,cross之后则能引入时段权重,提升推荐效果;如果能获取到用户实时操作反馈,还通过实时优化模型提升效果,如用户点了什么类型的游戏,就能马上反馈到模型,加大这类游戏对用户的权重打分。

下图用游戏场景说明了特征搭建的逻辑,新用户由于没有用户行为,所以是没有行为方面的特征的(冷启动问题),只有画像和物品特征,所以这部分特征及其组合就十分重要了。

总结

在个性化推荐中,特征组合(Cross)是十分重要的,可以说是精髓所在,特别是用户对物品特征的Cross,因为这才对能较准确预测出用户对物品的喜欢程度提供了可能;而物品自身特征主要用于生成物品热度,在冷启动中有重要作用;用户自身特征其实在单个用户推荐中是没有作用的,但是放到整个推荐生态中,能提高不同用户推荐物品的多样性。

One more thing,推荐模型出库神盾数据格式:

1、用户特征(user_feature)

格式

uin user_feature_id1:user_featureValue1,user_feature_id2:user_featureValue2...

翻译

QQ号特征ID1:特征值1,特征ID2:特征值2....

存储

grocery(ktv类型)

注意

注意分隔符,uin后是空格或者制表符,每个用户特征之间用“,”英文逗号分隔,特征ID与特征值之间用“:”英文冒号分隔。每个用户特征只有一行。

2、特征权重(alg_base_ft_w)

格式

algorithm_idfeature_id weight

翻译

算法ID 特征ID 权重

存储

R2共享内存

注意

分隔符,用空格或者制表符分隔。每行三列。

3. item(待推荐物品)固定得分(alg_item_score)

格式

algorithm_iditem_id score

翻译

算法ID 待推荐物品ID 固定得分

存储

R2共享内存

注意

分隔符,用空格或者制表符分隔。每行三列。

4. 内积形式的cross规则文件(cross_doc) 内积形式的cross规则文件(cross_doc)

格式

cross_feature_iduser_feature_iditem_feature_id

翻译

cross规则id 用户特征id item特征id

存储

R2共享内存

注意

分隔符,用空格或者制表符分隔。每行三列。一个cross_feature_id表示的是一组cross规则。如果只有一个规则,并且这个cross_feature是由2个N维向量内积构成,则在规则文件中,有N条对应数据。

5. item特征(item_ft) item特征(item_ft)

格式

item_idfeature_idfeature_value

翻译

待推荐物品ID 特征ID 特征值

存储

R2共享内存

注意

分隔符,空格或者制表符分隔。每行三列,一个物品如有N个特,则N行。

6. 池子数据(item_pool)

格式

pool_iditem_id

翻译

池子ID 待推荐物品ID

存储

R2共享内存

注意

分隔符,空格或者制表符。每行两列。

参考文献:特征工程方法综述

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器学习之旅

提升有监督学习效果的实战解析

之前写过销售预估算法,但是被诸多大佬吐槽有监督学习部分毫无深度,其实我是想写给一些刚入门的朋友看的,这边我boss最近也想让我总结一些相对"上档次"的一点的东西...

903
来自专栏机器学习之旅

应用:交叉销售算法

最近做了一个交叉销售的项目,梳理了一些关键点,分享如下,希望对大家有所启发 核心目标:在有限资源下,尽可能的提供高转化率的用户群,辅助业务增长 初步效果:商...

341
来自专栏FSociety

通过k-means进行图像量化压缩--python实现

图像读取完我们获取到的其实是一个width*height的三维矩阵(width,height是图片的分辨率)

1214
来自专栏数据派THU

带你入门Python数据挖掘与机器学习(附代码、实例)

2245
来自专栏目标检测和深度学习

统计学入门需掌握的四点思想

虽然很多人经常接触统计,甚至读本科/硕士/博士时都学习过,但是当他们亲自处理数据时往往极易陷入懵逼状态,不知用哪种方法比较合适,不知如何选择更佳解决方案。这便使...

2769
来自专栏一棹烟波

OpenCV畸变校正原理以及损失有效像素原理分析

上一篇博客简要介绍了一下常用的张正友标定法的流程,其中获取了摄像机的内参矩阵K,和畸变系数D。 1.在普通相机cv模型中,畸变系数主要有下面几个:(k1; k2...

3119
来自专栏ATYUN订阅号

微软开发了灵活的AI系统,用于文本摘要任务,优于现有模型

对于AI来说,将段落总结成句子并不容易。这是因为它需要对文本的语义理解,这超出了大多数现有的自然语言处理模型的能力。但微软的研究人员最近证明,这并非完全不可能。

542
来自专栏专知

【干货】深度学习实验流程及PyTorch提供的解决方案

【导读】近日,专知小组博士生huaiwen创作了一系列PyTorch实战教程,致力于介绍如何用PyTorch实践你的科研想法。今天推出其创作的第一篇《深度学习实...

3365
来自专栏机器之心

学界 | 从深度学习研究论文中自动生成可执行源代码

3216
来自专栏北京马哥教育

带你入门Python数据挖掘与机器学习(附代码、实例)

转载声明:本文转载自「数据派THU」,搜索「DatapiTHU」即可关注。 作者:韦玮 来源:Python爱好者社区 本文共7800字,建议阅读10+分钟。 ...

3976

扫码关注云+社区