赛题理解
理解赛题
- 已知: 用户历史浏览点击新闻文章的数据信息
- 预测: 用户未来的点击行为
- 赛题初衷: 了解推荐系统的业务背景
理解数据
- 来源: 某新闻APP平台的用户交互数据
- 数量: 30万用户,近300万次点击,共36万多篇不同的新闻文章,同时每篇新闻文章有对应的embedding向量表示。
- 训练集: 20万用户的点击日志数据
测试集A: 5万用户的点击日志数据
测试集B: 5万用户的点击日志数据
具体数据表和参数可以参考赛题说明。
理解评估指标
- 提交文件格式: 针对每个用户, 我们都会给出五篇文章的推荐结果,按照点击概率从前往后排序。
- 评估指标公式:
s c o r e ( u s e r ) = ∑ k = 1 5 s ( u s e r , k ) k score(user) = \sum_{k=1}^5 \frac{s(user, k)}{k} score(user)=k=1∑5ks(user,k)
如果预测命中第 k 篇文章, 则 s ( u s e r , k ) = 1 s(user, k)=1 s(user,k)=1 - 评估指标原理: 命中的结果尽量靠前, 而此时分数正好比较高。
赛题分析
难点
- 目标上: 预测最后一次点击的新闻文章,并不是常见的预测一个数或者预测数据类别。
- 数据上: 拿到的是(基于真实的业务场景的)用户的点击日志,并不是常见的特征+标签的数据。
关键点
把该预测问题转成一个监督学习的问题(特征+标签),然后才能进行ML,DL等建模预测。
- 如何转成一个监督学习问题?
- 转成一个什么样的监督学习问题?
- 我们能利用的特征又有哪些?
- 又有哪些模型可以尝试?
- 此次面对数万级别的文章推荐,我们又有哪些策略来缩减问题的规模?
其他需要考虑的问题
- 哪里可以挖掘特征
- 线下验证方式
- 防止过拟合
由于我们是预测用户最后一次点击的新闻文章,从36万篇文章中预测某一篇的话我们首先可能会想到这可能是一个多分类的问题(36万类里面选1), 但是如此庞大的分类问题, 我们做起来可能比较困难, 那么能不能转化一下? 既然是要预测最后一次点击的文章, 那么如果我们能预测出某个用户最后一次对于某一篇文章会进行点击的概率, 是不是就间接性的解决了这个问题呢?概率最大的那篇文章不就是用户最后一次可能点击的新闻文章吗? 这样就把原问题变成了一个点击率预测的问题(用户, 文章) --> 点击的概率(软分类), 而这个问题, 就是我们所熟悉的监督学习领域分类问题了, 这样我们后面建模的时候, 对于模型的选择就基本上有大致方向了,比如最简单的逻辑回归模型。
解决思路
要先转成一个分类问题来做, 而分类的标签就是用户是否会点击某篇文章,分类问题的特征中会有用户和文章,我们要训练一个分类模型, 对某用户最后一次点击某篇文章的概率进行预测。
Baseline
-
读取 采样 或 全量 数据
- debug模式:从训练集中划出一部分数据来调试代码
- 读取点击数据,这里分成线上和线下,如果是为了获取线上提交结果应该讲测试集中的点击数据合并到总的数据中,如果是为了线下验证模型的有效性或者特征的有效性,可以只使用训练集
-
获取 用户 - 文章 - 点击时间 字典
- 根据点击时间获取用户的点击文章序列 { u s e r 1 : { i t e m 1 : t i m e 1 , i t e m 2 : t i m e 2.. } . . . } \{user1: \{ item1: time1, item2: time2..\}...\} {user1:{item1:time1,item2:time2..}...}
-
获取 点击最多的 top-k 个文章
-
itemcf 的物品相似度计算
- 文章与文章之间的相似性矩阵计算
- 思路: 基于物品的协同过滤(可以考虑时间因素)
-
itemcf 的文章推荐
- 基于文章协同过滤的召回
- return: 召回的文章列表 { i t e m 1 : s c o r e 1 , i t e m 2 : s c o r e 2... } \{item1:score1, item2: score2...\} {item1:score1,item2:score2...}
- 获取用户历史交互的文章(不足10个,用热门商品补全,填充的item应该不在原来的列表中)
-
给每个用户根据物品的协同过滤推荐文章
- 获取 用户 - 文章 - 点击时间 的字典
- 取文章相似度
- 确定相似文章的数量,召回文章的数量
- 用户热度补全
其他优化 function
- df节省内存函数