热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

IJCAI18阿里妈妈搜索广告转化预测总结

IJCAI-18阿里妈妈搜索广告转化预测总结,Go语言社区,Golang程序员人脉社

1. 比赛背景

官网介绍:本次比赛以阿里电商广告为研究对象,提供了淘宝平台的海量真实交易数据,参赛选手通过人工智能技术构建预测模型预估用户的购买意向,即给定广告点击相关的用户(user)、广告商品(ad)、检索词(query)、上下文内容(context)、商店(shop)等信息的条件下预测广告产生购买行为的概率(pCVR),形式化定义为:pCVR=P(cOnversion=1 | query, user, ad, context, shop)。
结合淘宝平台的业务场景和不同的流量特点,我们定义了以下两类挑战:
(1)日常的转化率预估

(2)特殊日期的转化率预估


2. 比赛数据

    本次比赛为参赛选手提供了5类数据(基础数据、广告商品信息、用户信息、上下文信息和店铺信息)。基础数据表提供了搜索广告最基本的信息,以及“是否交易”的标记。广告商品信息、用户信息、上下文信息和店铺信息等4类数据,提供了对转化率预估可能有帮助的辅助信息。
    用于初赛的数据包含了若干天的样本。最后一天的数据用于结果评测,对选手不公布;其余日期的数据作为训练数据,提供给参赛选手。
    在上述各张数据表中,绝大部分样本包含了完整的字段数据,也有少部分样本缺乏特定字段的数据。如果一条样本的某个字段为“-1”,表示这个样本的对应字段缺乏数据。


3. 数据预处理

首先,我们针对数据做了一个整体分析:

  1. 虽然个别数据有缺失值,但均在1%以下,对整个训练结果影响非常轻微。
  2. 对每个特征进行可视化分析,有些特征符合正太分布,例如:各个用户等级数目,各个店铺的评价等级数目。有些特征符合长尾分布,例如:展示页面点击次数,各个广告商品的销量等级数目。
  3. 日常的转化率和点击次数都很稳定,周末也相同。特殊日期转化率是正常日期的4倍以上。

3.1 缺失值处理

基于数据基本比较完好,我们不用做什么额外的学习,来补全缺失值,仅通过中位数或者众数补全即可。

当然,我们也需要看看数据中有没有异常数据。对于本题目来说,除了-1代表缺失值来说,没有特别的异常数据。

对于树模型来说,我们可以不做任何处理,因为树模型本身就具有处理缺失数据的能力,而比赛提供的数据缺失值又非常稀少,所以可以忽略。

对于SVM,LR,神经网络模型来说,我们通过中位数,均值,众数任选一补全即可。

3.2 归一化

对于LR,SVM,神经网络等数值运算型的模型来说,数值是否稳定,具有非常重要的意义。

对于长尾分布的数值特征,一般采用取log,再进行最大最小归一化(Min-Max Scaling 又称为Min-Max normalization)

对于正太分布的数值特征,一般采用正则归一化(Z-score normalization)

我们在神经网络wide_deep模型中采用了Min-Max Scaling来进行归一化操作。

对于非数值化的类别特征,我们它进行0-n数值化编码,使之可以分类,也可以作为连续型特征使用。


4. 特征提取

特征主要分成几大类:

  1. 原始特征。对原始特征进行一些简单处理,例如日期,类别,属性列表等。
  2. 交叉特征。不同值和值之间的交叉特征。例如性别和商品类别交叉,城市和商品类别交叉等。
  3. 计数特征。例如均值,最大值,中位数,众数,最小值。
  4. 比例特征。包括商品转化率,用户转化率等关于转化率特征,以及属性占比特征。

4.1 原始特征

1. 日期特征。我们把单个日期字段(context_timestamp)给拆分出来,分成日(day)和小时(hour)。

2. 商品类别列表。根据数据特点,只有第二个类别有用,我们取item_category_list第二列作为特征。

3. 商品属性列表。我们直接按照排列顺序进行特征拆分。将一个item_property_list拆分成10个特征。

其他原始变化特征:

1. 商品属性数目/商品类别数目。

2. 连续型特征分段。在本赛中用处不大,因为很多数值型特征已经被处理过成level级别的数据了,如果没有处理过的话,可以自己处理,例如年龄分段,店铺评价数量分段。本题中,我们对商店物流评分,服务评分,描述评分,评价评分进行分段。

Tips: 连续型特征分段的好处。

  1. 避免异常值对模型的影响,例如一个年龄为300的人就会对LR模型造成很大困扰。
  2. 分段之后可以做离散化(one-hot)处理。例如年龄30岁和35岁,其实兴趣应该变化不大。例如18岁和23岁,人的兴趣会有极大的转变。那我们按10-20,20-30,这样进行处理,并进行离散化,这样能大概区分出10个特征。
  3. 分段之后就可以与其他离散化特征进行特征交叉操作,挖掘出更多的潜在信息。
  4. 简化模型特征,降低过拟合风险。

4.2 交叉特征

特征交叉是对两个或者三个或更多个离散化变量进行组合,可以获得非线性的特征,从而获得更多的潜在信息。

举个例子:例如男性对化妆品品类应该不太感兴趣,对运动类品类更有兴趣,女性恰好相反。从特征表达的角度来讲,男性这个特征对化妆品为1,对运动类也为1。品类这个特征不能反应出性别对品类是否感兴趣。于是我们进行特征组合,【性别-品类】。这样 【性别-品类】特征中 男性-化妆品 在男性下为0,在女性下为1。

我们对在该比赛做了以下尝试:

  1. 用户性别和其他用户信息的两两组合。
  2. 商品销售信息和其他商品信息的两两组合。

4.3 计数特征

计数特征非常多样,常见的有统计次数,最大值,最小值,均值,众数,中位数等等。

这个比赛的特征主要分成三个对象:商品,商铺,用户。

我们分别对着三个对象进行特征描述。下面以用户为例子:

  1. 关于用户的各类均值特征,主要是对关于商品和商铺求均值。例如:平均消费商品价格,平均商品销量水平,平均商铺评分。
  2. 用户关于item_id 和 cat_id 的时间差特征。
  3. 统计用户当天该次点击之前的点击次数。
  4. 是否为用户第一次点击,中间点击,最后一次点击。

4.4 比例特征

比例特征是特征中重要性非常高的一类特征,因为比起交叉特征,更能体现出用户的兴趣,以及商品的内在特质。从特征角度来说,他是分布在0-1之间的稠密性连续型特征,比起0-1类特征包含了更多的信息。而且它数值波动小,更适合模型去拟合。

比例特征包括各类组合特征的统计,以及出现次数比例统计,以及相关转化率统计。下面以用户例子:

  1. 计算关于用各个性别中的各个年龄比例,各个职业占比比例,各个用户等级级别比例。同理可得。
  2. 用户属性和商铺对象属性,商品对象属性的交叉。例如各个用户性别中各个商品销量等级比例,比如男性用户中商品销量等级为1的商品的占所有男性用户商品的比例。
  3. 各类属性转化率特征。用户转化率,用户性别转化率,用户职业转化率等。

4.5 其他特征

这个比赛我们后期没有取得很好的单模型效果,与前排大佬的最好单模型效果差了接近2个千分点。我猜测主要原因是没有利用好广告预测属性和商品本身属性,我们只是对比了一下广告预测属性和商品本身属性是否相同这一特征。

本次冠军在github上分享了他的处理思路:主要是通过属性来描述用户对属性的偏好,从而得到足够的信息来判断用户转化率。

  1. 对属性做one-hot处理(但是由于属性ID太多,one-hot内存爆炸,很好奇冠军是怎么处理的,后期再更新)
  2. groupby 用户ID,对每个属性出现次数做一个均值处理,当作用户的偏好特征 
  3. groupby 商品ID,对上述得到的用户属性偏好均值再求均值,得到商品的均值偏好特征。

本次比赛冠军分享:商品属性处理


5. 特征选择

这个比赛让我感受到,特征选择不是必须的,如果你特征构建的好的话,全部都用上是一个不错的选择。但是如果你特征实在是太多了,可以通过特征选择选择出多个效果相似,但是差异性较大的特征子集。这样我们在后期融合的时候,可以得到较大的提升。另外,由于初赛数据集太小,所以特征选择出现了很好的效果,一般来说,特征越多引入的噪音也越多。

特征选择一般有三种方法:1. 过滤式(filter)2. 包裹式(wrapper)3. 嵌入式(embedding)

  1. filter式比较简单。主要就是一个打分函数,对每个特征打分,然后根据规则选择特征。例如信息增益(可以根据树模型得到),卡方检验(检验特征与结果分布的独立性),皮尔逊相关系数。
  2. 包裹式就比较消耗时间。主要是逐个或者随机加入特征,再训练模型检验效果是否提升,如果是则加入,如果否则抛弃。有很多启发式算法可以应用在其中,例如粒子群,退火算法。该方法在比赛中应用最广。
  3. 嵌入式为L1正则式。

在复赛情况下,由于数据量太大,有前排大佬分享,可以通过线上线下数据对特征先做一个检测,如果分布不同则直接去除掉,减少特征子空间。之后再通过启发式算法进行特征选择。通过选择出多套结果优秀且不同的特征子集后,进行模型融合。


6. 模型构建

对于这种比赛,亲测lgb和xgb效果是别的模型无可比拟的。wide_deep 和 wide_cross 神经网络模型无法也超越这两个树模型。

对于lgb,xgb为什么在各个比赛中大显身手,乃至无可比拟。个人觉得是因为

  1. 特征偏少,最多也在百和千这个量级。
  2. 特征稠密,多数为连续数值型特征。
  3. 特征和预测结果存在着大量的非线性关系。
  4. 训练数据量偏少,复赛中虽然共有1000万数据,但是实际上真正可用的也就是特殊日期那一天的上午100万条。
  5. 特征构成复杂,既有连续型特征,也有数值型特征。


7. 模型融合

我们尝试了传统的stacking方法,效果不好,原因不详。

冠军把前7的数据对特殊日期进行预测,把预测结果作为特征输入到特殊日期模型中,我觉得是一个很好的想法,之前一直想怎么利用好前7天的数据,也只是想在加入更多的数据量这个层面上思考,并没有思考说做一个模型进行预测。但是我们有把wide_deep神经网络的输出结果当作特征输入xgb模型中,注意输入之后一定要有不同(要么之后模型的特征空间不同,要么是模型的数据集不同),所以输入之后我们在训练xgb的时候删掉了wide_deep用到的特征。

我们后来试了一个融合的骚操作,就是依据下面这个公式,但是进行逆向融合,也就是先求逻辑函数的逆操作,然后进行逻辑函数操作,融合提升了一个万分点。



8. 比赛总结

这场比赛有几个失误的点:

1. 初赛很认真地做了各种特征分析,特征分布,乃至把预测属性和真实商品属性也考虑了,在复赛中却没有静下心来再次分析。(也是下意识觉得初赛和复赛数据分布应该差不多,结果啪啪啪打脸)

2. 在复赛中没有好好做特征选择,而是盲目用了全部特征进行训练,导致模型提升很被动。(其实也有因为初赛最后所有特征加起来比特征选择结果好的因素)

3. 没有划分好线下预测集。这个问题特别大,因为不能在线下很好地预估模型的效果,包括特征选择和模型调优都存在过拟合的风险。必须要划分好预测集,使得线下线上同升同降,这样能大大减少工作量。

总的来说,还是很感谢两位队友,一位来自西电,一位来自浙大。作为第一次参加的萌新,能取得初赛第7,复赛第23名的成绩还是感到满足。









推荐阅读
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • 近年来,大数据成为互联网世界的新宠儿,被列入阿里巴巴、谷歌等公司的战略规划中,也在政府报告中频繁提及。据《大数据人才报告》显示,目前全国大数据人才仅46万,未来3-5年将出现高达150万的人才缺口。根据领英报告,数据剖析人才供应指数最低,且跳槽速度最快。中国商业结合会数据剖析专业委员会统计显示,未来中国基础性数据剖析人才缺口将高达1400万。目前BAT企业中,60%以上的招聘职位都是针对大数据人才的。 ... [详细]
  • 本文讨论了同事工资打听的话题,包括同工不同酬现象、打探工资的途径、为什么打听别人的工资、职业的本质、商业价值与工资的关系,以及如何面对同事工资比自己高的情况和凸显自己的商业价值。故事中的阿巧发现同事的工资比自己高后感到不满,通过与老公、闺蜜交流和搜索相关关键词来寻求解决办法。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 标题: ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • GPT-3发布,动动手指就能自动生成代码的神器来了!
    近日,OpenAI发布了最新的NLP模型GPT-3,该模型在GitHub趋势榜上名列前茅。GPT-3使用的数据集容量达到45TB,参数个数高达1750亿,训练好的模型需要700G的硬盘空间来存储。一位开发者根据GPT-3模型上线了一个名为debuid的网站,用户只需用英语描述需求,前端代码就能自动生成。这个神奇的功能让许多程序员感到惊讶。去年,OpenAI在与世界冠军OG战队的表演赛中展示了他们的强化学习模型,在限定条件下以2:0完胜人类冠军。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 如何使用计算机控制遥控车的步骤和电路制作方法
    本文介绍了使用计算机控制遥控车的步骤和电路制作方法。首先,需要检查发送器的连接器和跳线,以确定命令的传递方式。然后,通过连接跳线和地面,将发送器与电池的负极连接,以实现遥控车的前进。接下来,制作一个简单的电路,使用Arduino命令将连接到跳线的电线接地,从而实现将Arduino命令转化为发送器命令。最后,通过焊接晶体管和电阻,完成电路制作。详细的步骤和材料使用方法将在正文中介绍。 ... [详细]
author-avatar
so-sweet天地
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有