2015年,全球互联网广告营收接近600亿美元,比2014年增长了近20%。多家互联网巨头都依赖于广告营收,如谷歌,百度,Facebook,互联网新贵们也都开始试水广告业,如Snapchat, Pinterest, Spotify.

作为互联网广告的老大哥,谷歌花了很大的力气研发自己的社交网络,Google+,并期待能与Facebook,Twitter抗衡。然后事与愿违,Google+的份额依然低于1% 。

2015年,谷歌终于不再强迫用户把Google+和谷歌家的其他服务绑定,如Youtube。笔者认为谷歌花大量人力财力研发Google+并将其与其他服务绑定的原因之一是搜集用户的喜好数据来为自家的广告业务服务。更具体的说是为了更好地预测广告的点击率。在这方面,Facebook似乎更胜一筹。2015年第一季度,Facebook广告的转换率比Google Display Ads Network (GDN)高出了55%。笔者并不感到惊讶,Facebook显然比谷歌更了解用户的喜好,笔者猜测用户的行为,包括点赞, 评论,关注等,都为广告算法提供了关于用户的喜好或类别的信息。这些信息会用于广告的点击率预测,而点击率预测又会应用于广告排序算法。

今天我就带大家来用 Spark MLlib训练一个广告点击率预测的模型。

环境配置

Java

Spark 2.0.0

安装很简单,pre-built版本的spark下载下来即可

Downloads | Apache Spark

Python

数据

Kaggle Avazu挑战赛中的广告数据

Click-Through Rate Prediction

元数据

id: ad identifier

click: 0/1 for non-click/click

hour: format is YYMMDDHH, so 14091123 means 23:00 on Sept. 11, 2014 UTC.

C1 -- anonymized categorical variable

banner_pos

site_id

site_domain

site_category

app_id

app_domain

app_category

device_id

device_ip

device_model

device_type

device_conn_type

C14-C21 -- anonymized categorical variables

数据预处理

我们注意到数据中有字符串类型的值,如site_id,site_domain,site_category,app_id,app_domain,app_category等。我们需要将他们转换成数值型,公式如下:

代码:

import os
import sys
if __name__ == "__main__":input_file = sys.argv[1]preprocess_file = sys.argv[2]test_flag = sys.argv[3]print "input=" + input_fileprint "preprocess_file=" + preprocess_fileoutput = open(preprocess_file, "w")with open(input_file, "r") as lines:next(lines)for line in lines:fields = line.split(",")index = 5end = 14if test_flag == "1":index = 4end = 13while index < end:fields[index] = str(hash(fields[index]) % 1000000)index += 1newline = ",".join(fields)output.write(newline)output.close()

此外,有必要将原来的训练数据分割成两部分:本地训练数据,本地测试数据。由于原来的训练数据是基于10天的数据,我们可以把前9天数据作为本地训练数据,把最后一天的数据作为本地测试数据。

代码:

import os
import sys
if __name__ == "__main__":input_file = sys.argv[1]train_file = sys.argv[2]test_file = sys.argv[3]test_start_date = sys.argv[4]test_data_ouput = open(test_file, "w")train_data_output = open(train_file, "w")with open(input_file, "r") as lines:next(lines)for line in lines:fields = line.split(",")if fields[2].startswith(test_start_date):test_data_ouput.write(line)else:train_data_output.write(line)train_data_output.close()test_data_ouput.close()

Spark 入门

Apache Spark是一个分布式计算框架,旨在简化运行于计算机集群上的并行程序的编写。该框架对资源调度,任务的提交、执行和跟踪,节点间的通信以及数据并行处理的内在底层操作都进行了抽象。它提供了一个更高级别的API用于处理分布式数据。从这方面说,它与Apache Hadoop等分布式处理框架类似。但在底层架构上,Spark与它们有所不同。

我们先介绍SparkContext对象。任何Spark程序的编写都是从SparkContext(或用Java编写时的JavaSparkContext)开始的。SparkContext的初始化需要一个SparkConf对象,后者包含了Spark集群配置的各种参数(比如主节点的URL)。初始化后,我们便可用SparkContext对象所包含的各种方法来创建和操作分布式数据集和共享变量。若要用Python代码来实现的话,可参照下面的代码:

sconf = SparkConf().setAppName(“WordCount") .setMaster(“local[4]")
sc = SparkContext(conf=sconf)

这段代码会创建一个4线程的SparkContext对象,并将其相应的任务命名为WordCount。

RDD(Resilient Distributed Dataset,弹性分布式数据集)是Spark的核心概念之一。一个RDD代表一系列的“记录”(严格来说,某种类型的对象)。这些记录被分配或分区到一个集群的多个节点上(在本地模式下,可以类似地理解为单个进程里的多个线程上)。Spark中的RDD具备容错性,即当某个节点或任务失败时(因非用户代码错误的原因而引起,如硬件故障、网络不通等),RDD会在余下的节点上自动重建,以便任务能最终完成。我们可以把RDD看成数据和基于该数据计算的单元。

RDD也可以基于Hadoop的输入源创建,比如本地文件系统、HDFS和Amazon S3。基于Hadoop的RDD可以使用任何实现了Hadoop InputFormat接口的输入格式,包括文本文件、其他Hadoop标准格式、HBase、Cassandra等。以下举例说明如何用一个本地文件系统里的文件创建RDD:

rddFromTextFile = sc.textFile(“sample.txt")

上述代码中的textFile函数(方法)会返回一个RDD对象。该对象的每一条记录都是一个表示文本文件中某一行文字的String(字符串)对象。

基于RDD的操作被分为转换(transformation)和执行(action)两种。一般来说,转换操作是对一个数据集里的所有记录执行某种函数,从而使记录发生改变;而执行通常是运行某些计算或聚合操作,并将结果返回运行SparkContext的那个驱动程序(driver)。

常见的转换操作: map, filer

常见的执行操作: count, take, collect, saveAsTextFile

基于SparkMLliB的模型训练

Spark提供丰富的机器学习库,包括:分类,回归,聚类等。此外还提供特征提取算法库。详见:

MLlib: Main Guide

本文将logistic regression 应用于处理过的数据,把 loss 收敛在 21.7左右

代码:

from __future__ import print_function
from pyspark import SparkContext
from pyspark.mllib.classification import LogisticRegressionWithLBFGS,LogisticRegressionModel
from pyspark.mllib.regression import LabeledPoint
from pyspark.mllib.util import MLUtilsif __name__ == "__main__":sc = SparkContext(appName="CTRLogisticRegression")# $example on$# Load and parse the datadef parsePoint(line):values = [float(x) for x in line.split(',')]features = values[0:1]features.extend(values[2:])return LabeledPoint(values[1],features)data = sc.textFile("train_data")testData = sc.textFile("test_data")parsedTrainData = data.map(parsePoint)parsedTestData = testData.map(parsePoint)# Build the modelmodel = LogisticRegressionWithLBFGS.train(parsedTrainData)# Evaluating the model on training datalabelsAndPreds = parsedTestData.map(lambda p: (p.label,    model.predict(p.features)))trainErr = labelsAndPreds.filter(lambda (v, p): v != p).count() /float(parsedTestData.count())print("Training Error = " + str(trainErr))# Save and load modelmodel.save(sc, "target/tmp/CTR")

代码执行命令

$SPARKPATH/bin/spark-submit kagggleLogisstic.py

$SPARKPATH 为spark安装目录

延伸

由于精度太低,上述例子训练处的模型显然是无法用于工业界的。特征工程(Feature engineering) 可以帮助我们提高模型的可靠性和准确性,那么如何进行特征工程来提高广告点击率预测的精度呢?有哪些额外的特征可以生成?为何Facebook的广告转换率比谷歌的高?这两者间有何联系?

分享Spark MLlib训练的广告点击率预测模型相关推荐

  1. Spark MLlib实现的广告点击预测–Gradient-Boosted Trees

    关键字:spark.mllib.Gradient-Boosted Trees.广告点击预测 本文尝试使用Spark提供的机器学习算法 Gradient-Boosted Trees来预测一个用户是否会点 ...

  2. 如何在Java应用里集成Spark MLlib训练好的模型做预测

    前言 昨天媛媛说,你是不是很久没写博客了.我说上一篇1.26号,昨天3.26号,刚好两个月,心中也略微有些愧疚.今天正好有个好朋友问,怎么在Java应用里集成Spark MLlib训练好的模型.在St ...

  3. 大数据IMF传奇行动绝密课程第104-114课:Spark Streaming电商广告点击综合案例

    Spark Streaming电商广告点击综合案例 需求分析和技术架构 广告点击系统实时分析 广告来自于广告或者移动App等,广告需要设定在具体的广告位,当用户点击广告的时候,一般都会通过ajax或S ...

  4. 效果广告点击率预估实践:在线学习

    效果广告点击率预估实践:在线学习 原创 2016-03-24 腾讯大数据 腾讯大数据 1.引言 技术钻研如逆水行舟,不进则退.公司的广告业务发展非常迅猛,有目共睹,激烈的外部竞争和客户越来越高的期望, ...

  5. 点击率预测模型Embedding层的学习和训练

    导读: 本文将简要介绍推荐模型的发展历史,现状,和下一步的研究趋势.并重点介绍针对embedding数据的模型训练及优化.主要包含以下几大部分内容: CTR预测模型(CTR Models) 连续值处理 ...

  6. 对“科大讯飞2021丨广告点击率预估挑战赛 Top1方案(附完整代码)_Jack_Yang的博客-CSDN博客”的补充。

    这篇文章的初衷是针对科大讯飞2021丨广告点击率预估挑战赛 Top1方案(附完整代码)_Jack_Yang的博客-CSDN博客进行补充. 博客的信息量很少,对任务背景的介绍也不太对,说实话令人费解.我 ...

  7. 广告点击率预测问题初探

    广告点击率预测问题初探 国庆7天参加了一个广告点击率预测的小竞赛,作为只看过机器学习实战的小白,纯粹抱着学习的心态去开眼,果然被大神按在地上虐呢,不过也学到了很多知识.感谢很多大佬都开源并分享了他们的 ...

  8. 业余草推荐阿里妈妈自研广告点击率预估核心算法MLR

    业余草推荐阿里妈妈自研广告点击率预估核心算法MLR. 小编觉得CTR(广告点击率)预估的能力对于广告系统的意义和重要性,类似于在证券市场上预测股价的能力,优秀的CTR预测,通向美好和财富...(以下转 ...

  9. 精准营销:剖析广告点击率预估系统

    引文 点击率预估系统最早是由谷歌实现,并应用在其搜索广告系统.在看到这一大杀器为谷歌带来滚滚财源之后,其他公司也纷纷效仿.直到今日,大大小小的"互联网广告公司",都宣称自己掌握了基 ...

最新文章

  1. 使用NuGet下载旧版本的软件包
  2. UA MATH567 高维统计专题1 稀疏信号及其恢复4 Basis Pursuit的算法 Projected Gradient Descent
  3. 运满满的技术架构演进之路
  4. 逻辑备库之ORA-01403解决方法
  5. 【UVA2230】过河
  6. 从graphql endpoint获取schema文件
  7. 商品详情页html,天天生鲜商品详情页HTML+css
  8. python类的编写模板_python开发笔记-类
  9. AutoIt Windows的自动化脚本
  10. spark视频-spark机器学习
  11. linux转发邮件,转发Linux服务器上的传入邮件?
  12. 磁珠 符号_如何理解电子元件磁珠?
  13. chrome离线安装包的稳定下载方法
  14. Android 通讯录的实现,根据拼音首字母快速索引到名字
  15. IDEA配置Tomcat时总是提示:Error running ‘Tomcat 8.5.73‘ 问题
  16. 第二章 实例研究:设计一个文档编辑器--《设计模式-可复用面向对象软件的基础》Erich Gamma
  17. 深度学习理论总结(1)
  18. UML时序图(Sequence Diagram)
  19. 参加华为HCIP的培训班吗?
  20. 晶体硅太阳能电池产线性能跟踪项目

热门文章

  1. html瀑布流布局是什么,瀑布流布局图片与css多种实现思路剖析
  2. 使用vue封装的一个瀑布流图片的组件
  3. 腾讯GAD:腾讯专家与Layabox官方团队联合解答H5游戏的制作与优化。
  4. 关闭Windows Ctrl+Alt+Delete来解锁睡眠
  5. rman-06091 nbu
  6. 校外如何登陆北邮oj
  7. 批量更改json文件中指定内容
  8. 企业网络安全架构设计之IPSec VPN应用配置举例
  9. 《刻意学习》读后感心得体会3000字左右
  10. 用户体验五要素_每天都在被触达,却不知为何物?带你认识用户触达五要素