如何搭建个性化推荐系统?【入门篇】

1 什么是推荐系统

推荐系统是一种信息过滤系统,用于预测用户对物品的“评分”或“偏好”。推荐系统近年来非常流行,应用于各行各业。

2 推荐的主要方法

推荐系统产生推荐列表的方式通常有两种:比较复杂的基于算法的推荐如:协同过滤,逻辑回归、决策树以及比较简单的基于内容推荐。协同过滤方法根据用户历史行为(例如其购买的、选择的、评价过的物品等)结合其他用户的相似决策建立模型。这种模型可用于预测用户对哪些物品可能感兴趣(或用户对物品的感兴趣程度)。基于内容推荐利用一些列有关物品的离散特征,推荐出具有类似性质的相似物品。两种方法经常互相结合。而复杂之于简单的本质区别就在于是否个性化,也就是说你推荐给不同用户的东西是否相同?是否有强调不同用户的喜好区别来做推荐。

3 推荐的两大特征

因此,推荐主要有两大特征:

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

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

4 为什么要做个性化推荐?

做了个性化推荐,就能输出用户最可能产生行为的东西,最大程度提升KPI,如点击率、安装率、付费率等,这些指标也是评价最终推荐效果的依据。

个性化推荐

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

5 如何进行个性化推荐?

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

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

5.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去训练。

5.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之后则能引入时段权重,提升推荐效果;如果能获取到用户实时操作反馈,还通过实时优化模型提升效果,如用户点了什么类型的游戏,就能马上反馈到模型,加大这类游戏对用户的权重打分。

您可能也感兴趣:

磨刀不误砍柴工——二十个你必须知道的Sublime Text快捷键
移动web页面头部书写
程序启动
程序员的“慢”
程序员的一天(1)
组合模式
编程工作的破窗效应与童子军原则(3)
编程的初心
表现与业务逻辑分离
装饰者模式