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

2019-08-29 16:35:01 浏览数 (1)

代码地址:

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,也有天池的数据科学家,还有顶会科研大佬。筹备社区前,我们也一直考虑如何提供更好的体验和学习服务,为此做出大量的筹划,力求为学习者提供数据竞赛的一站式服务。

0 人点赞