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

2019腾讯广告算法大赛-复赛完整代码(冠军)

作者头像
Coggle数据科学
发布2019-08-29 16:35:01
8150
发布2019-08-29 16:35:01
举报
文章被收录于专栏:Coggle数据科学

代码地址:

bettenW/Tencent2019_Finals_Rank1st​github.com

数据地址:

链接:https://pan.baidu.com/s/1O5aOkQ_gVOuT1jkC8NFb9g

提取码:biv9

方案介绍

鱼遇雨欲语与余:2019腾讯广告算法大赛-冠军之路​zhuanlan.zhihu.com

鱼遇雨欲语与余:2019腾讯广告算法大赛方案分享(冠军)​zhuanlan.zhihu.com

代码解析-Part1

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

预处理部分

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

构造训练集

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

代码语言:javascript
复制
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)

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

代码语言:javascript
复制
# 构造训练集
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号待预估测试集提取方法【提分关键】

代码语言:javascript
复制
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号待预估测试集提取方法

代码语言:javascript
复制
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']

基本特征构造

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

代码语言:javascript
复制
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号的数据作为训练集,虽然没有是否曝光的标签,我们退而求其次的选择了第一条非过滤的为曝光,因为竞价队列的顺序与广告基本评分有关。

代码语言:javascript
复制
# 进行打标
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']

特征提取部分【提分关键】

模型训练部分

这一部分主要分为训练数据准备、lightgbm模型、五折交叉验证。

竞赛社区(数据竞赛的一站式服务

就在前不久我和Datawhale的晶晶,还有杰少一起计划推出有关数据竞赛的高质量社区,并邀请了圈内大咖,其中包括Kaggle上的Grand Master,也有天池的数据科学家,还有顶会科研大佬。筹备社区前,我们也一直考虑如何提供更好的体验和学习服务,为此做出大量的筹划,力求为学习者提供数据竞赛的一站式服务。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-08-23,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 代码地址:
  • 数据地址:
  • 方案介绍
  • 代码解析-Part1
  • 预处理部分
  • 特征提取部分【提分关键】
  • 模型训练部分
  • 竞赛社区(数据竞赛的一站式服务)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档