广告点击率预测问题初探
国庆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)只有一个类别的数据:舍弃,因为这些数据对结果不起什么作用。
ÿ