目录

  • 前言
  • 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方案分享相关推荐

  1. 竞赛 | Aspect-based的情感分析任务第一名方法解读 -- 2022搜狐校园算法大赛

    每天给你送来NLP技术干货! 来自:ChallengeHub 知乎:https://zhuanlan.zhihu.com/p/533808475 之前没认真打过炼丹的比赛,这次机缘巧合碰上了三个牛逼又 ...

  2. 2022搜狐校园算法大赛正式开启

    算法江湖风云再起,AI人才并驱争先 大咖导师坐镇,海量真实数据 顶尖高手同台,挑战再度升级 快来展现超强算法,Carry全场C位出道 参赛对象:全日制在校大学生(本科.硕士.博士均可) 参赛形式:个人 ...

  3. 近期活动盘点:第一届“数据故事计划”、 第三届搜狐校园算法大赛

    想知道近期有什么最新活动?大数点为你整理的近期活动信息在此: 第一届 "数据故事计划" "大数据故事计划"旨在收集各类有关大数据的故事,然后进行比赛及相关的宣传 ...

  4. 第三届搜狐校园算法大赛开赛!

    第三届搜狐校园算法大赛开赛! 2019年4月8日,第三届搜狐校园内容识别算法大赛正式开赛,同期面向参赛选手开放竞赛结果提交.搜狐携手清华计算机系共同发起本届大赛,面向全球范围内的全日制在校生,旨在通过 ...

  5. 2022搜狐校园 情感分析 × 推荐排序 算法大赛 baseline

    比赛链接:https://www.biendata.xyz/competition/sohu_2022/ 完整代码 可关注ChallengeHub 回复"搜狐"即可获取 赛题背景 ...

  6. 天池-安泰杯跨境电商智能算法大赛(冠军)方案分享

    竞赛分享 天池-安泰杯跨境电商智能算法大赛 --冠军团队:法国南部 团队成员:Rain/Fish/楠枰 在19年9月下旬结束的"安泰杯"跨境电商智能算法大赛中,来自京东零售的法国南 ...

  7. 【比赛报告】biendata_2021搜狐校园文本匹配算法大赛_解决方案

    [比赛报告]biendata_2021搜狐校园文本匹配算法大赛_解决方案 前言 一.赛题 二.模型设计 三.训练技巧和提升方案 四.总结 代码开源 前言 比赛网页 之前写过相关的赛题解读,想了解的朋友 ...

  8. 语义匹配(二)搜狐文本匹配大赛BaseLine比较:P-tuning和Conditional_LN实现多任务语义匹配

    语义匹配(二)搜狐文本匹配大赛BaseLine比较:P-tuning和Conditional_LN实现多任务文本匹配 比赛简介 数据样例 任务解读 即插即用的多任务模块 P-tuning P-tuni ...

  9. 搜狐校园实习招聘笔试题

    2013-03-20 晚上  参加搜狐笔试 (主要部分,并不完整) 1 Http 500 含义 2 Session 和 Cookie 区别 3 工厂模式与单例模式是? 举例说明单例模式 4 linux ...

  10. 算法大赛十强战队解题方案大公开!【附PPT下载】

    2020腾讯广告算法大赛已圆满结束,决赛舞台上一个又一个设计巧妙.思路清晰的解题方案,仍旧让每位观众都记忆犹新. 纵观决赛,其中最显眼的就是冠军战队"DYG"对于BERT的应用,他 ...

最新文章

  1. 第二章:搭建Android开发环境(读后感)
  2. jboss7 Java API for RESTful Web Services (JAX-RS) 官方文档
  3. 2021-03-29 PE条件(自适应、参数辨识、数据驱动常常涉及)
  4. maven引入hadoop_Maven引入hadoop依赖包出错解决办法
  5. 超方便、最简单版本:java 邮件发送 (半分钟写完代码)
  6. 不服OceanBase跑分?今天起可到阿里云上一战
  7. 递归获取字符串内的所有图片src地址
  8. 【FLink】Flink 1.9 升级到 1.12.4 无配置页面 无日志
  9. 面试最后,HR 最后会说“我的问题问完了,你有什么要问我的吗?”如何理解和回答这句话?
  10. web项目无法热更新
  11. 跨域访问JQuery+.NET实现的一种思路,以及极简单Demo
  12. python代码_Python发送邮件基础知识与代码讲解!
  13. Python代码缩进
  14. 最新版mysql8.0.13如何汉化_MySQL 8.0.13 下载安装教程图文详解
  15. 接口测试一般怎么测?接口测试的流程和步骤
  16. 昆特牌显示无法连接至服务器,巫师之昆特牌总是显示无法连接网络
  17. 中国支付清算协会发布《2022中国支付清算行业社会责任报告》
  18. python3.7如何改中文_Python 3.7切回3.6-Go语言中文社区
  19. 后台ui大全(有这些你就够了)
  20. 重学Elasticsearch第1章 : Elasticsearch, Kibana概念、Elasticsearch相关术语

热门文章

  1. 微信小程序自动回复机器人(模拟云信案例)
  2. 火箭工作室c++小游戏——斗地主
  3. 考研常识:考研加分和照顾政策有哪些?
  4. 【Love2d从青铜到王者】第十篇Love2d之类和类的继承(Classes And Inheritance)
  5. Python + Opencv 实现遥感影像tif格式转jpg
  6. python模拟支付宝扫码登录_Python爬虫模拟登录支付宝并获取订单信息
  7. Resolution 归结原理
  8. 轻量型目标检测算法一次看个够
  9. python 查询oracle数据库返回具体字段名
  10. excel白屏未响应_EXCEL2016经常卡死,白屏,经常使用过程中卡住,然后显示office正在尝试恢复...