草庐IT

广告流量反作弊风控中的模型应用

vivo 互联网技术 2023-03-28 原文

作者:vivo 互联网安全团队- Duan Yunxin

商业化广告流量变现,媒体侧和广告主侧的作弊现象严重,损害各方的利益,基于策略和算法模型的业务风控,有效保证各方的利益;算法模型可有效识别策略无法实现的复杂作弊模型,本文首先对广告反作弊进行简介,其次介绍风控系统中常用算法模型,以及实战过程中具体风控算法模型的应用案例。

一、广告反作弊简介

1.1  广告流量反作弊定义

广告流量作弊,即媒体通过多种作弊手段,获取广告主的利益。

作弊流量主要来自于:

  • 模拟器或者被篡改了设备的广告流量;

  • 真设备,但通过群控控制的流量;

  • 真人真机,但诱导产生无效流量等。

1.2  常见的作弊行为

  • 机器行为:   IP重复刷量、换不同IP重复刷量,流量劫持,换不同imei重复刷量等。

  • 人工行为:素材交互要素诱导点击,媒体渲染文案诱导点击,突然弹出误触点击等。

1.3  常见作弊类型

按照广告投放流程顺序

  • 展示作弊:媒体将多个展示广告同时曝光于同一个广告位,向广告主收取多个广告的展示费用。

  • 点击作弊:通过脚本或计算机程序模拟真人用户,又或者雇佣和激励诱导用户进行点击,生成大量无用广告点击,获取广告主的CPC广告预算。

  • 安装作弊:通过测试机或模拟器模拟下载,以及通过移动人工或者技术手段修改设备信息、SDK方式发送虚拟信息、模拟下载等等。

二、广告流量反作弊算法体系

2.1 算法模型在业务风控中应用背景

智能风控,运用大量行为数据构建模型,对风险进行识别和感知监控,相比规则策略,显著提升识别的准确性和覆盖率以及稳定性。

常见的无监督算法:

  • 密度聚类(DBSCAN)

  • 孤立森林(Isolation Forest)

  • K均值算法

常见有监督算法:

  • 逻辑回归(logistic)

  • 随机森林 (random forest) 

2.2 广告流量模型算法体系

 体系分四层:

  • 平台层:主要是依托spark-ml/tensorflow/torch算法框架基础上,引用开源以及自定义开发的算法应用于业务风控建模中。

  • 数据层:搭建vaid/ip/媒体/广告位等多粒度下,请求、曝光、点击、下载、激活等多转化流程的画像和特征体系,服务于算法建模。

  • 业务模型层:基于行为数据特征和画像数据,搭建点击反作弊审计模型、请求点击风险预估模型、媒体行为相似团伙模型以及媒体粒度异常感知等模型。

  • 接入层:模型数据的应用,离线点击反作弊模型审计结果与策略识别审计结果汇总,同步业务下游处罚;媒体异常感知模型主要作为候选名单同步点检平台和自动化巡检进行。

三、算法模型应用案例

3.1 素材交互诱导感知

背景:广告素材中添加虚拟的X关闭按钮,导致用户关闭广告时点击的虚假的X按钮,导致无效的点击流量,同时影响用户体验;左图是投放的原始素材,右侧是用户点击的坐标绘制热力图,虚拟X导致用户关闭广告时产生无效的点击流量。

模型识别感知:

1、密度聚类(DBSCAN):

先定义几个概念

  • 邻域:对于任意给定样本x和距离ε,x的ε邻域是指到x距离不超过ε的样本的集合;

  • 核心对象:若样本x的ε邻域内至少包含minPts个样本,则x是一个核心对象;

  • 密度直达:若样本b在a的ε邻域内,且a是核心对象,则称样本b由样本x密度直达;

  • 密度可达:对于样本a,b,如果存在样例p1,p2,...,pn,其中,p1=a,pn=b,且序列中每一个样本都与它的前一个样本密度直达,则称样本a与b密度可达;

  • 密度相连:对于样本a和b,若存在样本k使得a与k密度可达,且k与b密度可达,则a与b密度相连;

  • 所定义的簇概念为:由密度可达关系导出的最大密度相连的样本集合,即为最终聚类的一个簇。

 

2、应用算法对诱导误触广告感知:

① 首先按照分辨率和广告位,对点击数据进行分组,筛选过滤掉量级较小的群组; 

② 对每个群组,使用密度聚类算法进行聚类,设置邻域密度阈值为10,半径ε=5,进行聚类训练;

③ 对每个群组,密度聚类后,过滤掉簇面积较小的簇,具体训练代码如下: 

④ 效果监控和打击,针对挖掘的簇,关联点击后向指标,针对异常转化指标广告位,进行复检,并对复检有问题广告位进行处置。

3.2 点击反作弊模型

3.2.1 背景

针对广告的点击环节建立作弊点击识别模型,提升反作弊审计覆盖能力,发现高纬度隐藏的作弊行为、有效补充点击场景的策略反作弊审计。

3.2.2 建设流程

(1)特征建设

基于token粒度,计算事件发生前,设备、ip、媒体、广告位的等粒度特征。

频率特征:在过去1分钟,5分钟,30分钟、1小时、1天,7天等时间窗口的曝光,点击、安装行为特征、即对应的均值、方差、离散度等特征;

基本属性特征:媒体类型,广告类型,设备合法性、ip类型,网络类型,设备价值等级等。

2、模型训练和效果

① 样本选择:

  • 样本均衡处理:线上作弊样本和非作弊样本非均衡,采用对非作弊样本下采样方式,使得作弊和非作弊样本量达到均衡(1:1) 

  • 鲁棒性样本选取:线上非作弊样本量级大,且群体行为多样性且分布不均等,为了小样本训练上线后覆盖所有行为模式,

  • 使用K-means算法:针对线上非作弊样本进行分群,然后对每个群体按照占比再下采样,获得训练的非作弊样本。

② 特征预处理:

  • 统计每个特征缺失率,去掉缺失率大于50%的特征;

  • 特征贡献度筛选,计算每个特征对预测标签Y的区分度,过滤掉贡献度低于0.001的特征;

  • 特征稳定性筛选,在模型上线前,选取最大和最小时间段的样本,计算两个时间段每个特征的PSI值,过滤掉PSI值(Population Stability Index)大于0.2的特征,保留稳定性较好的特征。

③ 模型训练:

采用随机森林算法,对点击广告作弊行为进行分类,随机森林有较多优势,比如:

(1)能处理很高维度的数据并且不用做特征选择;

(2)对泛化误差(Generalization Error)使用的是无偏估计,模型泛化能力强;

(3)训练速度快,容易做成并行化方法(训练时树与树之间是相互独立的); 

(4)抗过拟合能力比较强;

超参数搜索优化,使用ParamGridBuilder,配置max_depth(树最大深度),numTrees(树的个数)等超参数的进行搜索优化最优超参数。

 ④ 模型稳定性监控:

模型上线后,如果特征随着时间迁移,推理时间的特征与训练时间的特征分布存在变动差异,需要对模型稳定性监控并迭代更新;

首先对当前版本训练样本进行存档,计算推理时间的数据和训练时间数据的对应每个特征的PSI值,计算的PSI值(Population Stability Index)每天可视化监控告警。

⑤ 模型可解释性监控: 

模型上线后,为了更直观的定位命中模型风险的原因,对推理数据进行可解释性监控;即对每条数据,计算其对预测标签的影响程度;

采用Shapley值(Shapley Additive explanation)解释特征如何影响模型的输出,计算shap值输出到可视化平台,日常运营分析使用。

3.3 点击序列异常检测

3.3.1 背景

通过用户小时点击量序列,挖掘恶意行为对应的设备,挖掘检测远离占绝大多数正常行为外的异常模式用户群体、比如只有凌晨0~6点有低频的其他时间没点击行为的异常群体、或者每小时均衡点击的行为等异常模式用户等。

3.3.2 建设流程

(1)特征建设

以设备作为用户,统计过去1/7/30天,每小时的点击量,形成1*24小时、7*24小时、30*24小时点击量序列,构建的特征具备时间尺度上特征完备性和每个特征数据连续条件,适用于异常检测算法。

(2)模型选择

孤立森林离群点检测算法,算法基于两个理论假设,即异常数据占总样本量的比例很小,异常点的特征值与正常点的差异很大。

检测分布稀疏且离密度高的群体较远的点,比如下图可以直观的看到,相对更异常Xo的只需要4次切割就从整体中被分离出来,即被‘孤立’了,而更加正常的Xi点经过了11次分割才从整体中分离出来。

(3)模型训练

使用IsolationForest算法,为了更好覆盖,针对多种粒度流量进行异常检测训练。

①全平台流量,训练异常感知模型,设置异常样本比例contamination=0.05;

②每类媒体类型的流量,训练异常感知模型,设置异常样本比例contamination=0.1;

③每种广告位类型流量,训练异常感知模型,设置异常样本比例contamination=0.1。

(4)感知监控

  • 异常得分定义:如果异常得分接近 1,那么一定是异常点,如果异常得分远小于 0.5,一定不是异常点;

  • 异常筛选:筛选异常得分大于0.7的用户作为高风险人群,介于0.5~0.7的人群作为中风险人群,对高中风险人群,同步审计平台人工二次审计;

  • 案例分析:  

案例① 

2022年XX月XX号, 7*24小时点击量异常检测, 可疑恶意用户A ,过去7天大部分时间,每小时均衡产生较多点击记录远超正常用户。

 (备注:features中每个点代表用户一个小时的点击量)  

 案例②

2022年XX月XX号,1*24小时点击量序列异常检测,可疑恶意用户B, 基本只在凌晨产生点击,其他白天基本无点击行为。

 

四、总结

在流量反作弊领域,随着对抗手段的升级,算法模型能更好发现和挖掘黑产的隐藏的作弊模式;在广告流量反作弊领域,我们使用有监督和无监督等算法模型,从作弊流量识别,异常流量感知方面做了探索挖掘应用,有效提升识别能力,挖掘发现较复杂的异常行为模式。未来算法模型在机器流量识别上更多探索实践应用。

有关广告流量反作弊风控中的模型应用的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  3. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  4. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  5. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  6. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  7. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  8. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  9. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  10. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

随机推荐