-
Notifications
You must be signed in to change notification settings - Fork 2.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
refactor ctr model #138
refactor ctr model #138
Changes from 6 commits
3065a87
d9f8926
a4815f3
489369a
5632c59
98411a5
0fa4720
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,14 +1,29 @@ | ||
# 点击率预估 | ||
|
||
以下是本例目录包含的文件以及对应说明: | ||
|
||
``` | ||
├── README.md # 本教程markdown 文档 | ||
├── dataset.md # 数据集处理教程 | ||
├── images # 本教程图片目录 | ||
│ ├── lr_vs_dnn.jpg | ||
│ └── wide_deep.png | ||
├── 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. 展出广告 | ||
|
@@ -36,13 +51,11 @@ Figure 1. LR 和 DNN 模型结构对比 | |
</p> | ||
|
||
LR 的蓝色箭头部分可以直接类比到 DNN 中对应的结构,可以看到 LR 和 DNN 有一些共通之处(比如权重累加), | ||
但前者的模型复杂度在相同输入维度下比后者可能低很多(从某方面讲,模型越复杂,越有潜力学习到更复杂的信息)。 | ||
|
||
但前者的模型复杂度在相同输入维度下比后者可能低很多(从某方面讲,模型越复杂,越有潜力学习到更复杂的信息); | ||
如果 LR 要达到匹敌 DNN 的学习能力,必须增加输入的维度,也就是增加特征的数量, | ||
这也就是为何 LR 和大规模的特征工程必须绑定在一起的原因。 | ||
|
||
LR 对于 DNN 模型的优势是对大规模稀疏特征的容纳能力,包括内存和计算量等方面,工业界都有非常成熟的优化方法。 | ||
|
||
LR 对于 DNN 模型的优势是对大规模稀疏特征的容纳能力,包括内存和计算量等方面,工业界都有非常成熟的优化方法; | ||
而 DNN 模型具有自己学习新特征的能力,一定程度上能够提升特征使用的效率, | ||
这使得 DNN 模型在同样规模特征的情况下,更有可能达到更好的学习效果。 | ||
|
||
|
@@ -59,10 +72,62 @@ 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)。 | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 77 行 我们使用 Kaggle 上 |
||
|
||
本教程中演示模型的输入格式如下: | ||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
``` | ||
# <dnn input ids> \t <lr input sparse values> \t click | ||
1 23 190 \t 230:0.12 3421:0.9 23451:0.12 \t 0 | ||
23 231 \t 1230:0.12 13421:0.9 \t 1 | ||
``` | ||
|
||
详细的格式描述如下: | ||
|
||
- `dnn input ids` 采用 one-hot 表示,只需要填写值为1的ID(注意这里不是变长输入) | ||
- `lr input sparse values` 使用了 `ID:VALUE` 的表示,值部分最好规约到值域 `[-1, 1]`。 | ||
|
||
此外,模型训练时需要传入一个文件描述 dnn 和 lr两个子模型的输入维度,文件的格式如下: | ||
|
||
具体的特征处理方法参看 [data process](./dataset.md) | ||
``` | ||
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 | ||
OUTPUT_DIR | ||
[--num_lines_to_detect NUM_LINES_TO_DETECT] | ||
[--test_set_size TEST_SET_SIZE] | ||
[--train_size TRAIN_SIZE] | ||
|
||
PaddlePaddle CTR example | ||
|
||
optional arguments: | ||
-h, --help show this help message and exit | ||
--data_path DATA_PATH | ||
path of the Avazu dataset | ||
--output_dir OUTPUT_DIR | ||
directory to output | ||
--num_lines_to_detect NUM_LINES_TO_DETECT | ||
number of records to detect dataset's meta info | ||
--test_set_size TEST_SET_SIZE | ||
size of the validation dataset(default: 10000) | ||
--train_size TRAIN_SIZE | ||
size of the trainset (default: 100000) | ||
``` | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 91 ~ 112 行,(1)用 list 的形式;(2)写一句简要的中文说明来解释重要的参数。 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. done |
||
|
||
- `data_path` 是待处理的数据路径 | ||
- `output_dir` 生成数据的输出路径 | ||
- `num_lines_to_detect` 预先扫描数据生成ID的个数,这里是扫描的文件行数 | ||
- `test_set_size` 生成测试集的行数 | ||
- `train_size` 生成训练姐的行数 | ||
|
||
## Wide & Deep Learning Model | ||
|
||
|
@@ -201,35 +266,99 @@ 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 | ||
2. 执行 `python train.py --train_data_path 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` 生成演示数据 | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
2. 执行 `python train.py --train_data_path ./output/train.txt --test_data_path ./output/test.txt --data_meta_file ./output/data.meta.txt --model_type=0` 开始训练 | ||
|
||
上面第2个步骤可以为 `train.py` 填充命令行参数来定制模型的训练过程,具体的命令行参数及用法如下 | ||
|
||
``` | ||
usage: train.py [-h] --train_data_path TRAIN_DATA_PATH | ||
[--batch_size BATCH_SIZE] [--test_set_size TEST_SET_SIZE] | ||
[--test_data_path TEST_DATA_PATH] [--batch_size BATCH_SIZE] | ||
[--num_passes NUM_PASSES] | ||
[--num_lines_to_detact NUM_LINES_TO_DETACT] | ||
[--model_output_prefix MODEL_OUTPUT_PREFIX] --data_meta_file | ||
DATA_META_FILE --model_type MODEL_TYPE | ||
|
||
PaddlePaddle CTR example | ||
|
||
optional arguments: | ||
-h, --help show this help message and exit | ||
--train_data_path TRAIN_DATA_PATH | ||
path of training dataset | ||
--test_data_path TEST_DATA_PATH | ||
path of testing dataset | ||
--batch_size BATCH_SIZE | ||
size of mini-batch (default:10000) | ||
--test_set_size TEST_SET_SIZE | ||
size of the validation dataset(default: 10000) | ||
--num_passes NUM_PASSES | ||
number of passes to train | ||
--num_lines_to_detact NUM_LINES_TO_DETACT | ||
number of records to detect dataset's meta info | ||
--model_output_prefix MODEL_OUTPUT_PREFIX | ||
prefix of path for model to store (default: | ||
./ctr_models) | ||
--data_meta_file DATA_META_FILE | ||
path of data meta info file | ||
--model_type MODEL_TYPE | ||
model type, classification: 0, regression 1 (default | ||
classification) | ||
``` | ||
|
||
- `train_data_path` : 训练集的路径 | ||
- `test_data_path` : 测试集的路径 | ||
- `num_passes`: 模型训练多少轮 | ||
- `data_meta_file`: 参考[数据和任务抽象](### 数据和任务抽象)的描述。 | ||
- `model_type`: 模型分类或回归 | ||
|
||
|
||
## 用训好的模型做预测 | ||
训好的模型可以用来预测新的数据, 预测数据的格式为 | ||
|
||
``` | ||
# <dnn input ids> \t <lr input sparse values> | ||
1 23 190 \t 230:0.12 3421:0.9 23451:0.12 | ||
23 231 \t 1230:0.12 13421:0.9 | ||
``` | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 用文字描述一下数据格式。 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. done |
||
|
||
这里与训练数据的格式唯一不同的地方,就是没有标签,也就是训练数据中第3列 `click` 对应的数值。 | ||
|
||
`infer.py` 的使用方法如下 | ||
|
||
``` | ||
usage: infer.py [-h] --model_gz_path MODEL_GZ_PATH --data_path DATA_PATH | ||
--prediction_output_path PREDICTION_OUTPUT_PATH | ||
[--data_meta_path DATA_META_PATH] --model_type MODEL_TYPE | ||
|
||
PaddlePaddle CTR example | ||
|
||
optional arguments: | ||
-h, --help show this help message and exit | ||
--model_gz_path MODEL_GZ_PATH | ||
path of model parameters gz file | ||
--data_path DATA_PATH | ||
path of the dataset to infer | ||
--prediction_output_path PREDICTION_OUTPUT_PATH | ||
path to output the prediction | ||
--data_meta_path DATA_META_PATH | ||
path of trainset's meta info, default is ./data.meta | ||
--model_type MODEL_TYPE | ||
model type, classification: 0, regression 1 (default | ||
classification) | ||
``` | ||
|
||
- `model_gz_path_model`:用 `gz` 压缩过的模型路径 | ||
- `data_path` : 需要预测的数据路径 | ||
- `prediction_output_paht`:预测输出的路径 | ||
- `data_meta_file` :参考[数据和任务抽象](### 数据和任务抽象)的描述。 | ||
- `model_type` :分类或回归 | ||
|
||
示例数据可以用如下命令预测 | ||
|
||
``` | ||
python infer.py --model_gz_path <model_path> --data_path output/infer.txt --prediction_output_path predictions.txt --data_meta_path data.meta.txt | ||
``` | ||
|
||
最终的预测结果位于 `predictions.txt`。 | ||
|
||
## 参考文献 | ||
1. <https://en.wikipedia.org/wiki/Click-through_rate> | ||
2. <https://www.kaggle.com/c/avazu-ctr-prediction/data> | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
“满足 query ” 这一句的意义不明白,我不是特别理解。
能否略微再增加一些描述性词汇。