From 489369a40223bfdfcc46dd17af4b0ff89ef4f0be Mon Sep 17 00:00:00 2001
From: Superjom
Date: Mon, 17 Jul 2017 15:14:29 +0800
Subject: [PATCH] fix PR
---
ctr/README.md | 60 ++++++++++++++++++++++++-------------
ctr/avazu_data_processer.py | 6 ++--
ctr/index.html | 60 ++++++++++++++++++++++++-------------
ctr/network_conf.py | 12 ++------
ctr/train.py | 8 ++---
ctr/utils.py | 2 +-
6 files changed, 87 insertions(+), 61 deletions(-)
diff --git a/ctr/README.md b/ctr/README.md
index c804dab6..e3436b6e 100644
--- a/ctr/README.md
+++ b/ctr/README.md
@@ -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 模型结构对比
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:
+lr_input_dim:
+```
+
+其中, `` 表示一个整型数值。
+
+本目录下的 `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` 的使用方法如下
```
diff --git a/ctr/avazu_data_processer.py b/ctr/avazu_data_processer.py
index 884e09d1..da21e395 100644
--- a/ctr/avazu_data_processer.py
+++ b/ctr/avazu_data_processer.py
@@ -1,4 +1,5 @@
-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
diff --git a/ctr/index.html b/ctr/index.html
index 4c00a995..78f612f4 100644
--- a/ctr/index.html
+++ b/ctr/index.html
@@ -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 模型结构对比
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:
+lr_input_dim:
+```
+
+其中, `` 表示一个整型数值。
+
+本目录下的 `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` 的使用方法如下
```
diff --git a/ctr/network_conf.py b/ctr/network_conf.py
index 6b38f57c..d577abcf 100644
--- a/ctr/network_conf.py
+++ b/ctr/network_conf.py
@@ -1,6 +1,5 @@
#!/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)
diff --git a/ctr/train.py b/ctr/train.py
index fd1c25a0..64831089 100644
--- a/ctr/train.py
+++ b/ctr/train.py
@@ -1,3 +1,5 @@
+#!/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):
diff --git a/ctr/utils.py b/ctr/utils.py
index 0ff36336..d8cf569c 100644
--- a/ctr/utils.py
+++ b/ctr/utils.py
@@ -1,7 +1,7 @@
import logging
logging.basicConfig()
-logger = logging.getLogger("logger")
+logger = logging.getLogger("paddle")
logger.setLevel(logging.INFO)
--
GitLab