天天看点

2019腾讯广告算法大赛思路

作者:小凤仙er

链接:https://www.jianshu.com/p/44a000657eff

来源:简书

简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

本次比赛与以往一般的比赛有一个最大的不同之处就是需要参赛者自己构建 [input & label] 。

因此该比赛的标准作业流程应该如下:

2019腾讯广告算法大赛思路

之所以第一步就要数据清洗的主要原因是因为如果在统计标签之后,再进行数据清洗会非常麻烦,作者已经尝试了,至此不希望广大朋友再次受害,因此做此更新。

第一步:数据清洗

我们需要先将曝光日志文件转为csv格式,因此在转换csv的过程中就可以完成大部分的数据清洗工作。具体操作如下:

pandas读取原始 totalExposureLog.out 文件时,是逐行分解出各个字段,然后转为dataframe格式,最终保存为csv格式文件。而我们在逐行分解出各个字段时就可以进行该条记录是否是异常数据的判断了,如果是异常数据则扔掉,反之保存。

具体操作知道了,那么什么是异常数据,或者说哪些数据是可以清洗掉的数据呢?根据昨天官方出的FAQ作者大致总结如下:

1. 首先对ad_static_feature 即广告静态数据在转为csv格式的时候进行数据清洗,凡是某个字段存在缺失值 / 创建时间为0 (此处的0与后面的-1请事先用type()函数确认数据类型,在进行判断,不要把一个str与一个int进行比较哦~~) / 广告行业id出现多值(用逗号分隔) 都视为异常数据,直接扔掉。 (官方解释:空值的广告从出题意图上来说就没打算让选手作为训练数据,可以清洗掉。)

2. ad_operation 清洗掉 ad_static_feature 中没有的广告(原因:广告只要被创建就会在 ad_static_feature 表内有记录,因此没有被记录在 ad_static_feature 表内的广告,若出现在了 ad_operation表中则认为该操作是异常操作)

3. user_data 中经观察暂未发现异常,暂不用清洗

以上3步数据清洗工作是为了后面清洗曝光日志文件的异常数据做准备~~~(2 & 3步没有实质操作是因为目前并未发现有异常,如果发现还需要清洗)

1. 广告请求时间出现了 2月30号,这种不符合常理的数据直接扔掉由于广告请求时间是用1970年后的浮点秒数来计算的,不会存在2月30号的情况,也不会出现平年出现2月29号,采用time.strftime('%Y-%m-%d %H:%M:%S',time.localtime (秒数))即可得到转换后的时间。

2. 广告曝光记录中任一字段缺失视为异常数据,直接扔掉(因为数据量大,这么操作是没问题的)

3. 广告曝光记录中任一不符合手册中 [字段取值类型/范围] 描述的,视为异常数据直接扔掉。(如:id类数据出现小数,广告位id出现多值,并且用逗号分隔等。

4. 广告的请求时间是否在广告有效期内,这个需要关联到ad_operation表去,如果请求时间是在广告设置为无效期间内,则扔掉。(这里的具体操作建议先在ad_operation表中把相关广告id对应的失效期提取成一个单独的csv,然后进行判断)(经验证,这种状况不存在)

5. 广告id与ad_static_feature进行关联,若该广告id在ad_static_feature中的信息不存在,直接丢掉。因为我们在上面的前三步中已经对 ad_static_feature 数据做了清洗工作,如果曝光日志连广告静态属性都没有,那说明这个曝光记录对我们的没有用的  (因为我们要进行训练的!!!) 

6. 同一用户,同一广告id,同一请求时间,同一请求id,同一广告位id,同一素材尺寸的记录视为用户操作不当,(可能用户页面卡顿,连续点击多次),可以进行去重操作,保留一条。(这一种数据的清洗建议在其他异常数据出完成而且已经保存为csv格式后,再读取csv格式数据进行操作,因为重复这个事是需要全局数据对比的。) 

以上6步数据清洗是针对 totalExposureLog.out 文件的,对于其他数据的清洗等日后更新~~~

接着,第二步:构造训练集标签!

首先说明一点,经过第一步之后,有三张表清洗过,totalExposureLog、ad_static_feature、ad_operation,意思就是说,凡是出现在totallExposureLog中的记录的广告id,一定必须要同时存在于ad_static_feature、ad_operation!!!下面说说原因。

构建训练集标签思路:

官方数据给了5张表分别为:

1.    totalExposureLog :总的曝光日志文件(清洗过)

2.    user_data             :用户属性文件

3.    ad_static_feature :广告静态特征(清洗过)

4.    ad_operation        :广告操作数据(清洗过)

5.    test_sample          :测试样本

因此,label的构建实质上就是统计曝光日志文件中同一个广告的出现次数。

但是这里注意了,同一个广告到底是如何定义的?什么才叫同一个广告?

先不急,要知道统计标签的最终目的是干嘛?当然是构建训练集了,可是如果统计了没用的标签最终导致无法训练该怎么办呢?

上面的话什么意思呢?我们先看张: 测试样本数据

2019腾讯广告算法大赛思路

test_sample.csv

如上图,我们可以看到官方给到了测试数据一共有11个字段,

其中C\D\E\G\H\K(对比到图中字段)是可以根据广告id关联到广告静态数据表中得到的(这几个字段不用关心,不用关心的意思就是说我们在统计标签的时候,如果要考虑该标签是无用的还是有用的,不用通过这几个字段去考量)。

样本id(J)没有实际意义。

剩下的A\B\I是我们需要关心的。对于出价(B)字段,广告曝光日志里的记录本身就有(这里有自动竞争出价和人为操作出价两种模式。)竞争出价时,出价在变,而操作数据里却没有记录,但是这里依然有效,而人为出价操作数据里有记录,当然也有效(因此出价这个字段暂不讨论,都认为有效)。

重点来了接着对于人群定向(A)以及投放时段(I)我们可以观察到,在操作数据文件中出现过的广告id才会有这两个字段的具体取值,我否则们是无法获取到该字段的具体取值的,或者说无法显示直接得到,(也许可以通过记录请求时间之类的推断出投放时段之类的,这些不在讨论范围之内,因为作者的意图是丢掉没有这两个字段的数据)因此,这就决定了第二步刚开始的一句话:

凡是出现在totallExposureLog中的记录的广告id,一定必须要同时存在于ad_static_feature、ad_operation!!!

因为只有这样,我们构造/统计的训练集才能有完整的字段从而与测试集保持一致。

下面来一张操作数据图。

2019腾讯广告算法大赛思路

ad_operation.csv

我们可以发现,每个广告在创建之初都有设置好出价 / 定向人群 / 投放时段 这三个字段,因此也再次验证了上述的引用。

经过上述所有步骤,已经把脏数据 \ 无效广告数据(这俩是不同概念)已经处理的差不多了。接着就可以统计标签,构造训练集了!!!!!!!!

先上一张数据图:这是曝光日志文件里的数据:

2019腾讯广告算法大赛思路

可以观察到框中的部分,广告id都为61,但是出价大部分都不相同,出价是广告的一种属性,因此当出价不等时是不能看做同一个广告的。但是,我们可以看到图中红色方框框中的部分,他们的出价是一样的,因此可以暂时视这两条记录为同一个广告的曝光次数,暂定label=2。没完!!因为官方要求的是预估次日曝光量(这里有两种理解,第一种:次日0点到24点,第二种:创建/修改之后的24小时,先暂时当做第二种处理),所以这时我们需要考虑两种情况:

第一种情况:在该广告创建/修改后24小时内是否又发生了修改?,如果没有,那好我们只需要判断上述广告id=61的广告请求是否是在24小时内发生的,如果是,Label=2,反之,谁的请求时间没有在24小时内,谁就是无效广告!!,如果又发生了修改。。。看第二种情况。

第二种情况:我们需要将统计了2次的广告请求时间进行归类,举个例子:假设在2点创建了广告,一条广告请求发生在3点。然后在4点发生了修改,又有一条广告请求发生在5点,那么放在训练集里就表现为两个样本,Label分别为1.

大致总结以上,肯定有理解错误的地方,仅供参考。

继续阅读