天池-OppO-OGeek比赛总结

2024-08-31 06:32
文章标签 总结 比赛 ogeek oppo 天池

本文主要是介绍天池-OppO-OGeek比赛总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

赛题资源

题目链接

数据链接

我的代码

这份代码是复赛的代码,写的比较规范些,也添加了一些注释。因为实在阿里云的平台上运行的,所有有些地方会报错,不能直接运行。最主要的问题应该是输入数据的路径不对,改成对应的路径即可。

赛题描述及分析

在搜索业务下有一个场景叫实时搜索(Instance Search),就是在用户不断输入过程中,实时返回查询结果。赛题的数据如下:

字段说明数据示例
prefix用户输入(query前缀)刘德
query_prediction根据当前前缀,预测的用户完整需求查询词,最多10条;预测的查询词可能是前缀本身,数字为统计概率{“刘德华”:  “0.5”, “刘德华的歌”: “0.3”, …}
title文章标题刘德华
tag文章内容标签百科
label是否点击0或1
   

比如用户当前输入为刘德华,系统后台会根据自己获得到的数据来得到一个query,query中的每一项的具体含义题目中也没有具体说明,选手们的猜测大概是这样一个意思,当输入“刘德”时,用户有0.5的概率是想输入“刘德华”,0.3的概率是想输入“刘德华的歌”,等等。而title、tag则是系统推荐给用户的一个“标题”,tag则是这个标题对于的标签,比如百科、应用、音乐、网站等等。label则是我们需要预测的值,判断用户在这个情况下是否会点击这个标签。

分析数据的时候发现,title未必在query_predicti中,甚至prefix不是title的前缀,看起来好像不太合理,但是仔细一想,这可能是潜在的一个重要特征?

本次竞赛的评价标准采用F1 score 指标,正样本为1。

特征工程

特征工程主要还是脑洞大开,充分挖掘自己的脑细胞,想出各种特征,不要怀疑是否有用。我的脑洞特征有这么几个:

1、转化率特征。对prefix,title,tag特征计算单个特征的浏览量、点击量和点击率,同理到两两组合,三个一起组合的情况。拿上面“刘德”的例子就是,对于单个特征比如prefix,得到“刘德”的浏览量为20,点击量为5,那么点击率为0.25,同理可能计算得到prefix为“oppo”的浏览量、点击量、点击率分别为10,1,0.1。对于两个组合也是一样的道理,比如prefix为"刘德",title为“刘德华”的情况浏览量、点击量、点击率分别为10,5,0.2,。值得注意的是,为了防止出现浏览量非常少的情况,可以用点击量/(浏览量+10)的方法来平滑一下。

这种特征相当于是对训练集的记忆,容易产生过拟合。

2、其他一些比较简单,显而易见的特征有:prefix是否在title中,prefix和title字符串的长度(用户只输入一个字符与输入5,6个字符推荐出来的结果可能会影响点击),query候选词的数量,当前的title是否在query候选词中以及对应的概率,如果不在的话返回0。

3、和莱温斯坦距离,即编辑距离相关的特征。prefix和title的编辑距离,如果编辑距离越小甚至为0,可能点击的概率较大,为了消除字符串本身长度带来的影响,可以在生成一个编剧距离/maxlen(prefix,title)的特征。同理还可以推广到query和title中,加入query中很多候选词或者某个候选词和title的编辑距离很小,被点击的概率可能很大。但是query有很多候选词的,有些query甚至没有候选词。我做了这样一些特征,计算title和每一个query中候选词的编辑距离,然后得到这些编辑距离的最小值、平均值以及加权值,这里的加权值是和候选词对应的概率做加权。

4、最长公共子串相关的特征(这个特征和编辑距离有点相似)。计算得到prefix和title的之间的最长公共子串的长度,为了消除字符串长度的影响,可以再像编辑距离特征一样,除于最大字符串的长度。对于query和title,则对title和query中的每一个候选词计算最长公共子串的长度的占比,然后得到这个比率的最大值、平均值和加权值。

5、和词向量相关的特征。词向量可以从网上其他地方下载得到,也可以使用本次比赛提供的数据训练得到,主要对query中的候选词作为语料源,因为这里的字符串比较长,另外从题目本身训练得到的词向量相对来说也比较准确。词向量的训练可以直接运行w2v.py代码。由于prefix、title、query_prediction里面都是一些短语,首先需要对它进行分词操作,得到所有分词的词向量,然后对所有的词向量求平均值作为这个短语的向量。这样可以计算得到query和title之间词向量的相似度,同时可以对query中每一个候选词和title的词向量的相似度,并求的这些相似度的最大值、平均值和加权值。

6、预测用户真正想输入的orefix,比如用户输入‘刘德’,我们有很大的概率可以判断用户想输入的其实是‘刘德华’。预测用户真正想输入的词汇可以借助于query中的词汇,比如query中出现大量的“刘德华”,我们可以判定用户真正想输入的词汇就是“刘德华”。可以对query中所有的候选词,统计出出现次数过半的最长字符串作为当前的prefix。

7、对生成的特征做一个均值填充,对所有的特征取log做为新的特征。

模型

在实验中,尝试过LGB、XGB、RF、GBDT+LR等模型,以及模型融合的结果,发现最好的还是LGB5折的效果最佳,当然也有可能是模型参数调试的不好导致融合效果不如单模型。由于对prefix、title、tag这3列数据group后的特征作用不大,且容易引起过拟合,因此训练的时候去掉了,下面是LGB训练后特征的重要度

发现,最重要还是点击率、点击量等特征,而编辑距离特征、词向量特征作用有限。

总结反思

特征方面大部分人的都差不多,上面这些特征也是大家都能想到的,到后面实在想不出什么好的特征了。而模型方面真的是脑洞有限。依然停留在各种树模型LGB、XGB的阶段,无法想出比较耳目一新,非常管用的模型,只能参数乱试一通。最终成绩初赛86/2888,复赛成绩57/2888,F1值为0.7244。要冲进前20名真的是好难啊,如果有想交流的欢饮联系

决赛学习

决赛答辩还没有开始,到时候学习一下前排的大佬究竟使用的是什么特征,什么模型。

这篇关于天池-OppO-OGeek比赛总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1123156

相关文章

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

Java向kettle8.0传递参数的方式总结

《Java向kettle8.0传递参数的方式总结》介绍了如何在Kettle中传递参数到转换和作业中,包括设置全局properties、使用TransMeta和JobMeta的parameterValu... 目录1.传递参数到转换中2.传递参数到作业中总结1.传递参数到转换中1.1. 通过设置Trans的

C# Task Cancellation使用总结

《C#TaskCancellation使用总结》本文主要介绍了在使用CancellationTokenSource取消任务时的行为,以及如何使用Task的ContinueWith方法来处理任务的延... 目录C# Task Cancellation总结1、调用cancellationTokenSource.

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

二分最大匹配总结

HDU 2444  黑白染色 ,二分图判定 const int maxn = 208 ;vector<int> g[maxn] ;int n ;bool vis[maxn] ;int match[maxn] ;;int color[maxn] ;int setcolor(int u , int c){color[u] = c ;for(vector<int>::iter

整数Hash散列总结

方法:    step1  :线性探测  step2 散列   当 h(k)位置已经存储有元素的时候,依次探查(h(k)+i) mod S, i=1,2,3…,直到找到空的存储单元为止。其中,S为 数组长度。 HDU 1496   a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 。 x在 [-100,100] 解的个数  const int MaxN = 3000

状态dp总结

zoj 3631  N 个数中选若干数和(只能选一次)<=M 的最大值 const int Max_N = 38 ;int a[1<<16] , b[1<<16] , x[Max_N] , e[Max_N] ;void GetNum(int g[] , int n , int s[] , int &m){ int i , j , t ;m = 0 ;for(i = 0 ;

go基础知识归纳总结

无缓冲的 channel 和有缓冲的 channel 的区别? 在 Go 语言中,channel 是用来在 goroutines 之间传递数据的主要机制。它们有两种类型:无缓冲的 channel 和有缓冲的 channel。 无缓冲的 channel 行为:无缓冲的 channel 是一种同步的通信方式,发送和接收必须同时发生。如果一个 goroutine 试图通过无缓冲 channel