2022搜狐校园算法大赛推荐赛道Rank2方案分享
目录
- 前言
- 1 赛题介绍
- 1.1 赛题描述
- 1.2 数据描述
- 2 数据分析
- 3 方案重点
- 3.1 总体思路
- 3.2 userSeq特征
- 3.3 穿越特征
- 3.4 冷启动问题
- 4 完整特征工程方案
- 4.1 CatBoost特征工程
- 4.2 LightGBM特征工程
- 6 总结和复盘
- 6.1 总结
- 6.2 复盘
- 6.3 一些小Tip
本文由我们队伍的大佬发布在知乎
前言
打了这么多比赛,终于拿了一次前排(初赛第3,复赛第2,决赛第3,两次赛点之星)。这次比赛的过程非常漫长,初赛接近两个月,复赛10天,决赛提交docker/准备答辩/录制小视频,真是煎熬,幸好最后拿到了奖金。
真的非常非常感谢另外两位队友@yys@wps的坚持和付出!
赛题地址:biendata平台
决赛直播回放:B站
1 赛题介绍
1.1 赛题描述
- 利用给出的用户文章点击序列数据及用户相关特征,结合第一部分做出的情感分析模型,对给定的文章做出是否会形成点击转化的预测判别。
- 评价指标:gAUC(所有group AUC的均值)
1.2 数据描述
- 推荐的部分,也会分为训练集和测试集,在数据中,我们将每次曝光给用户的展示结果列表称为一个Group(每个Group都有唯一的pvId)。训练集和测试集中每个Group都有正样本(曝光并点击)和负样本(曝光但未点击)。
- 训练集中每条样本包含pvId,用户id,点击序列(序列中的每次点击都包含文章id和浏览时间),用户特征(包含但不限于操作系统、浏览器、设备、运营商、省份、城市等),待预测文章id和当前时间戳,以及用户的行为(1为有点击,0为未点击)。
- 同时测试集和训练集中涉及到的所有文本主题内容及情感分析对象,我们都会通过附件文件给出具体内容。选手需要结合第一部分的模型,自行抽取出文本中的情感极性作为推荐特征,运用到点击预测中来。不允许使用除情感以外的其他文本特征,不允许不使用情感特征。pvId指的是单次曝光给用户的推荐列表页的唯一id。最后选手将测试集中的测试样本id及对应预测结果上传即可。
本次推荐赛道的题目属于典型的CTR预估问题。特别的是,这次比赛要求把文本实体的情感信息运用到CTR预估中。
赛题中提供的“userSeq(历史点击序列)”特征,是本次比赛需要挖掘的重点。这道题还提供了“logTs(曝光时间戳)”,这里可以构造出许多穿越特征。如果这道题把时间戳特征限制到“小时”级别会更好,这样穿越特征的效果就会大大减弱,更接近实际业务场景。
2 数据分析
首先,必须点赞这次比赛的数据质量,初赛复赛决赛的数据分布基本上是一致的,没有很大的变化,很难摸奖。
- 数据的时间分布
数据的时间分布,每天的数据量都比较均匀,没有某一天数据量特别多或特别少的情况。初赛提供1/2/3号数据作为训练集,4号数据作为测试集(初赛结束没有公布4号真实标签)。复赛增加5号数据作为训练集,6号数据作为测试集。决赛猜测使用7号数据测试集(仅官方线下测评使用,选手不可见)。
数据情况,初赛训练集大约423w,初赛测试集大约142w。复赛增加的5号训练集140w,复赛测试集也是140w。
- 标签分布
总体正样本比例基本在19%左右,没有标签不平衡的情况。每天的正样本比例也是非常一致的,没有某一天正样本比例突然增高或突然减小的情况。
- 用户和物品统计
初赛数据统计:总用户量约为35.5w,曝光item(即待预估的item)数量为3319,userseq里的item数量大约为14w。
关于item曝光量有两个特点。
**第一,长尾分布。**热门item曝光量非常高,日曝光量超过10000次,但冷门item的日曝光量只有10次不到,最低的只有1次2次。所以特征工程部分我们对曝光量做了取对数处理。
**第二,同一item的日曝光量差异大。**因为item是新闻,时效性很强,通常第一天的曝光量/点击率最高,第二天第三天的曝光量/点击率会很低。所以,除了对曝光量/点击率做全局统计,还增加了基于day/hour的统计。
- item位置
对数据按照pvId、logTs时间顺序排序,item在group中的排序即为“item位置”。item位置越靠前,点击率越高。item位置是一个重要的影响因素。
- 冷启动问题
冷启动问题严重,测试集中有大量训练集从来没有出现过的用户和物品。初赛数据的统计结果如下表所示。
以3号为例,3号有100079个用户,有84.6%是新用户,剩余15.4%的用户是前两天出现过的老用户;有1136个item,有56.9%是新item。所以必须要考虑如何缓解用户和物品的冷启动问题。
3 方案重点
3.1 总体思路
还是经典的结构化竞赛套路,特征工程和树模型。模型使用CatBoost和LightGBM。先用80%的数据进行训练,20%的数据做验证集,得到树模型的最佳迭代次数。然后再用全部数据进行训练和预测。模型融合使用最简单的加权平均,Cat权重60%,LGB权重40%。
3.2 userSeq特征
因为userseq里是用户过去曾经点击过的item序列,这里体现用户的兴趣信息,所以我们认为这是一个重点。对于如何利用userseq序列特征,我们使用了三种方法表示userseq特征。
- 使用word2vec算法得到 item embedding;然后按照时间衰减权重进行池化,得到点击序列的embedding特征;这种方法大概能提升几个千,具体多少忘记了。
- 使用countvec/TFIDF+SVD降维,得到点击序列的24维特征。这种方法能够提升8个千左右。
- 计算曝光 item 和 历史点击 item embedding 的余弦相似度,取最大的3个相似度作为特征,还计算了3个相似度的极差和均值特征,总共5个特征。这种方法能够提升1.5个百左右。这个方法是复赛最后几天实现的,若进一步探索,效果可能会更好。
3.3 穿越特征
穿越特征应该是这道题上分最大的部分。我们队通过构造时间差特征,获得大约 8 个百的提升。数据集提供了“曝光时间戳(logTs)”,很明显可以构造大量穿越特征。例如,计算当前item和下个item的曝光时间差,可以得到用户在当前item的停留时间。停留时间越长,说明用户点击的可能性越大。 停留时间非常短的话,说明用户很可能直接滑过去了,并没有点击。
下面直接贴代码:
data['log_datetime'] = data['logTs'] + 8 * 60 * 60 * 1000
data['log_datetime'] = pd.to_datetime(data['log_datetime'], unit='ms')
data['day'] = data['log_datetime'].dt.day
data['hour'] = data['log_datetime'].dt.hourdef make_ts_diff_feature(data, dense_feas):print('make_ts_diff_feature...')# 时间差特征data['user_time_diff_in_minute'] = data.groupby(['suv','day','hour','minute'])['logTs'].transform(lambda x: (x.max() - x.min())/1000)data['user_time_diff_in_hour'] = data.groupby(['suv','day','hour'])['logTs'].transform(lambda x: (x.max() - x.min())/1000)data['user_time_diff_in_day'] = data.groupby(['suv','day'])['logTs'].transform(lambda x: (x.max() - x.min())/1000)data['user_group_load_time'] = data.groupby(['suv','pvId'])['logTs'].transform(lambda x: (x.max() - x.min())/1000)return data, dense_feasdef make_ts_feature(data, dense_feas):print('make_ts_feature...')# 与前一个item曝光时间差group = data.groupby('pvId')data['ts_before'] = group['logTs'].shift(0) - group['logTs'].shift(1)data['ts_before'] = data['ts_before'].apply(lambda x: round(x/1000, 2))data['ts_before'] = np.log1p(data['ts_before'])# 与下一个item曝光时间差data['ts_after'] = group['logTs'].shift(-1) - group['logTs'].shift(0)data['ts_after'] = data['ts_after'].apply(lambda x: round(x/1000, 2))data['ts_after'] = np.log1p(data['ts_after'])# 累计浏览时间data['ts_cumsum'] = data.groupby('pvId')['ts_before'].transform('cumsum')del groupgc.collect()return data, dense_feas
3.4 冷启动问题
简单地说,就是通过对embedding聚类得到用户聚类和物品聚类特征。这样就能够给新用户新物品一个先验信息。根据这个聚类特征,就能够构造新的统计特征,以及填补缺失值的操作。
- **新的统计特征:**可以构造“用户聚类对物品聚类的点击率”、“用户聚类&省份的二阶点击率”等等。
- **填补缺失值:**因为之前构造了很多历史点击率特征,但是测试集没有真实标签所以绝大部分都是空值,这个时候就能够通过这两个聚类特征进行填补。
4 完整特征工程方案
4.1 CatBoost特征工程
- 文章实体情感统计特征(微弱提升)
- 基础统计特征
- 全局count:分类特征
- nunique:itemid & 分类特征 的一阶/二阶交叉nunique;suv & itemid 的交叉nunique统计
- 每个group的item个数以及分箱
- one-hot 比例特征
- itemid 在 不同时间段 的曝光比例
- itemid 在 不同item位置 的曝光比例
- suv 对 不同 item聚类 的曝光比例
- 历史点击率特征
- 过去1小时 item 曝光次数、点击次数、点击率、标准差
- 过去1小时 item & category-fea 的点击率
- 过去1小时 category-fea 的count和点击率
- 过去1小时 不同长度的 group 点击率
- 曝光时间/时间差特征
- 用户在 1minute/1hour/1day 内的使用时长特征
- 与前后 item 曝光时间差特征
- item/user 最后n次曝光距离现在的时间差
- userseq特征
- 用CountVectorizer和SVD降维得到 20维特征
- 用TfidfVectorizer和SVD降维得到 4维特征
- 计算待预估 item 和 userseq 里所有 item 的相似度,取最大的3个相似度
- item侧特征
- item覆盖的day&hour数量、itme日曝光/日pv覆盖率等、item热度(日曝光量的分箱)
- item关于各个类别的ratio特征
- item的时间排序特征
- item的位置排序特征
- 基于 item 的聚类特征、关于item聚类的历史点击率等统计特征
- suv侧特征
- suv 的聚类特征、关于suv聚类的历史点击率等统计特征
4.2 LightGBM特征工程
- 基础统计特征(与CAT方案一致)
- 历史点击率特征
- 过去10min item 点击率、标准差
- 过去1hour item 曝光次数、点击次数、点击率、标准差
- 过去30min item 点击率、count
- 过去1day item 点击率、count
- 过去1hour 不同长度的 group 点击率
- 曝光时间/时间差特征(与CAT方案一致)
- userseq特征
- 用 word2vec 得到32维特征
- item rank类特征
- item 第几次出现 rank 特征及 item 每天的 rank 的平均值和标准差
- item 对于某一用户是第几次出现 rank 特征及 item 每天的 rank 的平均值和标准差
- item 在某个group中的相对位置(按时间排序) rank 特征及 item 每天的 rank 的平均值和标准差
- 分布变换
- 对偏度大于0.5和小于-0.5的数据开方
- 偏度大于1和小于-1的数据取对数
6 总结和复盘
6.1 总结
- 这次比赛数据质量比较高。一方面,每天的数据分布情况基本一致,分数不会有太大抖动。另一方面,数据集提供用户基本特征,还提供用户历史点击序列,给特征工程提供了较大的发挥空间。基于业务场景构造出的特征,基本上都可以上分。
- 曝光时间差特征很重要。前排与后面队伍分数存在比较大的gap,推测原因主要是没有利用好logTs。
- 大部分队伍都是用树模型和特征工程,有两个队是用NN模型的。其中,推荐赛道rank4的浙大大佬@退赛 使用的改进Transformer模型非常新颖,构造数据、模型结构、改进注意力机制部分非常值得学习。
6.2 复盘
- 忘记构造关于文章实体的TFIDF统计特征
- pv侧特征、pv 与 user/item 之间的交叉特征 构造不足
- DIN模型效果不佳,推测可能的原因是冷启动问题,测试集大量新用户和新物品的embedding无法训练起来;也没有找到适合的数据和特征的构造方式
- 其他选手的方案亮点
- 随机负采样,保留全部正样本
- 使用deepwalk
- @退赛 使用的改进Transformer模型
- @后排广告位招租 使用的FM+DIN+LSTM结构模型
- 全部方案详见b站直播回放
6.3 一些小Tip
- 特征工程和数据分析穿插进行。想不出新特征的时候,观察数据,做数据分析,也许能够获得新的灵感
- 对于比较耗时的特征工程部分,保存处理好的数据,下次就不用再重新跑一次
- 在比赛初期的时候,先尝试各种各样的思路和模型,然后再决定接下来主要使用哪种思路、哪种模型
- 答辩的时候不仅要介绍自己的工作,还得讲讲自己的总结和思考;突出方案的亮点部分,加深评委印象(本次参加答辩学习到的经验,毕竟第一次进答辩环节hhh)
最后,本人水平有限,如有表述不对、不清或观点相左的地方,欢迎大家指出!
2022搜狐校园算法大赛推荐赛道Rank2方案分享相关推荐
- 竞赛 | Aspect-based的情感分析任务第一名方法解读 -- 2022搜狐校园算法大赛
每天给你送来NLP技术干货! 来自:ChallengeHub 知乎:https://zhuanlan.zhihu.com/p/533808475 之前没认真打过炼丹的比赛,这次机缘巧合碰上了三个牛逼又 ...
- 2022搜狐校园算法大赛正式开启
算法江湖风云再起,AI人才并驱争先 大咖导师坐镇,海量真实数据 顶尖高手同台,挑战再度升级 快来展现超强算法,Carry全场C位出道 参赛对象:全日制在校大学生(本科.硕士.博士均可) 参赛形式:个人 ...
- 近期活动盘点:第一届“数据故事计划”、 第三届搜狐校园算法大赛
想知道近期有什么最新活动?大数点为你整理的近期活动信息在此: 第一届 "数据故事计划" "大数据故事计划"旨在收集各类有关大数据的故事,然后进行比赛及相关的宣传 ...
- 第三届搜狐校园算法大赛开赛!
第三届搜狐校园算法大赛开赛! 2019年4月8日,第三届搜狐校园内容识别算法大赛正式开赛,同期面向参赛选手开放竞赛结果提交.搜狐携手清华计算机系共同发起本届大赛,面向全球范围内的全日制在校生,旨在通过 ...
- 2022搜狐校园 情感分析 × 推荐排序 算法大赛 baseline
比赛链接:https://www.biendata.xyz/competition/sohu_2022/ 完整代码 可关注ChallengeHub 回复"搜狐"即可获取 赛题背景 ...
- 天池-安泰杯跨境电商智能算法大赛(冠军)方案分享
竞赛分享 天池-安泰杯跨境电商智能算法大赛 --冠军团队:法国南部 团队成员:Rain/Fish/楠枰 在19年9月下旬结束的"安泰杯"跨境电商智能算法大赛中,来自京东零售的法国南 ...
- 【比赛报告】biendata_2021搜狐校园文本匹配算法大赛_解决方案
[比赛报告]biendata_2021搜狐校园文本匹配算法大赛_解决方案 前言 一.赛题 二.模型设计 三.训练技巧和提升方案 四.总结 代码开源 前言 比赛网页 之前写过相关的赛题解读,想了解的朋友 ...
- 语义匹配(二)搜狐文本匹配大赛BaseLine比较:P-tuning和Conditional_LN实现多任务语义匹配
语义匹配(二)搜狐文本匹配大赛BaseLine比较:P-tuning和Conditional_LN实现多任务文本匹配 比赛简介 数据样例 任务解读 即插即用的多任务模块 P-tuning P-tuni ...
- 搜狐校园实习招聘笔试题
2013-03-20 晚上 参加搜狐笔试 (主要部分,并不完整) 1 Http 500 含义 2 Session 和 Cookie 区别 3 工厂模式与单例模式是? 举例说明单例模式 4 linux ...
- 算法大赛十强战队解题方案大公开!【附PPT下载】
2020腾讯广告算法大赛已圆满结束,决赛舞台上一个又一个设计巧妙.思路清晰的解题方案,仍旧让每位观众都记忆犹新. 纵观决赛,其中最显眼的就是冠军战队"DYG"对于BERT的应用,他 ...
最新文章
- 第二章:搭建Android开发环境(读后感)
- jboss7 Java API for RESTful Web Services (JAX-RS) 官方文档
- 2021-03-29 PE条件(自适应、参数辨识、数据驱动常常涉及)
- maven引入hadoop_Maven引入hadoop依赖包出错解决办法
- 超方便、最简单版本:java 邮件发送 (半分钟写完代码)
- 不服OceanBase跑分?今天起可到阿里云上一战
- 递归获取字符串内的所有图片src地址
- 【FLink】Flink 1.9 升级到 1.12.4 无配置页面 无日志
- 面试最后,HR 最后会说“我的问题问完了,你有什么要问我的吗?”如何理解和回答这句话?
- web项目无法热更新
- 跨域访问JQuery+.NET实现的一种思路,以及极简单Demo
- python代码_Python发送邮件基础知识与代码讲解!
- Python代码缩进
- 最新版mysql8.0.13如何汉化_MySQL 8.0.13 下载安装教程图文详解
- 接口测试一般怎么测?接口测试的流程和步骤
- 昆特牌显示无法连接至服务器,巫师之昆特牌总是显示无法连接网络
- 中国支付清算协会发布《2022中国支付清算行业社会责任报告》
- python3.7如何改中文_Python 3.7切回3.6-Go语言中文社区
- 后台ui大全(有这些你就够了)
- 重学Elasticsearch第1章 : Elasticsearch, Kibana概念、Elasticsearch相关术语
热门文章
- 微信小程序自动回复机器人(模拟云信案例)
- 火箭工作室c++小游戏——斗地主
- 考研常识:考研加分和照顾政策有哪些?
- 【Love2d从青铜到王者】第十篇Love2d之类和类的继承(Classes And Inheritance)
- Python + Opencv 实现遥感影像tif格式转jpg
- python模拟支付宝扫码登录_Python爬虫模拟登录支付宝并获取订单信息
- Resolution 归结原理
- 轻量型目标检测算法一次看个够
- python 查询oracle数据库返回具体字段名
- excel白屏未响应_EXCEL2016经常卡死,白屏,经常使用过程中卡住,然后显示office正在尝试恢复...