使用python进行广告点击率的预测的实现

论坛 期权论坛 脚本     
niminba   2021-5-23 04:09   2053   0

当前在线广告服务中,广告的点击率(CTR)是评估广告效果的一个非常重要的指标。 因此,点击率预测系统是必不可少的,并广泛用于赞助搜索和实时出价。那么如何计算广告的点击率呢?

广告的点击率 = 广告点击量/广告的展现量

如果一个广告被展现了100次,其中被点击了20次,那么点击率就是20%。

今天我们就来动手开发一个移动广告点击率的预测系统,我们数据来自于kaggle,数据包含了10天的Avazu的广告点击数据。

数据

你可以在这里下载移动广告点击数据,由于总数据量达到了4千多万条,数据量过于庞大,为了不影响我们的计算速度,因此我们要从中随机抽样100万条数据,同时我们要对数据的相关字段类型进行重置,这有助于我们以后的计算以及可视化。

types_train = {
  'id': np.dtype(int), 
  'click': np.dtype(int),    #是否点击,1表示被点击,0表示没被点击
  'hour': np.dtype(int),    #广告被展现的日期+时间
  'C1': np.dtype(int),     #匿名分类变量
  'banner_pos': np.dtype(int), #广告位置
  'site_id': np.dtype(str),   #站点Id
  'site_domain': np.dtype(str), #站点域名
  'site_category': np.dtype(str), #站点分类
  'app_id': np.dtype(str),    # appId 
  'app_domain': np.dtype(str),  # app域名
  'app_category': np.dtype(str), # app分类
  'device_id': np.dtype(str),   #设备Id
  'device_ip': np.dtype(str),   #设备Ip
  'device_model': np.dtype(str), #设备型号
  'device_type': np.dtype(int),  #设备型号
  'device_conn_type': np.dtype(int),
  'C14': np.dtype(int),  #匿名分类变量
  'C15': np.dtype(int),  #匿名分类变量
  'C16': np.dtype(int),  #匿名分类变量
  'C17': np.dtype(int),  #匿名分类变量
  'C18': np.dtype(int),  #匿名分类变量
  'C19': np.dtype(int),  #匿名分类变量
  'C20': np.dtype(int),  #匿名分类变量
  'C21':np.dtype(int)  #匿名分类变量
}
 
n = 40428967 #数据集中的记录总数
sample_size = 1000000
skip_values = sorted(random.sample(range(1,n), n-sample_size)) 
parse_date = lambda val : pd.datetime.strptime(val, '%y%m%d%H')
 
with gzip.open('./data/ctr/train.gz') as f:
  train = pd.read_csv(f, parse_dates = ['hour'], date_parser = parse_date, dtype=types_train, skiprows = skip_values)
print(len(train))
train.head()

特征工程

接下来我们要做的就是数据的探索性分析(EDA)和特征工程(Feature Engineering),首先我们要确定哪些目标变量,哪些是特征变量,根据kaggle中对数据的描述信息中我们可知,目标变量就是"click"字段它表示广告是否被点击过(1表示被点击,0未被点击),其余所有的字段都是特征变量。在特征变量中C1,C14~C21表示匿名的分类变量(我们不知道它的含义),其余的特征变量都是和站点,app,设备相关的变量。我们搞清了变量的大概含义以后,接下来我们要分析一下目标变量"click",首先看看它的数据分布情况:

print(train['click'].value_counts())
print()
print(train['click'].value_counts()/len(train))
 
sns.countplot(x='click',data=train, palette='hls')
plt.show()

  

 在“click”变量的统计数据中,点击的数量大约占17%,未点击的数量大约占83%。也就是说广告的平均点击率大概是在17%左右。

接下来我们来分析另外一个关键的特征变量:hour,它可能表示广告被展现的日期+时间,我们要看看不同的日期和时间对广告点击量的影响:

print(train.hour.describe())
 
train.groupby('hour').agg({'click':'sum'}).plot(figsize=(12,6))
plt.ylabel('点击量')
plt.title('时间和点击量')

由上面的统计结果可知数据的开始时间是2014-10-21 00:00:00,结束时间是2014-10-30 23:00:00,一共10天,点击量高峰的时刻是在10月22日和10月28日这两天,10月24日点击量最低。

对Hour的特征工程

我们知道hour变量包含了具体的日期和时间,接下来我们想知道点击量和具体的时间是什么关系,此时我们忽略日期,只关注具体时间和点击量。接下来我们从hour变量中抽取时间,然后查看时间和点击量之间的关系:



分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1060120
帖子:212021
精华:0
期权论坛 期权论坛