前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【震惊】2019腾讯广告算法大赛-冠军代码复盘解析

【震惊】2019腾讯广告算法大赛-冠军代码复盘解析

作者头像
Coggle数据科学
修改2019-09-12 17:51:19
5790
修改2019-09-12 17:51:19
举报
文章被收录于专栏:Coggle数据科学Coggle数据科学

代码地址:

bettenW/Tencent2019_Finals_Rank1st

代码解析-Part1

此部分将进行我个人部分的代码解析,结合之前分享的赛题方案,更大家进行一次复盘。总体分为三个部分,预处理部分、特征提取部分、模型训练部分

预处理部分

主要工作构造训练集(10-22号)、测试集准备(23号,24号)、基本特征构造、23号训练集提取

构造训练集

首先提取出数据集,提取方式比较常规,按行提取即列切分。为接下来提取训练集做准备

logs_item=[]
for day in tqdm(range(20190410, 20190423),total=len(range(20190410, 20190423))):
    print('-'*50,day,'-'*50)
    file = path+'track_log_{}.out'.format(day)
    log_df = pd.read_table(file, names=['aid_request','request_time','uid','aid_location','aid_info'])
    print('-'*50,day,'-'*50)
    for item in tqdm(log_df[['aid_location','aid_info']].values, total=len(log_df)):
        for it in item[-1].split(';'):
            temp=list(item[:-1])
            it=it.split(',')
            temp.append(int(day))
            temp.append(int(it[0]))
            temp.append(int(it[5]))
            temp.append(int(it[6]))
            if temp[-1]==1:
                logs_item.append(temp)
            else:
                logs_item.append(temp)
    del log_df
    gc.collect()
    
logs=pd.DataFrame(logs_item)

训练集的提取方式一直都是大家讨论的热点问题,我个人也有分享我的提取方式,比较简单粗暴。

# 构造训练集
data = logs[['day','aid','isExp']].copy()
data = data.groupby(['aid','day'])['isExp'].agg({'sum'}).reset_index()
data.columns = ['aid','day','label']
data['label'] = data['label'].fillna(0)
print('init data:', data.shape)

# 合并静态数据
ad_operation = ad_operation.drop_duplicates(subset=['aid'], keep='first')
ad_static_feature = ad_static_feature.merge(ad_operation[['aid','op_type']], on='aid', how='left')
data = data.merge(ad_static_feature, on='aid', how='left')
data['op_type'] = data['op_type'].fillna(-999)
data = data.loc[(data.op_type!=-999)]
data = data.reset_index()
del data['index']
  1. 日志数据整合构造label

2. 确实值填充

3. 合并静态数据

3. 然后广告id的选取来自广告操作表,即判断‘op_type’是否存在

测试集准备(23,24号)

由于复赛B榜方案使用“远程监督”的方式,所以也对23号测试集进行了提取,提取方式与23号相同。

1. 23号待预估测试集提取方法【提分关键】

atest_logs = pd.read_table(path+'final_select_test_request.out',names=['aid','request_set'])
logs = []
for item in tqdm(atest_logs[['aid','request_set']].values,total=len(atest_logs)):
    for it in item[-1].split('|'):
        temp=list(item[:-1])
        it=it.split(',')
        temp.append(int(it[0]))
        temp.append(float(it[1]))
        logs.append(temp)
del atest_logs
gc.collect()
logs=pd.DataFrame(logs)
logs.columns=['aid','aid1','aid_location']

2. 24号待预估测试集提取方法

btest_logs = pd.read_table(path+'Btest_select_request_20190424.out',names=['aid','request_set'])
logs = []
for item in tqdm(btest_logs[['aid','request_set']].values,total=len(btest_logs)):
    for it in item[-1].split('|'):
        temp=list(item[:-1])
        it=it.split(',')
        temp.append(int(it[0]))
        temp.append(float(it[1]))
        logs.append(temp)
del btest_logs
gc.collect()
logs=pd.DataFrame(logs)
logs.columns=['aid','aid1','aid_location']

基本特征构造

此处基本特征并不会直接用于训练,而是用来辅助提取特征。训练集和测试集的基本特征提取方式一致

columns = ['aid','goods_id','account_id','aid_size','industry_id','goods_type']
logs = logs.reset_index()
for col in columns:
    result = logs.groupby([col], as_index=False)['index'].agg({
        col+'_cnts'      : 'count'
        })
    btest = btest.merge(result, on=[col], how='left')

23号训练集提取【提分关键】

这里我们做了一件事情,从23号非待预估广告的请求日志和竞价队列中提取23号的数据作为训练集,虽然没有是否曝光的标签,我们退而求其次的选择了第一条非过滤的为曝光,因为竞价队列的顺序与广告基本评分有关。

# 进行打标
log_df = pd.read_table(path+'test_tracklog_20190423.last.out', names=['aid_request','request_time','uid','aid_location','aid_info'])
items=[]
for item in tqdm(log_df['aid_info'].values,total=len(log_df)):
    temp=[]
    find=False
    for its in item.split(';'):
        it=its.split(',')
        if int(it[-1])==0 and find is False:
            temp.append(','.join(it+['1']))
            find=True
        else:
            temp.append(','.join(it+['0']))

    items.append(';'.join(temp))

log_df['aid_info']=items

# 提取每列数据
logs_item = []
for item in tqdm(log_df[['aid_location','aid_info']].values, total=len(log_df)):
    for it in item[-1].split(';'):
        temp=list(item[:-1])
        it=it.split(',')
        temp.append(int(23))
        temp.append(int(it[0]))
        temp.append(int(it[5]))
        temp.append(int(it[6]))
        if temp[-1]==1:
            logs_item.append(temp)
        else:
            logs_item.append(temp)
del log_df
gc.collect()
logs=pd.DataFrame(logs_item)
del logs_item
gc.collect()
logs.columns=['aid_location','day','aid','fliter','isExp']

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 代码地址:
  • 代码解析-Part1
  • 预处理部分
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档