代码地址:
bettenW/Tencent2019_Finals_Rank1stgithub.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']
- 日志数据整合构造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,也有天池的数据科学家,还有顶会科研大佬。筹备社区前,我们也一直考虑如何提供更好的体验和学习服务,为此做出大量的筹划,力求为学习者提供数据竞赛的一站式服务。