广告点击率预估

场景概述

简介

在数字广告营销领域,通常需要预估一个广告的点击率,即CTR(Click Through Rate)预估。做CTR预估时,通常基于历史广告的点击数据和query的各种特征,通过机器学习模型来预测CTR。目前最常用的方法主要为逻辑回归LR(Logistic Regression)和Boosting类算法,如迭代决策树GBDT(Gradient Boosting Decision Tree)。

本案例基于百度智能云提供的样例数据介绍使用逻辑回归LR算法做点击率预估的实现过程。

查看相关场景的视频教程请移至视频中心

样例数据

您可依照数据准备中的内容准备您自己的数据,也可使用百度智能云准备好的两份数据:

  • 一份训练数据,用来训练CTR预估的模型,数据路径:bos://bml-sample-data/ctr/train_data。
  • 一份测试数据,用来评估模型和离线预测,数据路径:bos://bml-sample-data/ctr/test_data。

场景实现流程图

使用BML平台实现CTR预估的过程如下:

CTR预估环境准备

数据准备

您可以跳过此步骤直接使用样例数据中提供的数据。也可按照如下说明准备自己的输入数据。数据准备工作需要完成但不局限于以下几步:

1.数据清洗

请从历史的广告展现点击日志中,以同一条广告在同一个query场景下的展现点击场景为单位,提取每个场景下对应的日志字段内容,同时需要规范化点击和展示数目,并去掉一些展示量过低的广告数据。既可以减少噪声数据从而提高CTR预估的准确度,也可以减小模型迭代的计算复杂度。

在广告展现点击日志中用到的经典字段主要包括用户ip、查询请求的时间戳、查询的query字符串、广告id、广告标题、广告描述、匹配的竞价词、query串的切词结果、广告标题的切词结果、广告描述的切词结果、流量来源id等。

2.特征提取

在筛选完数据后,还要针对在原始数据中提取的字段,做进一步的特征提取和组合工作,越丰富有效的特征通过训练得到的模型越能给出准确的预估CTR结果。特征提取工作在整个CTR预估场景中通常是最影响最终结果,也是最耗时,最需要数字广告营销的客户花费心思考虑的环节。这一步骤通常需要持续的迭代尝试,在特征库上持续扩充特征字段,并反复的进行模型的训练和评估工作,根据评估的结果判断扩充的特征是否有效。

在数字广告营销领域的CTR预估场景中,常用到的特征主要包括但不局限于以下几方面:

  • 广告创意特征:包括广告的图片、标题文字、价格、销量,推广商品所属类别、包含属性,广告的创意组、推广计划、广告主等。query信息,包括query包含的关键词,query的分析结果如类别、属性等,query的扩展结果如同义词、相似query等。
  • 环境特征:包括用户的特征属性,query触发的时间等。
  • 名义特征:包括创意id,广告创建的时间等。
  • 点击反馈特征:包括计算历史上包含该特征的点击率等,如所属广告计划的历史点击率。
  • 组合特征:各方面特征的组合属性,如query和广告标题匹配的关键词个数等。

3.格式转换

请将训练数据转换为BML支持的格式,格式要求可参考数据格式,请根据格式的各字段解释和训练数据的意义,对训练数据进行格式转换、数据拆分或合并等工作。在BML的CTR预估中,常用的格式为稀疏不带权SparseID和稀疏带权SparseIDWeight两种格式。

下面以一份已经完成数据准备工作的某电商平台的广告展现点击数据作为示例,来训练一个CTR预估的LR模型,介绍在BML平台中模型训练的流程、如何评估模型的效果、如何应用模型做CTR预估、以及一些模型的调参和优化经验。

1,0,6526 1,120954 1,148848 1,211353 1,138553 1,53068 0.666667,181083 1,66374 1,243630 0,25606 0,162749 1,14810 1,125722 0,183122 1,87335 0,164481 0,272402 0,251866 0,192599 0.110535,169065 0.15,272878 0,40318 0.543478,178379 0.172668,2414 0.90092,144282 1,60875 1
1,0,6526 1,120954 1,148848 1,211353 1,138553 1,53068 0.703704,181083 1,66374 1,243630 0,25606 0,162749 1,14810 1,125722 0,183122 1,87335 0,164481 0,272402 0,251866 0,192599 0.110535,169065 0.15,272878 0,40318 0.543478,178379 0.172668,2414 0.90092,144282 1,60875 1

以上样例数据是完成数据准备工作后的示例训练数据,由于保密需求,该数据是ID化后的数据,示例数据为稀疏带权格式。每一行样本为一个广告展现场景,每列以半角逗号分离。

  • 第一列为每个场景的样本id(用户对样本的标志,对模型训练应用没有影响,方便用户自己追踪数据,可以为空但要保留逗号分隔符)。
  • 第二列为该广告展现后是否被点击(0为未点击,1为已经点击,BML也支持字符串格式的标签,不要求此列必须是离散数值)。
  • 后续每列为提取的特征和对应的权重,以空格分离。(示例里展现的特征都是id化后的数字id,BML支持直接为字符串的特征。示例中的每个特征的权重取值都是离散的0/1,BML也支持连续的浮点数权重值,用户需要根据自己的业务场景和特征意义对特征进行取值。)

数据上传

把按以上说明准备的数据存储在对象存储BOS上,上传操作请参考对象存储BOS入门指南

创建数据集

数据集是百度机器学习BML数据管理的基本单位,各种算法的模型训练、离线预测和评估过程只接收数据集作为算法的输入。以存储在BOS上的原始数据为数据输入,在BML系统中可同时且多次进行模型训练,离线预测,评估。

创建数据集操作如下:

  1. 打开“产品服务>百度机器学习BML”,点击“创建实验”,进入创建实验页面。

  2. 系统自动生成了实验名称“experiment_20160622”,可在右侧配置区修改。

  3. 点击左侧导航的“数据输入输出”,拖拽“输入数据源”至中间空白处,在右侧参数配置区配置如下参数:

    • 数据源路径:输入BOS Bucket路径地址:bos://bml-sample-data/ctr/train_data。BML数据集只获得该路径下的非目录的文件作为输入,不会递归处理子目录下的文件。路径支持匹配符格式,如果需要递归的获得目录下子目录输入数据,请在Input参数中添加匹配符表达式(和标准的linux的ls的匹配符一致)。如需要获得所有两层子目录下的part00-part03开头的所有文件,则路径格式为:bos://bucketName/object/*/*/part0[0-3]*。目前支持.gz格式的压缩文件。
    • 数据格式:选择“BML专属”。
    • 数据类型:选择“稀疏带权”。
    • 描述:输入描述信息。

  4. 拖拽左侧导航的“输出数据集”至中间空白处,在右侧参数配置区定义数据集名称“bml_ctr_traindata”。

  5. 连接“输入数据源”与“输出数据集”。
  6. 保存当前的数据集为实验,以便后期复用,请点击页面上方的保存图标,则该数据集保存至实验列表。
  7. 页面自动跳转至“产品服务>百度机器学习BML-实验列表”,点击实验“experiment_20160622”对应的运行按钮开始创建数据集。

  8. 可在“产品服务>百度机器学习BML-数据集列表”页查看到数据集“bml_ctr_traindata”。数据集的创建过程是一个异步的持续过程,根据输入数据量的大小和BML系统的繁忙程度将耗费不同的时间(完成后会有站内信通知),您可以根据数据集的状态判断数据集是否创建成功,只有状态为完成的数据集才可以作为后续机器学习流程的输入单位,对于状态为创建中的数据集可以进行停止操作。

  9. 点击“bml_ctr_traindata”,可查看该数据集的详情。

  10. 至此,训练数据的数据集已创建完成。下面请重复步骤1至8创建测试数据的数据集,对应的参数如下图所示,实验名称是“experiment_20160622_test”。

训练模型

使用逻辑回归LR算法作为CTR预估模型的训练算法,训练模型的具体操作如下:

  1. 在“产品服务>百度机器学习BML-实验列表”页面,点击已创建的实验“experiment_20160622”,进入该实验页面。
  2. 点击左侧“模型训练”,拖拽“逻辑回归LR”至中间空白处,系统自动生成了模型名称“my_lr_model”,可在右侧参数配置区修改。请保持其余参数的默认值不变。
  3. 连接“输出数据集”与“逻辑回归LR”。

  4. 点击上方的运行按钮后开始训练模型。

  5. 在“产品服务>百度机器学习BML-模型列表”页面可查看已创建的模型“my_lr_model”。模型的训练过程同样是一个异步的持续过程,根据输入数据量的大小和BML系统的繁忙程度完成时间也不同(完成后会有站内信通知)。

  6. 点击“my_lr_model”可查看到模型训练的配置及状态信息,您可以根据模型的状态判断模型是否成功训练完成,对于状态为创建中的模型可以进行停止操作。若由于数据问题或高阶参数设置的不合理导致的模型训练失败情况,也会给出相应的错误提示。同样只有成功训练完成的模型才能进行后续的评估和应用,下图是已完成的模型“my_lr_model”的模型详情页。

评估模型

下面将详细介绍如何衡量一个CTR预估模型是否足够理想可以应用到实际业务中。百度机器学习BML的逻辑回归LR算法提供了三个评估指标:AUC值、ROC曲线、PR曲线,最重要的指标为AUC值,为一个浮点数。

评估指标介绍

逻辑回归LR模型属于机器学习中的二分类模型,常被用来评价一个二值分类器(binary classifier)优劣,主要指标为ROC(Receiver Operating Characteristic)曲线和AUC(Area Under Curve)。在CTR业务场景中,AUC指标在模型评估阶段常被用作最重要的评估指标来衡量模型的准确性,评估的AUC值能够衡量根据预估的CTR值进行排序的准确性,越接近1模型的效果越好,其中随机分类的LR模型AUC为0.5,所以模型的AUC基线值大于0.5才有意义。

ROC的横坐标为False positive rate,纵坐标为True positive rate。取某一个阈值T1,预测值大于T1认为预测结果为正类,这些结果中真实结果为正类的个数为V1,V1除以全部样本正样本个数即为纵坐标,真实结果为负类的个数为V2,V2除以全部样本负类个数即为横坐标。下图详细说明了FPR和TPR是如何定义的。

横纵坐标的点即为ROC曲线中的一个点,阈值从0到1计算一连串的坐标点,组成了ROC曲线。曲线下的面积即为AUC。

PR(Precision Recall)正确率召回率曲线,横坐标为召回率,召回的正样本占全部正样本的比例。纵坐标为正确率,召回的正样本占全部召回样本的比例。

使用百度机器学习BML评估模型

用于评估的测试数据必须有真实的标签值列,也必须有真实的是否被点击的值。下面演示如何在百度机器学习BML中用基于样例数据中的测试数据创建的测试数据集“bml_ctr_testdata”评估已训练得到的模型“my_lr_model”。

  1. 在“产品服务>百度机器学习BML-实验列表”页面,点击已创建的实验“experiment_20160622_test”,进入该实验页面。
  2. 点击左侧导航的“模型评估”,拖拽模型评估至中间空白处,连接“输出数据集”与“模型评估”。
  3. 点击左侧导航的“我的模型”,拖拽已完成训练的模型“my_lr_model”,连接“my_lr_model”与“模型评估”。

  4. 点击上方的运行按钮后开始模型评估。模型评估是一个异步的持续过程,也将根据数据量的大小和BML系统的繁忙程度将耗费不同的时间(完成后会有站内信通知)。

  5. 在“产品服务>百度机器学习BML-模型列表”页面点击模型“my_lr_model”,可在“本模型评估信息”页查看评估信息。在模型详情页面点击评估信息标签可以查看到该模型所有的历史评估信息列表,列表中的每项展示了该模型评估所用的评估数据集,评估结果及状态信息,您可以根据状态判断模型评估是否成功完成。

  6. 成功完成的模型评估项会显示该次评估的评估结果内容,本例子的LR模型有三个评估结果,一个浮点数AUC值,ROC和PR两幅曲线,点击曲线的小图标可以获得曲线的详细展示。评估结果如下图所示:

CTR预估

在上面的例子中,已成功的训练了一个CTR预估模型,并演示了如何评估这个模型的效果。经过多次的特征提取,模型迭代后,可以得到一个效果理想的CTR预估模型,下面将介绍这个模型是如何应用到数字广告营销场景中的。

百度机器学习BML支持离线预测。离线预测也称批量预测,是指对一批存储在对象存储BOS中的数据,根据训练得到的模型预测这批新数据的标签值,预测的结果存储回BOS上。在数字广告营销业务中,离线预测常被用在CTR预估的实时性要求不高的场景(比如小时级别或天级别对一批数据进行预测),或者对历史的点击展现数据进行再次预测,和实际的结果进行对比以进行回归测试等场景。

百度机器学习BML的离线预测以数据集为输入单位,因此需要将离线预测的原始数据先添加数据集。在本例中我们直接使用前面添加过用来作评估的数据集做离线预测,不同的是,离线预测不需要像原始数据那样有真实的标签列,该列可以留空,测试数据中出现的在训练中从未出现的特征值,在预测时将被忽略。

  1. 在“产品服务>百度机器学习BML-实验列表”页面,点击已创建的实验“experiment_20160622”,进入该实验页面。
  2. 点击左侧导航的“离线预测”,并拖拽离线预测至中间空白处,在右侧参数配置区选择本次预测结果在BOS上的存储路径,请确保对输出路径有写权限,如果路径不存在则创建路径,如果已经存在该路径,系统根据用户填写的路径构造输出路径。
  3. 连接“输出数据集”与“离线预测”,连接“my_lr_model”与“离线预测”。

  4. 点击上方的运行按钮开始模型的离线预测。同样的,模型离线预测也是一个异步的持续过程,根据数据量的大小和BML系统的繁忙程度,完成时间会不同(完成后会有站内信通知)。

  5. 在“产品服务>百度机器学习BML-模型列表”页面点击模型“my_lr_model”,可在“本模型预测信息”页查看预测信息,包含本次预测所用的数据集,结果输出及状态信息。若由于数据问题或高阶参数设置的不合理导致的预测失败,也会给出相应的错误提示。

  6. 成功完成的离线预测,会将该次离线预测的预测结果输出到设置的BOS路径中,您可自行查看和后续使用。离线预测的预测结果格式为,每一行以英文半角分号;分隔。分号前为原始数据,分号后为该条样本的预测结果。预测结果是以半角逗号“,”分隔的,每类及该类的概率值(类label标签和概率之间空格分隔),预测结果没有排序。

模型调参及优化

在运用机器学习的方法来解决实际业务场景的过程中,很难直接获得一个效果理想的模型,往往需要反复的迭代优化过程。最常用的迭代优化方式如下:

  • 扩充训练数据数量,提高训练数据质量。主要包括合并增量的日志数据,人工扩充正负样本数量平衡样本比例,进一步清洗过滤原始样本清理噪声数据等。
  • 特征工程,在前面的数据准备阶段已经提到过,特征提取工作在整个CTR预估场景中通常是最影响最终结果,也通常是最耗时,最需要数字广告营销的客户需要花费心思考虑的环境。这一步骤通常需要不停的迭代尝试,在特征库上持续的扩充特征字段,并反复的进行模型的训练和评估工作,根据评估的结果判断扩充的特征是否有效。
  • 模型算法参数调节,模型训练时设置的参数都将影响模型训练的迭代过程,合理的调节模型参数也能优化模型的效果。

本案例中只介绍模型调参部分。当模型的参数过多时,很容易遇到过拟合的问题。这时就需要有一种方法来控制模型的复杂度,典型的做法在优化目标中加入正则项,通过惩罚过大的参数来防止过拟合:

一般情况下,取p=1,或p=2,分别对应L1,L2正则化,两者的区别可以从下图中看出来,L1正则化倾向于使参数变为0,因此能产生稀疏解。

L1正则化如下图:

L2正则化如下图:

  • 通过L1调整参数的稀疏度,如果大量的参数为0,可以适当降低L1的值。
  • 通过L2调整参数的变化幅度,提高模型的稳定性。如果参数之间的最大值与最小值差距比较大,可以适当提高L2的值。
  • 如果训练数据的AUC和评估数据的AUC结果差距太大,说明过拟合的情况比较严重,提高L1和L2的值。