WEEK17 推荐系统1

388 阅读6分钟

什么是推荐系统

• 推荐系统是一种 信息过滤 系统

• 算法可以判断用户当前感兴趣的物品或内容。你也可以将它理解为一家只为你而开的商店

• 亚马逊CEO贝索斯说:如果我们有100万用户,我们将给他们100万个亚马逊网站

Exploit&Explore问题

• 选餐厅:

• Exploitation : 去最喜欢的餐厅

• Exploration: 尝试新餐厅

• 浏览内容:

• Exploitation: 展示以往感兴趣的内容

• Exploration: 展示多样性的内容

• 在线广告:

• Exploitation: 展示最好的广告

• Exploration: 展示些不同的广告

在推荐系统中叫做 EE(exploit-explore)问题,exploit 直译就是开采,利用已知的比较确定的用户的兴趣,然后推荐与之相关的内容,explore 直译就是探索,除了推荐已知的用户感兴趣的内容,还需要不断探索用户其他兴趣,否则推荐出的结果来来回回都差不多。

实际上,推荐系统中有很多与之类似的场景和问题:

· 假设一个用户对不同类别的内容感兴趣程度不同,那么我们的推荐系统初次见到这个用户时,怎么快速地知道他对每类内容的感兴趣程度?这就是推荐系统的冷启动。

· 假设我们有若干广告库存,怎么知道该给每个用户展示哪个广告,从而获得最大的点击收益?是每次都挑效果最好那个么?那么新广告如何才有出头之日?

· 算法工程师开发了一个新模型,有没有比A/B test更快的方法知道它和旧模型相比谁更靠谱?

· 如果一直推荐已知的用户感兴趣的物品,可能会造成用户的兴趣偏好范围(视野)越来越窄,如何才能科学地冒险给他推荐一些新鲜的物品?

推荐系统的评价指标有哪些

评价指标:

NE**,Normalized Cross-Entropy**

NE = 每次展现时预测得到的log loss的平均值,除以对整个数据集的平均log loss值

p代表训练数据的平均经验CTR,即background CTR,NE对background CTR不敏感,NE数值越小预测效果越好

Calibration

预估CTR除以真实CTR,即预测的点击数与真实点击数的比值。数值越接近1,预测效果越好。

AUC

衡量排序质量的良好指标,但是无法进行校准,也就是如果我们希望得到预估准确的比值,而不是最优的排序结果,那么需要使用NE或者Calibration

e.g 模型预估值都是实际值的两倍,对于NE来说会提升,此时乘以0.5进行校准。但是对于AUC来说会保持不变

True Positive Rate

所有真实类别为1的样本中,预测类别为1的比例

False Positive

所有真实类别为0的样本中,预测类别为1的比例

ROC曲线,横轴是FPRate,纵轴是TPRate

AUC=ROC曲线下的面积

推荐系统的架构

推荐系统是一种信息过滤系统

A 数据源——

item特征,用户画像,用户行为

B 召回阶段——

粗筛,得到候选物品集

C 排序阶段——

对多个召回通道的内容进行打分排序,选出最优的少量结果。兼顾推荐系统的多维度指标:覆盖率,多样性,新颖度

GBDT+LR的原理

针对CTR预估问题,GBDT+LR算法提出的背景:

样本数量大,点击率预估模型中的训练样本可达上亿级别

学习能力有限,以往的CTR预估采用LR模型,LR是线性模型,虽然速度较快,但是学习能力有限

人工成本高,为了更好的进行特征提取,提升LR的学习能力,需要采用人工特征工程,即通过人工方式找到有区分度的特征、特征组合。对人的要求高,时间成本高

算法原理:

Practical Lessons from Predicting Clicks on Ads at Facebook,2014 (Facebook经典CTR预估论文)

quinonero.net/Publication…

具有stacking思想的二分类器模型,用来解决二分类问题

通过GBDT将特征进行组合,然后传入给线性分类器

LR对GBDT产生的输入数据进行分类(使用L1正则化防止过拟合)

Gradient Boosting原理

Gradient Boosting Decision Tree

• 回归树 Regression Decision Tree

GBDT由多棵CART回归树组成,将累加所有树的结果作为最终结果

GBDT拟合的目标是一个梯度值(连续值,实数),所以在GBDT里,都是回归树。

GBDT用来做回归预测,调整后也可以用于分类

• 梯度迭代 Gradient Boosting

Boosting,迭代,即通过迭代多棵树来共同决策

损失函数用于评价模型性能(一般为拟合程度+正则项)。最好的方法就是让损失函数沿着梯度方向下降

Gradient Boosting,每一次建立模型是在之前模型损失函数的梯度下降方向GBDT是将所有树的结果累加起来,最为最终的结果 => 每一棵树学的是之前所有树结果和的残差

e.g A的真实年龄是24岁,第一棵树预测出来18岁,残差为6 => 第二棵树将A的年龄设置为6,继续学习,第二棵树预测出来是5,残差为1 => 第三棵树将残差1作为预测目标

使用GBDT进行新特征构造

使用GBDT进行新特征构造:

当GBDT训练好做预测的时候,输出的并不是最终的二分类概率值,而是要把模型中的每棵树计算得到的预测概率值所属的叶子结点位置记为1 => 构造新的训练数据

右图有2棵决策树,一共有5个叶子节点

如果一个实例,选择了第一棵决策树的第2个叶子节点。同时,选择第2棵子树的第1个叶子节点。那么前3个叶子节点中,第2位设置为1,后2个叶子节点中,第1位设置为1。concatenate所有特征向量,得到[0,1,0,1,0]

GBDT是一堆树的组合,假设有k棵树(T1,T2...Tk),每棵树的节点数分别为 , GBDT会输出一个 维的向量

所有特征的重要度总和是1

TOP10个特征,贡献了50%的重要程度,而后面300个特征,贡献了1%的重要度。

大量弱特征的累积也很重要,不能都去掉。如果去掉部分不重要的特征,对模型的影响比较小