新闻推荐的流程:
--> 海量文章(召回,通过召回策略得到了每个用户的候选商品,简单通过相似性等,从几十万得到几百篇几十篇等,规则简单,注重快,降低文章规模)
--> 候选文章(排序,聚焦在准确,将候选物品的特征,及用户本身的属性、兴趣特征等拼接到一起)
--> 排序列表(规则)
--> 排序列表
1、为什么要特征工程
- 数据和特征决定了机器学习的上限,而模型和算法只能逼近这个上限而已。
- 模型越好,模型灵活性越强、模型越简单、模型效果越出色。
2、从召回结果到监督数据集
新闻推荐的数据没有label,不像结构化数据,所以先构造监督数据集
2.1 召回之后得到了什么?
召回列表和Embedding
通过召回能得到最终推荐结果,但是不准,利用信息有限。
2.2 如何定义排序模型的label?
根据用户的点击日志,如何召回的文章和用户训练集的文章对上了,就标记为1,反正置为0,基于这样思路确定label
2.3 数据集的划分和负采样
需要提前划分为训练集、验证集(调整超参数)和测试集,减少排序特征制作的压力。
本代码:线下数据:划分为训练集、验证集和测试集
线上数据:训练集和测试集??
线下采样数据训练,线上用全量数据
划分后基于用户的历史特征进行不用担心特征不一致的问题,
做好监督数据集之后,发现样本极度不平衡,需要对负样本下采样。
代码解释:
先划分数据集再打标签,再进行负采样
测试数据不需要负采样,但是对测试数据也打标签,便于后续的拼接。
3、如何进行特征工程
得到的推荐数据集再进行特征工程:
3.1 特征工程的一般思路
首先构造特征:以目标为导向,进行特征构造,
例如:根据用户的特征来进行构造,比如时间戳和文章字数等,可以通过数据分析来得到启发。
本项目用到如下几个方面构造特征:
3.2 基于用户的历史行为构造特征
eg,判断召回文章的最后几篇(新闻时效性)和最后一次点击文章的相似度(内容、字数、创建时间)
- 内容相似可以通过多角度连接
- word2vec embedding
通过一个单词的上下文往往可以得到某个单词的大体意思,偏向于序列关系的相似性。
两种方式实现:skip-gram和CBOW
内积运算可以表示相似性
要训练词向量??
3.3 基于用户画像
从日志数据中得到用户自身的特点(通过数据分析进行启发)
- 活跃度:点击次数越多、频率越短的用户可以看成活跃用户,配合时间维度来看
- 主题爱好:根据历史文章取出主题最多的文章
3.4 文章画像
根据article文件直接拼过去直接就是文章特征
- 文章热度:被点击次数月多、频率越高越热门
最后没用,因为只有出现在日志里出现的才可以计算热度,因此拼上去后导致很多空集
3.5 最终的数据集
结构化数据集
4、排序简述
- 机器学习模型:lgb LGBM classifier
- 排序模型:lgb LGBMRanker(比较新)
- 深度学习模型DIN
- 模型融合思路:简单加和和Stacking
4.1 LGBRanker模型
三种方法:PointWise,PairWise,ListWise
- PointWise:分类模型–概率–排序列表
- (更符合本次竞赛的目标)PairWise:排序模型–预测item的想对顺序–排序列表
4.2 LGBRanker模型 — 细节
把排序转化为二分类问题
先分解user_ID进行分组,然后进行排序模型,之后获得每项的score,再利用sigmoid计算概率
代码中进行了优化
ndcg是排序模型常用的指标,既考虑了item之间的相似程度也考虑了和用户位置的关系。
4.3 DIN模型
- ponitWise的方式
- 通过注意力机制原理
- 有时候候选文章和用户历史点击文章可能没很大关系
- 代码中用到DIN包,需要把数据调整要求形式
- 需要进行特征归一化问题,因为量纲不一样
5 、模型融合
- 简单加权
- Stacking(不太懂)
五折交叉验证