前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >个性化推荐 101

个性化推荐 101

原创
作者头像
窦融
修改2017-10-13 18:17:56
5.3K2
修改2017-10-13 18:17:56
举报

导语

本文聚焦在如何做个性化推荐的流程,算法则采用常用的逻辑回归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共享内存

注意

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

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

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 导语
  • 一、What?
  • 二、Why?
  • 三、When?
  • 四、How?
    • 1、先明确地点、人物、时间、事件以及数据
      • 2、搭建特征
        • 3、选择样本及模型训练预测
          • One more thing,推荐模型出库神盾数据格式:
      • 总结
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档