Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
models
提交
489369a4
M
models
项目概览
PaddlePaddle
/
models
大约 1 年 前同步成功
通知
222
Star
6828
Fork
2962
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
602
列表
看板
标记
里程碑
合并请求
255
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
M
models
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
602
Issue
602
列表
看板
标记
里程碑
合并请求
255
合并请求
255
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
489369a4
编写于
7月 17, 2017
作者:
S
Superjom
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix PR
上级
a4815f33
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
87 addition
and
61 deletion
+87
-61
ctr/README.md
ctr/README.md
+40
-20
ctr/avazu_data_processer.py
ctr/avazu_data_processer.py
+2
-4
ctr/index.html
ctr/index.html
+40
-20
ctr/network_conf.py
ctr/network_conf.py
+2
-10
ctr/train.py
ctr/train.py
+2
-6
ctr/utils.py
ctr/utils.py
+1
-1
未找到文件。
ctr/README.md
浏览文件 @
489369a4
...
...
@@ -3,27 +3,27 @@
以下是本例目录包含的文件以及对应说明:
```
├── README.md # 本教程markdown 文档
├── dataset.md # 数据集处理教程
├── images # 本教程图片目录
├── README.md
# 本教程markdown 文档
├── dataset.md
# 数据集处理教程
├── images
# 本教程图片目录
│ ├── lr_vs_dnn.jpg
│ └── wide_deep.png
├── infer.py # 预测脚本
├── network_conf.py # 模型网络配置
├── reader.py # data provider
├── train.py # 训练脚本
└── utils.py # helper functions
├── infer.py # 预测脚本
├── network_conf.py # 模型网络配置
├── reader.py # data reader
├── train.py # 训练脚本
└── utils.py # helper functions
└── avazu_data_processer.py # 示例数据预处理脚本
```
## 背景介绍
CTR(Click-Through Rate,点击率预估)
\[
[
1
](
https://en.wikipedia.org/wiki/Click-through_rate
)
\]
是用来表示用户点击一个特定链接的概率,
通常被用来衡量一个在线广告系统的有效性
。
CTR(Click-Through Rate,点击率预估)
\[
[
1
](
https://en.wikipedia.org/wiki/Click-through_rate
)
\]
是对用户点击一个特定链接的概率做出预测,是广告投放过程中的一个重要环节。精准的点击率预估对在线广告系统收益最大化具有重要意义
。
当有多个广告位时,CTR 预估一般会作为排序的基准。
比如在搜索引擎的广告系统里,当用户输入一个带商业价值的搜索词(query)时,系统大体上会执行下列步骤来展示广告:
当有多个广告位时,CTR 预估一般会作为排序的基准,比如在搜索引擎的广告系统里,当用户输入一个带商业价值的搜索词(query)时,系统大体上会执行下列步骤来展示广告:
1.
召回
满足 query 的广告集合
1.
获取
满足 query 的广告集合
2.
业务规则和相关性过滤
3.
根据拍卖机制和 CTR 排序
4.
展出广告
...
...
@@ -51,13 +51,11 @@ Figure 1. LR 和 DNN 模型结构对比
</p>
LR 的蓝色箭头部分可以直接类比到 DNN 中对应的结构,可以看到 LR 和 DNN 有一些共通之处(比如权重累加),
但前者的模型复杂度在相同输入维度下比后者可能低很多(从某方面讲,模型越复杂,越有潜力学习到更复杂的信息)。
但前者的模型复杂度在相同输入维度下比后者可能低很多(从某方面讲,模型越复杂,越有潜力学习到更复杂的信息);
如果 LR 要达到匹敌 DNN 的学习能力,必须增加输入的维度,也就是增加特征的数量,
这也就是为何 LR 和大规模的特征工程必须绑定在一起的原因。
LR 对于 DNN 模型的优势是对大规模稀疏特征的容纳能力,包括内存和计算量等方面,工业界都有非常成熟的优化方法。
LR 对于 DNN 模型的优势是对大规模稀疏特征的容纳能力,包括内存和计算量等方面,工业界都有非常成熟的优化方法;
而 DNN 模型具有自己学习新特征的能力,一定程度上能够提升特征使用的效率,
这使得 DNN 模型在同样规模特征的情况下,更有可能达到更好的学习效果。
...
...
@@ -74,7 +72,7 @@ LR 对于 DNN 模型的优势是对大规模稀疏特征的容纳能力,包括
我们直接使用第一种方法做分类任务。
我们使用 Kaggle 上
`Click-through rate prediction`
任务的数据集
\[
[
2
](
https://www.kaggle.com/c/avazu-ctr-prediction/data
)
\]
来演示模型。
我们使用 Kaggle 上
`Click-through rate prediction`
任务的数据集
\[
[
2
](
https://www.kaggle.com/c/avazu-ctr-prediction/data
)
\]
来演示
本例中的
模型。
具体的特征处理方法参看
[
data process
](
./dataset.md
)
。
...
...
@@ -86,7 +84,21 @@ LR 对于 DNN 模型的优势是对大规模稀疏特征的容纳能力,包括
23 231 \t 1230:0.12 13421:0.9 \t 1
```
演示数据集
\[
[
2
](
#参考文档
)
\]
可以使用
`avazu_data_processor.py`
脚本处理,具体使用方法参考如下说明:
详细的格式描述如下:
-
`dnn input ids`
采用 one-hot 表示,只需要填写值为1的ID(注意这里不是变长输入)
-
`lr input sparse values`
使用了
`ID:VALUE`
的表示,值部分最好规约到值域
`[-1, 1]`
。
此外,模型训练时需要传入一个文件描述 dnn 和 lr两个子模型的输入维度,文件的格式如下:
```
dnn_input_dim: <int>
lr_input_dim: <int>
```
其中,
`<int>`
表示一个整型数值。
本目录下的
`avazu_data_processor.py`
可以对下载的演示数据集
\[
[
2
](
#参考文档
)
\]
进行处理,具体使用方法参考如下说明:
```
usage: avazu_data_processer.py [-h] --data_path DATA_PATH --output_dir
...
...
@@ -111,6 +123,12 @@ optional arguments:
size of the trainset (default: 100000)
```
-
`data_path`
是待处理的数据路径
-
`output_dir`
生成数据的输出路径
-
`num_lines_to_detect`
预先扫描数据生成ID的个数,这里是扫描的文件行数
-
`test_set_size`
生成测试集的行数
-
`train_size`
生成训练姐的行数
## Wide & Deep Learning Model
谷歌在 16 年提出了 Wide & Deep Learning 的模型框架,用于融合适合学习抽象特征的 DNN 和 适用于大规模稀疏特征的 LR 两种模型的优点。
...
...
@@ -248,7 +266,7 @@ trainer.train(
## 运行训练和测试
训练模型需要如下步骤:
1.
下载训练数据,可以使用 Kaggle 上 CTR 比赛的数据
\[
[
2
](
#参考文献
)
\]
1.
准备训练数据
1.
从
[
Kaggle CTR
](
https://www.kaggle.com/c/avazu-ctr-prediction/data
)
下载 train.gz
2.
解压 train.gz 得到 train.txt
3.
`mkdir -p output; python avazu_data_processer.py --data_path train.txt --output_dir output --num_lines_to_detect 1000 --test_set_size 100`
生成演示数据
...
...
@@ -294,6 +312,8 @@ optional arguments:
23 231 \t 1230:0.12 13421:0.9
```
这里与训练数据的格式唯一不同的地方,就是没有标签,也就是训练数据中第3列
`click`
对应的数值。
`infer.py`
的使用方法如下
```
...
...
ctr/avazu_data_processer.py
浏览文件 @
489369a4
import
os
#!/usr/bin/env python
# -*- coding: utf-8 -*-import os
import
sys
import
csv
import
cPickle
...
...
@@ -217,9 +218,6 @@ def detect_dataset(path, topn, id_fea_space=10000):
feature_dims
[
key
]
for
key
in
categorial_features
+
[
'hour'
])
+
1
feature_dims
[
'lr_input'
]
=
np
.
sum
(
feature_dims
[
key
]
for
key
in
id_features
)
+
1
# logger.warning("dump dataset's meta info to %s" % meta_out_path)
# cPickle.dump([feature_dims, fields], open(meta_out_path, 'wb'))
return
feature_dims
...
...
ctr/index.html
浏览文件 @
489369a4
...
...
@@ -45,27 +45,27 @@
以下是本例目录包含的文件以及对应说明:
```
├── README.md # 本教程markdown 文档
├── dataset.md # 数据集处理教程
├── images # 本教程图片目录
├── README.md
# 本教程markdown 文档
├── dataset.md
# 数据集处理教程
├── images
# 本教程图片目录
│ ├── lr_vs_dnn.jpg
│ └── wide_deep.png
├── infer.py # 预测脚本
├── network_conf.py # 模型网络配置
├── reader.py # data provider
├── train.py # 训练脚本
└── utils.py # helper functions
├── infer.py # 预测脚本
├── network_conf.py # 模型网络配置
├── reader.py # data reader
├── train.py # 训练脚本
└── utils.py # helper functions
└── avazu_data_processer.py # 示例数据预处理脚本
```
## 背景介绍
CTR(Click-Through Rate,点击率预估)\[[1](https://en.wikipedia.org/wiki/Click-through_rate)\]
是用来表示用户点击一个特定链接的概率,
通常被用来衡量一个在线广告系统的有效性
。
CTR(Click-Through Rate,点击率预估)\[[1](https://en.wikipedia.org/wiki/Click-through_rate)\]
是对用户点击一个特定链接的概率做出预测,是广告投放过程中的一个重要环节。精准的点击率预估对在线广告系统收益最大化具有重要意义
。
当有多个广告位时,CTR 预估一般会作为排序的基准。
比如在搜索引擎的广告系统里,当用户输入一个带商业价值的搜索词(query)时,系统大体上会执行下列步骤来展示广告:
当有多个广告位时,CTR 预估一般会作为排序的基准,比如在搜索引擎的广告系统里,当用户输入一个带商业价值的搜索词(query)时,系统大体上会执行下列步骤来展示广告:
1.
召回
满足 query 的广告集合
1.
获取
满足 query 的广告集合
2. 业务规则和相关性过滤
3. 根据拍卖机制和 CTR 排序
4. 展出广告
...
...
@@ -93,13 +93,11 @@ Figure 1. LR 和 DNN 模型结构对比
</p>
LR 的蓝色箭头部分可以直接类比到 DNN 中对应的结构,可以看到 LR 和 DNN 有一些共通之处(比如权重累加),
但前者的模型复杂度在相同输入维度下比后者可能低很多(从某方面讲,模型越复杂,越有潜力学习到更复杂的信息)。
但前者的模型复杂度在相同输入维度下比后者可能低很多(从某方面讲,模型越复杂,越有潜力学习到更复杂的信息);
如果 LR 要达到匹敌 DNN 的学习能力,必须增加输入的维度,也就是增加特征的数量,
这也就是为何 LR 和大规模的特征工程必须绑定在一起的原因。
LR 对于 DNN 模型的优势是对大规模稀疏特征的容纳能力,包括内存和计算量等方面,工业界都有非常成熟的优化方法。
LR 对于 DNN 模型的优势是对大规模稀疏特征的容纳能力,包括内存和计算量等方面,工业界都有非常成熟的优化方法;
而 DNN 模型具有自己学习新特征的能力,一定程度上能够提升特征使用的效率,
这使得 DNN 模型在同样规模特征的情况下,更有可能达到更好的学习效果。
...
...
@@ -116,7 +114,7 @@ LR 对于 DNN 模型的优势是对大规模稀疏特征的容纳能力,包括
我们直接使用第一种方法做分类任务。
我们使用 Kaggle 上 `Click-through rate prediction` 任务的数据集\[[2](https://www.kaggle.com/c/avazu-ctr-prediction/data)\] 来演示模型。
我们使用 Kaggle 上 `Click-through rate prediction` 任务的数据集\[[2](https://www.kaggle.com/c/avazu-ctr-prediction/data)\] 来演示
本例中的
模型。
具体的特征处理方法参看 [data process](./dataset.md)。
...
...
@@ -128,7 +126,21 @@ LR 对于 DNN 模型的优势是对大规模稀疏特征的容纳能力,包括
23 231 \t 1230:0.12 13421:0.9 \t 1
```
演示数据集\[[2](#参考文档)\] 可以使用 `avazu_data_processor.py` 脚本处理,具体使用方法参考如下说明:
详细的格式描述如下:
- `dnn input ids` 采用 one-hot 表示,只需要填写值为1的ID(注意这里不是变长输入)
- `lr input sparse values` 使用了 `ID:VALUE` 的表示,值部分最好规约到值域 `[-1, 1]`。
此外,模型训练时需要传入一个文件描述 dnn 和 lr两个子模型的输入维度,文件的格式如下:
```
dnn_input_dim:
<int>
lr_input_dim:
<int>
```
其中, `
<int>
` 表示一个整型数值。
本目录下的 `avazu_data_processor.py` 可以对下载的演示数据集\[[2](#参考文档)\] 进行处理,具体使用方法参考如下说明:
```
usage: avazu_data_processer.py [-h] --data_path DATA_PATH --output_dir
...
...
@@ -153,6 +165,12 @@ optional arguments:
size of the trainset (default: 100000)
```
- `data_path` 是待处理的数据路径
- `output_dir` 生成数据的输出路径
- `num_lines_to_detect` 预先扫描数据生成ID的个数,这里是扫描的文件行数
- `test_set_size` 生成测试集的行数
- `train_size` 生成训练姐的行数
## Wide
&
Deep Learning Model
谷歌在 16 年提出了 Wide
&
Deep Learning 的模型框架,用于融合适合学习抽象特征的 DNN 和 适用于大规模稀疏特征的 LR 两种模型的优点。
...
...
@@ -290,7 +308,7 @@ trainer.train(
## 运行训练和测试
训练模型需要如下步骤:
1.
下载训练数据,可以使用 Kaggle 上 CTR 比赛的数据\[[2](#参考文献)\]
1.
准备训练数据
1. 从 [Kaggle CTR](https://www.kaggle.com/c/avazu-ctr-prediction/data) 下载 train.gz
2. 解压 train.gz 得到 train.txt
3. `mkdir -p output; python avazu_data_processer.py --data_path train.txt --output_dir output --num_lines_to_detect 1000 --test_set_size 100` 生成演示数据
...
...
@@ -336,6 +354,8 @@ optional arguments:
23 231 \t 1230:0.12 13421:0.9
```
这里与训练数据的格式唯一不同的地方,就是没有标签,也就是训练数据中第3列 `click` 对应的数值。
`infer.py` 的使用方法如下
```
...
...
ctr/network_conf.py
浏览文件 @
489369a4
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import
paddle.v2
as
paddle
from
paddle.v2
import
layer
from
paddle.v2
import
data_type
as
dtype
...
...
@@ -80,10 +79,7 @@ class CTRmodel(object):
config LR submodel
'''
fc
=
layer
.
fc
(
input
=
self
.
lr_merged_input
,
size
=
1
,
name
=
'lr'
,
act
=
paddle
.
activation
.
Relu
())
input
=
self
.
lr_merged_input
,
size
=
1
,
act
=
paddle
.
activation
.
Relu
())
return
fc
def
_build_classification_model
(
self
,
dnn
,
lr
):
...
...
@@ -91,7 +87,6 @@ class CTRmodel(object):
self
.
output
=
layer
.
fc
(
input
=
merge_layer
,
size
=
1
,
name
=
'output'
,
# use sigmoid function to approximate ctr rate, a float value between 0 and 1.
act
=
paddle
.
activation
.
Sigmoid
())
...
...
@@ -103,10 +98,7 @@ class CTRmodel(object):
def
_build_regression_model
(
self
,
dnn
,
lr
):
merge_layer
=
layer
.
concat
(
input
=
[
dnn
,
lr
])
self
.
output
=
layer
.
fc
(
input
=
merge_layer
,
size
=
1
,
name
=
'output'
,
act
=
paddle
.
activation
.
Sigmoid
())
input
=
merge_layer
,
size
=
1
,
act
=
paddle
.
activation
.
Sigmoid
())
if
not
self
.
is_infer
:
self
.
train_cost
=
paddle
.
layer
.
mse_cost
(
input
=
self
.
output
,
label
=
self
.
click
)
...
...
ctr/train.py
浏览文件 @
489369a4
#!/usr/bin/env python
# -*- coding: utf-8 -*-import os
import
argparse
import
gzip
...
...
@@ -71,12 +73,6 @@ def train():
trainer
=
paddle
.
trainer
.
SGD
(
cost
=
model
.
train_cost
,
parameters
=
params
,
update_equation
=
optimizer
)
# dataset = reader.AvazuDataset(
# args.train_data_path,
# n_records_as_test=args.test_set_size,
# fields=reader.fields,
# feature_dims=reader.feature_dims)
dataset
=
reader
.
Dataset
()
def
__event_handler__
(
event
):
...
...
ctr/utils.py
浏览文件 @
489369a4
import
logging
logging
.
basicConfig
()
logger
=
logging
.
getLogger
(
"
logger
"
)
logger
=
logging
.
getLogger
(
"
paddle
"
)
logger
.
setLevel
(
logging
.
INFO
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录