广告点击率预测问题初探

本文介绍了作者在广告点击率预测竞赛中学到的数据处理和特征工程技巧,包括时间数据处理、类别数据优化、新特征构造、贝叶斯平滑的转化率计算等,并探讨了建模过程中的单模型与融合模型应用。
摘要由CSDN通过智能技术生成

广告点击率预测问题初探
国庆7天参加了一个广告点击率预测的小竞赛,作为只看过机器学习实战的小白,纯粹抱着学习的心态去开眼,果然被大神按在地上虐呢,不过也学到了很多知识。感谢很多大佬都开源并分享了他们的竞赛经验,帮助我入了一点点门。下面的代码借鉴了几位大佬的分享,不妥删。
一、数据处理
数据有train.txt 训练集和test.txt测试集。每一行数据为一个样本,可分为5类数据,包含基础广告投放数据、广告素材信息、媒体信息、用户信息和上下文信息。训练集共1001650条数据,其中‘click’字段为要预测的标签,其它34个字段为特征字段。测试集共40024条数据,与训练集文件相比,测试集文件无‘click’字段,其它字段同训练集。
之前我以为机器学习就是把构造好的数据集丢到模型里训练,通过调参提升效果;现在知道了这种业务问题需要对业务和数据有足够的理解,然后通过数据预处理、特征构造等方法使模型能发挥比较好的效果。这就是特征工程的工作。
1、首先,我学到了使用pandas库在jupyter notebook上进行数据观察和初步处理,一些基本操作如下:

# 载入数据
import pandas as pd
train = pd.read_csv('train.txt',sep='\t')
test = pd.read_csv('test.txt',sep='\t')
data = pd.concat([train,test],axis=0,ignore_index=True)

# 观察全局数据
data.head()	#查看数据开头5行
data.columns	#数据列标题(特征名称)
data.index	#数据行索引
data.nunique()	#查看数据各特征的类别分布
data.shape	#数据行、列数

# 观察局部数据
data['location'].unique()	#location的不同类别
data['location'].value_counts()		#location不同类别的样本数
data.groupby('location')['click'].agg({'mean','count'})	#location不同类别的个数及平均点击率
data.groupby('location')['cityID'].agg('unique')	#location和cityID是否有交叉

# 处理数据
data=data.fillna(-1) #将空值设为-1
data.sort_values('time')	#按时间排序
data['click']=data['click'].apply(lambda x:int(x))	#对click列中每一个元素进行操作
data.drop('cityID',axis=1,inplace=True)	#删除某列
del data['cityID']	#同上
data.to_csv('result.txt')	#将数据写入文件

总结来说,这次对数据的处理有以下要点:
(1)时间数据:一般数据集中给出的都是时间戳,要把它们转化为年月日时等,然后再观察时间的周期性特点(即不同时间的广告点击情况)。

# 时间转化
init_time = data['time'].min() 
data['day'] = ((data['time'].values - init_time) / (3600 *24))/astype(int)
data['hour'] =( (data['time'].values - init_time - data['day'].values * 3600 * 24) / 3600).astype(int)
# 或者
# data['day'] = data['time'].apply(lambda x: int(time.strftime("%d", time.localtime(x))))
# data['hour'] = data['time'].apply(lambda x: int(time.strftime("%H", time.localtime(x))))

# 随机挑选三天观察hour周期性
data.loc[data['day'] == 0].groupby('hour')['click'].agg({'mean','count'})
data.loc[data['day'] == 1].groupby('hour')['click'].agg({'mean','count'})
data.loc[data['day'] == 2].groupby('hour')['click'].agg({'mean','count'})

# 观察day周期性
data.groupby('day')['click'].agg({'mean','count'})

(2)只有一个类别的数据:舍弃,因为这些数据对结果不起什么作用。
ÿ

  • 5
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值