精华内容
下载资源
问答
  • 点击率预测

    2019-06-12 15:48:54
    点击率预测 一、 流程 1. 预处理 点击数据:海量,异构,不均匀,相依(数据之间存在依赖性),低质(比如看60min视频只看了3min) 豆瓣数据预处理: 对于400位用户打分的选择统计量(max,min,average等放入特征...

    点击率预测

    一、 流程

    1. 预处理

    • 点击数据:海量,异构,不均匀,相依(数据之间存在依赖性),低质(比如看60min视频只看了3min)
    • 豆瓣数据预处理:
      • 对于400位用户打分的选择统计量(max,min,average等放入特征)
    • 用户数据预处理:
    • 视频数据预处理:
      • 对于演员,获取出来,采用one-hot编码
    • 观影数据预处理:
      • 产生正例负例数据:观看时长大于5min为正例,否则为负例
      • 基于矩阵分解计算用户-电影之间的偏好程度
        • 基于上述产生的正例负例数据,构造用户-电影点击矩阵
        • 运用NMF(非负矩阵分解)计算用户-电影相似度
      • 基于相关电影计算用户-电影之间的偏好程度
        • 根据以往看过的电影,根据待推荐电影和以往电影的相似度,计算待推荐电影的权重。

    2. 特征选择

    • 选择、组合特征

    3. 点击率预测

    • 需要效率很高

    4. 视频投放

    二、 研究现状

    • 集成学习 :

      • bagging:
      • boosting
    • 梯度提升决策树(GDBT):

      • 串行构建回归树:基于之前所有树的结论和残差【通过减少残差来提升准确率】
    • 因子模型(FM)

    • 用户点击行为:近似的呈现出Power Law的特征

    • 对新来的用户,没有观影数据,将大家都看的视频推荐给他。

    三、实验

    • 随机森林+逻辑回归 精度最高
    • 可以针对不同层次的用户,选择层次推荐比非层次推荐好上一倍。

    四、 总结

    • 点击率预估就是要克服数据稀疏的问题!!
    展开全文
  • 在搜索广告背后,一个关键技术就是点击率预测。预估点击率 (predict the click-through rate, pCTR) 是指对某个广告将要在某个情形下展现前, 系统预估其可能的点击概率。如果广告有很大概率被点击就向该用户展示广告...

    目录研究背景

    数据预处理

    数据探索

    构建模型与评估

    反思

    1.研究背景

    1.1问题的提出

    搜索广告是近年来互联网的主流营收来源之一。在搜索广告背后,一个关键技术就是点击率预测。预估点击率 (predict the click-through rate, pCTR) 是指对某个广告将要在某个情形下展现前, 系统预估其可能的点击概率。如果广告有很大概率被点击就向该用户展示广告,如果概率低,就不展示。

    1.2研究意义

    本项目,旨在通过给定的广告信息和用户信息来预测一个广告被点击与否。通过建立合理的广告点击率预测模型,可以帮助平台预估未来收益,从而进行和广告主的合作决策。对于广告主来说,需要通过点击率预测来进行价格评定,预估自己广告的竞价。

    1.3 研究目标

    原始数据为使用的是kaggle的一个竞赛数据,具体官网地址为:https://www.kaggle.com/c/avazu-ctr-prediction​www.kaggle.com

    因官网提供的数据比较大,压缩之后的已经达到1G以上,本项目采样了部分数据(使用前400000个样本)。

    分析目标是:借助数据,分析不同投放位置等因素对广告点击率的影响。

    建立点击率预测模型,帮助平台与广告主制定相应合作策略提供一定依据。

    1.4 研究思路

    1.4.1 首先对数据进行预处理及探索

    在进行项目之前,我们需要对数据特征有一个比较清晰的认识。本项目数据不存在空值,数据共计24个特征,全部为类别型特征,有标签(click)。接下来需要对重要的数据特征进行探索,包括对特征的解释及特征之间关联信息的提取。

    1.4.2 数据展示

    本部分的意义在于对分析结果的可视化。数据集中的特征大多被编码为未知字符,需要可视化各特征与目标字段间的关系,便于理解与运用。

    CTR:广告点击通过率 = 实际点击次数/广告展示量

    1.4.3 模型的构建与评估

    我们调用 scikit-learn 库中的决策树和XGBoost等算法对模型进行训练,并采用 gridsearchCV 交叉验证的方法选择最优参数组合。由于本数据集正负样本分布及不平衡,我们使用 F1-score 对模型进行评分。并且使用 Cluster-Based Approach 进行 under-sampling对多数类样本进行抽样,使用抽样后的数据集进行训练。

    2. 数据预处理

    2.1 数据特征解释

    本次使用的数据集一共包含24个特征,各特征所代表的含义如下:id:点击记录

    click:是否点击广告(目标特征)

    hour:数据收集时间(格式为YYMMDDHH)

    banner_pos:广告投放位置

    site_id:广告客户网站

    site_domain:网站某种大类(游戏&电商)

    site_category:网站某种小类(手游&零食)

    app_id:广告提供商APP

    app_domain:APP大类(社交类&内容类)

    app_category:APP小类(微信&头条)

    device_id:设备硬件地址(每个设备唯一)

    device_ip:设备互联网地址(可通用)

    device_model:设备型号

    device_type:设备类型(手机/电脑)

    device_conn_type: 设备连接类型

    C1& C14-21:匿名分类变量

    2.2 数据获取与解析

    利用 python 的 pandas 包中 read_csv() 函数对csv格式的数据集文件进行读取,查看前 5 行数据,结果如下:

    接下来我们查看数据集的详细信息 info():

    从 info 中可以看出,该数据集一共约40万行,site/app及部分device特征被编码为object对象,其他特征虽然是类别型,但是被编码为数值型。

    2.3 数据清洗

    2.3.1 删除id

    检查所有特征之后,发现 id 特征数值全部不重复,因此该特征无价值,直接删除。

    2.3.2 数据类型转换

    数据集特征解释中 hour 列为数据收集时间,这里我们需要借助 pandas 中的 to_datetime() 函数将该列转换为日期格式。

    3. 数据探索

    3.1 基本情况分析

    在上一节中我们已经完成了原始数据集的数据清洗工作,在本节中我们将对数据集的各种特征进行探索分析。首先,我们分类别查看数据集中所有特征:

    由此可知,site_id / site_domain / app_id / device_id / device_ip /device_model 这六个特征存在很多低频率类别。

    3.2 数据可视化

    3.2,1 标签分布分析

    接下来,分析目标特征click,对其分布进行可视化:

    负样本(未点击): 83.41% ;正样本(点击): 16.59%

    通过上述的数据,可以很容易看出被点击的次数要远小于没有被点击的次数。所以这个数据是不平衡的数据,评价指标使用 F1-score

    3.2.2 广告投放位置与点击率间关系

    从直观上来看对广告点击的结果影响比较大,所以做一下可视化的分析并更好地理解这个特征。

    从这个结果里可以看出,该特征的范围是0-7,但中间不包含3和6,有可能是我们的训练数据不全。

    投放到0,1位置上的点击率较高。

    3.2.3 网站类别与点击率间关系

    site类别特征中,只有网站类别分类较少,共21类。site_id 和 site_domain的分类都在一千以上,不适合可视化。先来了解一下网站类别各类的占比,表格如下:

    接下来进行可视化,如下图所示:

    对照上面的表格,可知 28905ebd / 3e814130 / f028772b 类型的网站广告点击率较高。(site_category没有细化到每个特定的网站,所以无法计算CTR)

    3.2.4 APP类别与点击率间关系

    app类特征中 app_category 对应广告主,这里重点研究一下这个特征,看是否跟标签有比较强的关系。 为了理解这一点,对于每一种类型的app_category值,使用 seaborn 画出 histogram,展示每一种取值条件下样本被点击或者没有被点击的概率,效果图如下:

    由此可知,07d7df22 类app广告点击数量最多;8ded1f7a 类app广告点击率最大。

    3.2.5 device相关特征与点击率间关系

    device类别中只有device_type 和 device_conn_type类别数量在千以下,计算CTR后可视化效果如下:

    由此可知,device_type 与device_conn_type对于click的影响类似,并且从解读上说,device_type的可解释性较差,后期考虑对其进行处理或删除。

    3.3 特征工程

    3.3.1 二值化device

    在上一节进行可视化时发现 device_id 近80%以上的数据都为22208,因此考虑对此特征进行二值化,并使用 pandas 的 df.drop() 函数将原特征丢弃。

    3.3.2 相关性分析

    本数据集只涉及类别型变量,将所有变量使用 sklearn.preprocessing 中的 LabelEncoder 编码后查看特征间相关性。

    由此可知,C1 与 device_type线性相关性非常强,C14 与 C17线性相关性非常强。

    接下来查看各特征与标签click间的关系:

    由此可知,C16与click间的相关性最大。C21/C17/C14 和click相关性太小,并且C14和C17间线性相关性极强,考虑使用 df.drop 直接删除。如果内存计算量允许,可以将其保留。

    3.3.3 过滤出现频率较低的类别

    由 3.1 节可知,site_id/ app_id/site_domain/ device_model类别较多,考虑将出现频率较低的类别合并。site_id 将频率低于20的类别合并为一类

    site_domain 将频率低于20的类别合并为一类

    app_id 将频率低于20的类别合并为一类

    device_model 将频率低于200的类别合并为一类

    3.3.4 特征构造

    由3.3.2小节的相关性分析可知各特征与目标特征间的相关性,我们可将部分相关性较弱,但分布相近的特征合并为新特征。C15自身与click相关性较弱,但和C16的分布类似,考虑合并。

    2. C1和device_type间相关性极强,且各自与click的相关性较弱,考虑合并。

    4. 构建模型

    4.1 采用 Cluster-Based Approach 对多数类样本进行抽样

    以分群技术为基础进行抽样,可解决挑选多数类别样本不具代表性的缺点。我们使用 K-Means 聚类将原数据集分成5类,按照每个群集中不同多数类样本的数量按比例进行抽取,使最终抽出的样本子集,多数类:少数类数量 = 2:1。

    处理前模型训练结果如下:

    处理后模型训练结果如下:

    由此可见,对于少数类样本的Recall有显著提升。

    4.2 模型选择

    数据集所有特征均为类别向量,如果使用Logistic等模型,需要使用独热编码,数据维度暴涨。我们优先考虑树模型避免计算量过大。

    4.2.1 决策树(78%)

    该模型使用决策树作为预测模型,使用网格搜索寻找最优参数。模型结果如下:

    绘制ROC曲线如下:

    4.2.2 XGBoost(79%)

    该模型使用XGBoost作为预测模型,根据 ①通用参数 ②Booster(树参数)③学习目标参数分别进行网格搜索调参。最后将各最优参数进行组合,进一步调整搜索间隔,并将学习率降低,基分类器数量增大。模型结果如下:

    绘制ROC曲线如下:

    5. 反思仅取样了部分数据集,导致信息缺失较多使模型最终表现不佳。

    本抽样数据集中对hour字段的可用信息较少,仅抽取小时进行计算,并没有分析点击率与时间之间的关系。事实上如果将时间信息考虑进去,应该对模型训练有很大提升。

    可以使用独热编码配合逻辑回归L1正则进行特征选择,进一步提升模型在测试集中的表现。

    对于各特征可以进一步深入挖掘,查看点击率与特征间的其他关系。

    展开全文
  • 点击率预测的贝叶斯平滑

    万次阅读 多人点赞 2017-10-24 20:42:39
    概述 电商领域中经常需要计算或预测一些转化率指标,如最...以商品点击率预测为例,CTR的值等于点击量(Click)除以曝光量(Impression或Exposure)。以rr表示点击率, r=CI(1)r=\frac{C}{I} \tag{1}. 但在实际应

    背景

    电商领域中经常需要计算或预测一些转化率指标,如最典型的CTR(点击率,Click-Through Rate)。这些转化率可以是模型的预测值,也可以作为模型的特征(feature)使用。以商品点击率预测为例,CTR的值等于点击量(Click)除以曝光量(Impression或Exposure)。以rrr表示点击率,

    r=CI(1)r=\frac{C}{I} \tag{1}r=IC(1).

    但在实际应用过程中会碰到两个问题:

    • 新商品点击率的预测与计算
      对于新上线的商品,其曝光为0,点击量也为0,此时这件商品的CTR应该设为0还是赋一个初始值?

    • 不同商品点击率之间的比较
      有两件商品A和B,其点击率分别为rA=510r_A=\frac{5}{10}rA=105rB=50100r_B=\frac{50}{100}rB=10050rA=rBr_A=r_BrA=rB,但商品A的曝光只有10次,商品B的曝光有100次,这样比较是否合理?

    第一个问题,初始值设0是可以的,但不太合理。当CTR作为特征使用时,表示这个商品完全没有点击,不太符合日常推断,通常是赋一个大于0的初始值。第二个问题,不合理,通常会认为曝光次数少的商品权重应该低一些。

    解决以上两个问题可以使用平滑的技术解决。最简单的方法是在计算CTR的公式中分子分母同时加上一个数,加上之后可避免这两个问题。

    r=C+aI+b(2)r = \frac{C+a}{I+b} \tag{2}r=I+bC+a(2)

    但(2)式中aaabbb的值如何确定? 这两个数可以人为设定,但若设置得不合理会出现数据被放大的情况。本文介绍如何通过历史数据来计算有统计意义的aaabbb,即贝叶斯平滑。

    贝叶斯平滑

    贝叶斯平滑的思想是给CTR预设一个经验初始值,再通过当前的点击量和曝光量来修正这个初始值。如果某商品的点击量和曝光量都是0,那么该商品的CTR就是这个经验初始值;如果商品A和商品B的曝光量差别很大,那么可以通过这个经验初始值来修正,使得曝光量大的商品的权重增大。

    贝叶斯平滑就是确定这个经验值的过程。贝叶斯平滑是基于贝叶斯统计推断的,因此经验值计算的过程依赖于数据的分布情况。

    贝叶斯平滑的推导涉及贝叶斯参数估计,如果对贝叶斯参数估计不熟悉,可以先参考这篇文章:贝叶斯参数估计的理解及其在电商算法中的应用

    点击率贝叶斯平滑的假设

    对于一件商品或一条广告,对于某次曝光,用户要么点击,要么没点击,这符合二项分布。因此下文中对于点击率类的贝叶斯平滑,都是基于以下假设:对于某件商品或广告XXX,其是否被点击是一个伯努利分布(Bernoulli)

    X∼Ber(r)(3)X \sim Ber( r) \tag{3}XBer(r)(3)

    其中XXX表示某个广告是否被点击,点击取1,未被点击取0,rrr是某件商品被点击的概率,即点击率

    对于不符合二项分布的比值类数据,也可以通过贝叶斯参数估计的方法计算平滑参数,但是数据分布假设需要修改,后文有说明。

    点击率的极大似然估计

    在(3)式的假设下,可以使用极大似然法计算出点击率的估计值r^\hat{r}r^。从用户日志中随机抽取nnn条记录,对任一条记录iii都有

    Xi∼Ber(r)(4)X_i \sim Ber( r) \tag{4}XiBer(r)(4)

    那么所有记录的点击数的联合概率密度就是上式的连乘。将连乘后的式子对rrr求导,并令其等于0,可以解出rrr的值r^\hat{r}r^r^\hat{r}r^就是点击率的极大似然估计。当某件商品的点击次数或曝光量等于0时,可以用r^\hat{r}r^当成它的初始值。它解决了最开始提出的第一个问题,但没有解决第二个问题。

    上述r^\hat{r}r^的计算没有用到历史信息。所谓历史信息是指:虽然我们不知道rrr的具体取值,但是可以知道rrr取值的范围,更精确地,我们可以假设rrr服从某个分布。要将这些信息融入到rrr的估计中需要用到贝叶斯参数估计。关于贝叶斯参数估计的具体内容可以参考:贝叶斯参数估计的理解及其在电商算法中的应用

    点击率的贝叶斯估计

    在贝叶斯框架下,我们假设点击率rrr服从某个分布:

    r∼π(r)(5)r \sim \pi(r) \tag{5}rπ(r)(5)

    因为这是基于经验的,这个分布称为先验分布。贝叶斯参数估计可以同时解决最开始提出的两个问题。其过程是基于经验或历史数据先给出一个rrr的估计值,然后基于现有的数据在这个估计值上修正,得到最终的点击率估计,此时的估计值已经是修正过的。更美好的是我们可以分离出修正参数(即(2)式中的aaabbb)。

    既然有先验分布,就有后验分布rrr的后验分布记作π(r∣x)\pi(r|x)π(rx)。其中xxx表示输入数据或特征,对于点击率预测,xxx就是点击次数和曝光量。因为已经看到了数据,才确定rrr的分布,因此叫做『后验』分布。**贝叶斯估计的实质就是求后验分布。**即基于当前的点击次数和曝光量,求点击率的分布;而未看到数据之前点击率的分布是π(r)\pi(r)π(r)。下面讲解如何计算后验分布π(r∣x)\pi(r|x)π(rx).

    贝叶斯估计的过程可以简单认为:

    用历史数据根据π(r)\pi(r)π(r)估计rrr,记作r^history\hat{r}_{history}r^history;用当前数据根据π(r∣x)\pi(r|x)π(rx)估计rrr,记作r^current\hat{r}_{current}r^current,然后用r^history\hat{r}_{history}r^history修正r^current\hat{r}_{current}r^current

    平滑系数的计算

    rrr的后验分布π(r∣x)\pi(r|x)π(rx)是个概率密度函数,无法知道rrr确切的值。需要求出最接近真实情况的rrr需要损失函数来约束。

    适用于点击率的损失函数有:

    • L(r^,r)=(r^−r)2L(\hat{r}, r) = (\hat{r} - r)^2L(r^,r)=(r^r)2
    • L(r^,r)=∣r^−r∣L(\hat{r}, r) = |\hat{r} - r|L(r^,r)=r^r

    贝叶斯参数估计的过程可以简单描述为:r^\hat{r}r^,使得损失函数在rrr的后验分布上的期望最小。

    这句话的数学公式是:

    arg⁡min⁡∫L(r,r^)π(r∣x) dr=arg⁡min⁡EπL(r,r^)(6)\arg \min \int L(r, \hat{r}) \pi(r|\boldsymbol{x})\ dr = \arg \min E_{\pi} L(r, \hat{r}) \tag{6}argminL(r,r^)π(rx) dr=argminEπL(r,r^)(6)

    整个过程的推导可以参考:贝叶斯参数估计的理解及其在电商算法中的应用

    要计算上式需要知道π(r∣x)\pi(r|x)π(rx)的形式,然而π(r∣x)\pi(r|x)π(rx)的形式一般不知道的,但是可以知道π(r)\pi(r)π(r)的形式(经验值嘛,我们指定的,例如点击率就是伯努利分布)。此外,数据的分布我们也是知道的(通过样本得知),其概率密度函数(pdf)记为f(x∣r)f(x|r)f(xr),表示数据的分布跟参数rrr有关,rrr是要求解的参数,在这里就是点击率。

    这时可以根据贝叶斯公式计算出π(r∣x)\pi(r|x)π(rx)

    π(r∣x)=f(x∣r)π(r)f(x)(7)\pi(r|\boldsymbol{x}) = \frac{f(\boldsymbol{x}|r)\pi(r)}{f(\boldsymbol{x})} \tag{7}π(rx)=f(x)f(xr)π(r)(7)

    其中,

    f(x)=∫0∞f(x∣r)π(r)dr  (边缘概率密度定义)f(\boldsymbol{x}) = \int_0^\infty f(\boldsymbol{x}|r) \pi(r) dr\ \text{ (边缘概率密度定义)}f(x)=0f(xr)π(r)dr  (边缘概率密度定义)

    上式好复杂,但索性一些常见的分布都可以求出上式积分的具体形式。然而实际计算时通常不用去计算积分,因为满足一定条件,π(r)\pi(r)π(r)π(r∣x)\pi(r|\boldsymbol{x})π(rx)有一样的形式π(r)\pi(r)π(r)是已知的,如果形式一样,π(r∣x)\pi(r|\boldsymbol{x})π(rx)也就容易求得了,这个条件就是共轭。下面介绍共轭先验的概念。

    共轭先验:如果找到一个π(r)\pi(r)π(r),它是f(x∣r)f(x|r)f(xr)的共轭先验,那么rrr的后验分布π(r∣x)\pi(r|x)π(rx)和先验分布π(r)\pi(r)π(r)会有一样的形式。

    『轭』是指驾车时套在牲口脖子上的曲木。古代拉扯的牲口通常有两只,因此轭是连接两只牲口的工具。在这里共轭是指π(r)\pi(r)π(r)π(r∣x)\pi(r|x)π(rx)通过f(x∣r)f(x|r)f(xr)联系起来了。

    之前假设广告是否点击服从伯努利分布,参数为rrr;对于点击次数,服从的是二项分布,即f(C,I∣r)∼Bin(r)f(C, I|r) \sim Bin(r)f(C,Ir)Bin(r)二项分布的共轭先验是Beta分布,Beta分布的参数是α\alphaαβ\betaβ,即π(r)=Beta(α,β)\pi(r) =Beta(\alpha, \beta)π(r)=Beta(α,β)。根据共轭先验的定义,rrr的后验分布π(r∣x)\pi(r|x)π(rx)的形式跟其先验分布π(r)\pi(r)π(r)一样,即π(r∣x)=Beta(α′,β′)\pi(r|x) = Beta(\alpha', \beta')π(rx)=Beta(α,β)

    对于点击率预测,求出π(r∣x)\pi(r|x)π(rx),带入公式(6),当L(r^,r)=(r^−r)2L(\hat{r}, r) = (\hat{r} - r)^2L(r^,r)=(r^r)2时,
    r^=C+αI+α+β(8)\hat{r} = \frac{C + \alpha}{I + \alpha + \beta} \tag{8}r^=I+α+βC+α(8)

    (8)式就是点击率估计(平滑)的最终形式。该式的具体求解过程可以参考贝叶斯参数估计最后二项分布的例子。其中CCCIII就是点击次数和曝光量,α\alphaα即为公式(2)中的aaaα+β\alpha + \betaα+β是公式(2)中的bbbα\alphaαβ\betaβ是从历史数据中得到的

    上面的内容给出了为什么很多文章会假设点击率服从Beta分布的理由,因为最终的平滑的因子是Beta分布(先验分布)中的两个参数。那么如何计算(估计)这两个参数?

    贝叶斯平滑因子的工程实践

    综上,贝叶斯平滑的最终落脚点是要估计Beta分布(点击率rrr服从的分布)中的参数α\alphaαβ\betaβ,带入(8)式,得到平滑后的点击率。下面给出比较直观的矩估计的方法。

    矩估计

    Beta分布的期望是E(X)=αα+βE(X) = \frac{\alpha}{\alpha + \beta}E(X)=α+βα,方差是D(X)=αβ(α+β)2(α+β+1)D(X) = \frac{\alpha \beta}{(\alpha+\beta)^2 (\alpha + \beta + 1)}D(X)=(α+β)2(α+β+1)αβ. 我们可以用样本的均值代替期望,样本的方差代替总体的方差,此时就可以解出α\alphaαβ\betaβ的值。Xˉ\bar{X}Xˉ是样本均值,S2S^2S2是样本方差,则:
    α=Xˉ(Xˉ(1−Xˉ)S2−1)(9)\alpha = \bar{X}\left(\frac{\bar{X}(1-\bar{X})}{S^2}-1 \right) \tag{9}α=Xˉ(S2Xˉ(1Xˉ)1)(9)
    β=(1−Xˉ)(Xˉ(1−Xˉ)S2−1)(10)\beta= (1-\bar{X})\left(\frac{\bar{X}(1-\bar{X})}{S^2}-1 \right) \tag{10}β=(1Xˉ)(S2Xˉ(1Xˉ)1)(10)

    这里的样本指的就是我们能观察到的商品的点击情况。

    工程实践

    实际操作时可以连续取一段时间的数据,比如一周,然后在每天的数据中计算每件商品或广告的点击率,之后求出这些点击率的均值和方差,带入公式(9)和公式(10),可以得到每天的α\alphaαβ\betaβ. 最后求这段时间α\alphaαβ\betaβ的均值作为最终的平滑参数。

    也可以每天计算前一天的α\alphaαβ\betaβ,用于当天的点击率预测平滑。

    实际应用时根据历史数据得到的α\alphaαβ\betaβ可以帮助确定平滑参数的大致范围,防止设置参数时偏离过大。通常可以调整α\alphaαβ\betaβ的范围达到预期的效果。

    下图是某件商品在两周时间内的点击率。黄色线是每天根据点击次数CCC和曝光量III计算得到的真实点击率;蓝色线是根据一周的历史数据计算得到的α\alphaαβ\betaβ带入公式(8)得到的平滑后的点击率;绿色线是自定义平滑参数的点击率,a=50a=50a=50b=200b=200b=200,设置得比较夸张。可以看到如果平滑参数设置的不合理,会放大数据的表现,有时候甚至会扭曲数据的走势,数据预处理时需要考虑这样的情况。

    点击率贝叶斯平滑效果

    非二项分布的贝叶斯平滑

    公式(8)的结论适用于数据是二项分布的情况,如点击率。对于不是二项分布的数据公式(8)不适用。如果数据不是二项分布,那么其先验概率就不是Beta分布了。比如某件商品一天的点击量与一周的点击量的比值,这个数据不符合二项分布,因此不适用公式(8)。但这个数据有可能是高斯分布。如果数据是高斯分布,那么其先验概率π(r)\pi(r)π(r)是逆Gamma分布(invers Gamma)分布,进而其后验概率π(r∣x)\pi(r|x)π(rx)也是逆Gamma分布,此时公式(8)会有不一样的形式,视数据的具体情况而定。

    展开全文
  • 点击率预测 预测领先广告平台上的点击概率。
  • 多媒体广告的深入点击率预测
  • RecSys:计算广告推荐系统机器学习(机器学习)点击率(CTR)转化率(CVR)预测点击率预测
  • 基于贝叶斯网络的新广告点击率预测
  • 在线广告点击率预测研究;深度学习;机器学习;常见预测方法;
  • 广告点击率预测

    千次阅读 2020-05-25 17:37:46
    广告点击率预测项目,目的是通过广告和用户信息预测一个广告是否被点击。数据来自Kaggle竞赛(https://www.kaggle.com/c/avazu-ctr-prediction),源数据比较大,选取前40000条。 1. 数据读取和分析 import numpy...

    广告点击率预测项目,目的是通过广告和用户信息预测一个广告是否被点击。数据来自Kaggle竞赛(https://www.kaggle.com/c/avazu-ctr-prediction),源数据比较大,选取前400000条。

    1. 数据读取和分析

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    
    #数据读取
    data_df = pd.read_csv('train_subset.csv')
    
    #展示头部数据,分两次展示或者调整python设置达到一次展示所有特征的效果
    #data_df.iloc[:, :12].head()
    #data_df.iloc[:, 12:].head()
    pd.set_option('display.max_columns', None)
    data_df.head(20)

    大致推断一下一些关键特征的业务含义(源数据已经脱敏):

    特征名称

    业务含义推断
    id 数据唯一的ID
    click 是否点击广告
    hour 数据收集时间(yymmddhh)
    banner_pos 广告投放位置信息
    site_id 广告客户网站(某个游戏网站 vs 商家网站)
    site_domain 网站某种大类(游戏 vs 电商)
    site_category 网站某种小类(手游 vs 零食)
    app_id 广告提供商APP
    app_domain APP大类(社交类 vs 内容类)
    app_category APP类别(微博 vs 头条)
    device_id 设备硬件地址(可能是电脑mac地址 vs 手机 IMEI,每个设备唯一)
    device_ip 设备互联网地址(可能多个设备公用)
    device_model 设备型号
    device_type 设备类型(手机 vs 电脑)
    device_conn_type 设备连接类型(Wifi vs 4G)

    C14

    -
    C15 -
    C16 -
    C17 -
    C18 -
    C19 -
    C20 -
    C21 -

    对于前面四个特征 -  id、 click、hour、 banner_pos, 其中,每条数据id都不一样,是没有意义的,显然可以直接删除。

    click是标签,对标签分布的理解是必不可少的。

    pos_counts = data_df[data_df.click==1].count()['click']
    neg_counts = data_df[data_df.click==0].count()['click']
    
    
    print("positive rate: ", pos_counts/data_df.count()['click'])
    print("negtive rate: ", neg_counts/data_df.count()['click'])

    通过上述的数据,可以很容易看出被点击的次数要远小于没有被点击的次数,所以数据是不平衡的,但这个不平衡还没有严重到像1000:1那么夸张。

    由于样本的不平衡,使用准确率是不明智的,所以评估指标我们选用F1-score

    hour特征

    时间特征有可能对我们帮助,比如是否凌晨点击率要低于早上的,是否早上的要低于下午的?

    #先把hour的格式调整一下
    data_df['hour'] = pd.to_datetime(data_df['hour'],format = '%y%m%d%H',errors = 'raise')
    #打印一下hour特征
    data_df.hour.describe()

    其实从上述的结果中可以看到,时间的区间为10-21的00点到10-21的02点,也就是2个小时的间隔。所以在使用这个特征的时候,可以把小时的特征提取出来,因为日期都是一样的

    banner_pos特征

    这是广告投放的位置,从直观上来看对广告点击的结果影响比较大,所以做一下可视化的分析并更好地理解这个特征。

    groups_click = data_df[data_df.click==1].groupby('banner_pos').count()
    groups_no_click = data_df[data_df.click==0].groupby('banner_pos').count()
    plt.title('Visualization of Banner Position and Click Events')
    plt.bar(range(len(groups_no_click)),list(groups_no_click['click']),label = '0',width = 0.5)
    plt.bar(range(len(groups_click)),list(groups_click['click']),bottom = list(groups_no_click['click']), tick_label =list(groups_click.index), label = '1',width = 0.5)
    plt.legend(title = 'click')
    plt.xlabel('banner_pos')
    plt.xticks(rotation=90)
    plt.show()

    生成完上面的图之后能感觉到这个特征还是蛮重要的,而且由于banner_pos=2,4,5,7的样本比较少,在图里不那么直观。所以我们就尝试打印一下一个表格。

    #calculate total amount for a row
    row_total = data_df.groupby('banner_pos').count()['click']
    
    #calculate amount for zero & one
    zero_total = data_df[data_df.click==0].groupby('banner_pos').count()['click']
    one_total = data_df[data_df.click==1].groupby('banner_pos').count()['click']
    
    #calculate result
    zero_result = zero_total / row_total
    one_result = one_total / row_total
    
    #create DataFrame and add column values from above
    rate_df = pd.DataFrame(index = groups_click.index.values,columns=['0','1'])
    rate_df['0'] = list(zero_result)
    rate_df['1'] = list(one_result)
    rate_df.index.name = 'banner_pos'
    rate_df.columns.name = 'click'
    rate_df

    site特征

    site_features = ['site_id', 'site_domain', 'site_category']
    data_df[site_features].describe()

    app特征

    app_features = ['app_id', 'app_domain', 'app_category']
    data_df[app_features].describe()

    重点研究一下app_category特征是否跟标签有较强的关系,为了直观一些,画出app_category的直方图。

    category_click = data_df[data_df.click==0].groupby('app_category').count()['click']
    category_no_click = data_df[data_df.click==1].groupby('app_category').count()['click']
    category_total = data_df.groupby('app_category').count()['click']
    
    zero_result2 = category_click/category_total
    one_result2 = category_no_click/category_total
    
    plt.title('CTR for app_category feature')
    plt.bar(np.array(
        .index),zero_result2,label = '0',width = 0.5)
    plt.bar(np.array(category_click.index),one_result2,bottom = zero_result2, tick_label =np.array(category_click.index), label = '1',width = 0.5)
    plt.legend(title = 'click')
    plt.xlabel('app_category')
    plt.xticks(rotation=90)
    plt.show()

    device特征

    device_features = ['device_id', 'device_ip', 'device_model', 'device_type', 'device_conn_type']
    data_df[device_features].astype('object').describe()

    同样,画出device_conn_type的直方图(device_type类似)

    device_conn_type_click = data_df[data_df.click==0].groupby('device_conn_type').count()['click']
    device_conn_type_no_click = data_df[data_df.click==1].groupby('device_conn_type').count()['click']
    device_conn_type_total = data_df.groupby('device_conn_type').count()['click']
    
    zero_result3 = device_conn_type_click/device_conn_type_total
    one_result3 = device_conn_type_no_click/device_conn_type_total
    
    plt.title('CTR for device_conn_type feature')
    plt.bar(np.array(device_conn_type_click.index),zero_result3,label = '0',width = 0.5)
    plt.bar(np.array(device_conn_type_click.index),one_result3,bottom = zero_result3, tick_label =np.array(device_conn_type_click.index), label = '1',width = 0.5)
    plt.legend(title = 'click')
    plt.xlabel('device_conn_type')
    plt.xticks(rotation=90)
    plt.show()

    其他特征:C1, C14-C21

    c_features = ['C1', 'C14', 'C15', 'C16', 'C17', 'C18', 'C19', 'C20', 'C21']
    data_df[c_features].astype('object').describe()

    拿C1为例,数据集里共有6个不同的类别,同样看一下C1和点击率的直方图。

    c1_click = data_df[data_df.click == 0].groupby('C1').count()['click']
    c1_no_click = data_df[data_df.click == 1].groupby('C1').count()['click']
    c1_total = data_df.groupby('C1').count()['click']
    
    one_result4 = c1_click / c1_total
    zero_result4 = c1_no_click / c1_total
    
    plt.bar(np.array(c1_click.index),zero_result4,label = '0',width = 0.5)
    plt.bar(np.array(c1_click.index),one_result4,bottom = zero_result4,label = '1',tick_label=np.array(c1_click.index),width = 0.5)
    plt.title('CTR for C1 feature')
    plt.xlabel('C1')
    plt.legend(title = 'click')
    plt.show()

    2. 特征构造

    这里的特征有必要构造的不多,hour是一个。可以根据上面显示的hour特征情况,将其变成离散变量:也就是2014-10-21 00点对应到0, 2014-10-21 01点对应到1, 2014-10-21 02点对应到2。

    data_df['hour'] = data_df['hour'].dt.hour

    3. 特征转化

    将类别型特征独热编码,并删除原始特征。为此,需要先删除稀疏特征。

    data_df.drop('device_id', axis=1, inplace=True)
    data_df.drop('device_ip', axis=1, inplace=True)
    data_df.drop('site_id', axis=1, inplace=True)
    data_df.drop('app_id', axis=1, inplace=True)
    
    one_hot_columns = data_df.columns.values.tolist()
    
    one_hot_columns.remove('click')
    
    data_df=pd.get_dummies(data_df,columns = one_hot_columns)

    构建训练数据和测试数据

    feature_names = np.array(data_df.columns[data_df.columns != 'click'].tolist())
    
    from sklearn.model_selection import train_test_split
    
    X_train, X_test, y_train, y_test = train_test_split(
        data_df[feature_names].values, 
        data_df['click'].values,
        test_size=0.2,
        random_state=42
    )
    
    print (X_train.shape, X_test.shape, y_train.shape, y_test.shape)
    
    (319999, 1076) (80000, 1076) (319999,) (80000,)
    

    4. 特征选择

    独热编码之后,特征一下子变得非常多,需要做一下特征选择,这里使用了逻辑回归+L1正则。

    from sklearn.linear_model import LogisticRegression
    from sklearn.feature_selection import SelectFromModel
    from sklearn.metrics import f1_score
    from sklearn.model_selection import KFold, cross_val_score
    import warnings
    
    params_c = np.logspace(-4, 1, 11)
    
    warnings.filterwarnings('ignore')
    
    cv_score=[]
    for c in params_c:
        lr_clf = LogisticRegression(penalty='l1', C=c)
        scores = cross_val_score(lr_clf,X_train,y_train,cv=10,scoring='f1')
        cv_score.append(scores.mean())
    
    c_best = params_c[cv_score.index(max(cv_score))]

    通过最优超参c_best,重新训练训练集数据,并选出特征。

    # 通过c_best值,重新在整个X_train里做训练,并选出特征。
    lr_clf = LogisticRegression(penalty='l1', C=c_best)
    lr_clf.fit(X_train, y_train) # 在整个训练数据重新训练
    
    select_model = SelectFromModel(lr_clf, prefit=True)
    selected_features = select_model.get_support()  # 被选出来的特征

    重新构造训练数据和测试数据。

    # 重新构造feature_names
    feature_names = feature_names[selected_features]
    
    # 重新构造训练数据和测试数据
    X_train = X_train[:, selected_features]
    X_test = X_test[:, selected_features]

    5. 模型训练与评估

    这里使用决策树算法做分类。

    from sklearn.tree import DecisionTreeClassifier
    
    params_min_samples_split = np.linspace(5, 20, 4)
    params_min_samples_leaf = np.linspace(2, 10, 5)
    params_max_depth = np.linspace(4, 10, 4)
    
    #构造决策树并做交叉验证。
    model = GridSearchCV(estimator =DecisionTreeClassifier(),param_grid={'max_depth':params_max_depth},cv=10)
    model.fit(X_train,y_train)
    
    #在测试数据上预测,打印在测试集上的结果
    predictions = model.predict(X_test)
    print(classification_report(y_test, predictions))

     

    说明一下,因为这里只选取了源数据的前400000条,一些关键特征作用被弱化了。像hour特征或许跟标签有很大关系,但是选取的数据里只有三个值,训练过程发现不了这层关系,导致最终的预测结果不太理想。

    展开全文
  • 在训练点击率预测模型的过程中,往往面临着广告及用户的数量巨大以及训练数据集稀疏的问题,从而导致点击率预测的准确度下降。针对这些问题提出了一种基于LDA(latent Dirichlet allocation,LDA)的点击率预测算法...
  • 在搜索广告背后,一个关键技术就是点击率预测。预估点击率 (predict the click-through rate, pCTR) 是指对某个广告将要在某个情形下展现前, 系统预估其可能的点击概率。如果广告有很大概率被点击就向该用户展示广告...
  • 点击率预测问题建模机器学习(Machine Learning) Hospital readmissions, particularly unplanned hospital readmissions are costly to the health care industry. Centers for Medicare and Medicaid Services (CMS...
  • 点击率预测可以提高用户对所展示互联网广告的满意度,支持广告的有效投放,是针对用户进行广告的个性化推荐的重要依据.对于没有历史点击记录的用户,仍需对其推荐广告,预测所推荐广告的点击率.针对这类用户,以贝叶斯网...
  • 本文研究的目标是通过给定的信息预测搜索广告的点击率,通过使用深度 学习模型,挖掘更多的特征之间的关系,从而能更有效的提高预测的结果。...关键词:点击率预测;搜索广告;深度学习;深度神经网络;卷积神经网络
  • 基于PaddleRec的用户点击率预测一、前言推荐系统的痛点二、推荐系统的数据获取获取数据的三种方法1.使用现成的数据集2.网络爬虫3.调查问卷三、数据处理PaddleRec推荐数据集格式1.slot:value的格式说明2.只有value的...
  • 广告点击率预测问题初探

    千次阅读 2018-10-08 15:50:56
    广告点击率预测问题初探 国庆7天参加了一个广告点击率预测的小竞赛,作为只看过机器学习实战的小白,纯粹抱着学习的心态去开眼,果然被大神按在地上虐呢,不过也学到了很多知识。感谢很多大佬都开源并分享了他们的...
  • 目录数据说明数据查看数据预处理  3.1 处理非数值特征初步建立模型查看效果探索性分析和特征工程  5.1 特征分布可视化  5.2 处理取值不均匀...预测总结1 数据说明在线广告的点击率不仅与广告投放的位置和站点有关...
  • 本文是作者对阅读过的大量相关研究文献的小结,作者尝试结合文献与工作实践梳理广告点击率预测、推荐方面相关的技术脉络,希望能对大家有所帮助。在计算广告系统中,一个可以携带广告请求的用户流量到达后台时,系统...
  • 点击率预测 可以使用LDA的变体,低维空间的表示 因为LDA要求句子比较长 有专门处理tweet短文本的LDA 多少个keyword会指向document,如有50个Keyword指向d1,就可以找出topic,慢慢建图 建立keyword和result...
  • 点击率预测是计算广告学的核心算法之一。传统浅层模型没有充分考虑到数据之间存在的非线性关系,且使用人工特征提取方法费时费力。针对这些问题,提出了基于卷积(Convolutional Neural Networks)-LSTM(Long Short...
  • 记阅读的三篇序列推荐/点击率预测论文: Long and Short-Term Recommendations with Recurrent Neural Networks Deep Interest Evolution Network for Click-Through Rate Prediction Adaptive User Modeling with...
  • 广告点击率预测 屈伟 / Koala++  先声明一下,本文所提到的所有的点击率预测的技术不是我在的团队使用的,因为我们团队使用的技术是保密的,所以我也不知道他们是怎么做的。事实上我不知道广告点击率怎么...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 870
精华内容 348
关键字:

点击率预测