From 4f705218a672629dccf762338cd83f569a964088 Mon Sep 17 00:00:00 2001 From: Superjom Date: Fri, 26 May 2017 10:37:01 +0800 Subject: [PATCH] wrap slashed words with ~ --- ctr/README.md | 44 ++++++++-------- ctr/dataset.md | 130 ++++++++++++++++++++++++------------------------ ctr/dataset.org | 90 ++++++++++++++++----------------- ctr/train.py | 14 +++--- 4 files changed, 140 insertions(+), 138 deletions(-) diff --git a/ctr/README.md b/ctr/README.md index 529090be..85460e19 100644 --- a/ctr/README.md +++ b/ctr/README.md @@ -2,29 +2,29 @@

Table of Contents

- + # 背景介绍 @@ -51,7 +51,7 @@ CTR(Click-through rate) 是用来表示用户点击一个特定链接的概率 逐渐地接过 CTR 预估任务的大旗。 - + ## LR vs DNN @@ -73,7 +73,7 @@ LR 对于 NN 模型的优势是对大规模稀疏特征的容纳能力,包括 本文后面的章节会演示如何使用 PaddlePaddle 编写一个结合两者优点的模型。 - + # 数据和任务抽象 @@ -90,14 +90,14 @@ LR 对于 NN 模型的优势是对大规模稀疏特征的容纳能力,包括 具体的特征处理方法参看 [data process](./dataset.md) - + # Wide & Deep Learning Model 谷歌在 16 年提出了 Wide & Deep Learning 的模型框架,用于融合适合学习抽象特征的 DNN 和 适用于大规模稀疏特征的 LR 两种模型的优点。 - + ## 模型简介 @@ -112,7 +112,7 @@ Wide & Deep Learning Model 可以作为一种相对成熟的模型框架使用 而模型右边的 Deep 部分,能够学习特征间的隐含关系,在相同数量的特征下有更好的学习和推导能力。 - + ## 编写模型输入 @@ -136,7 +136,7 @@ click = paddle.layer.data(name='click', type=dtype.dense_vector(1)) ``` - + ## 编写 Wide 部分 @@ -151,7 +151,7 @@ def build_lr_submodel(): ``` - + ## 编写 Deep 部分 @@ -173,7 +173,7 @@ def build_dnn_submodel(dnn_layer_dims): ``` - + ## 两者融合 @@ -195,7 +195,7 @@ def combine_submodels(dnn, lr): ``` - + ## 训练任务的定义 @@ -244,7 +244,7 @@ trainer.train( ``` - + # 引用 diff --git a/ctr/dataset.md b/ctr/dataset.md index 88ea9724..080877e9 100644 --- a/ctr/dataset.md +++ b/ctr/dataset.md @@ -2,59 +2,59 @@

Table of Contents

- + # 数据集介绍 数据集使用 `csv` 格式存储,其中各个字段内容如下: -- 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 -- bannerpos -- siteid -- sitedomain -- sitecategory -- appid -- appdomain -- appcategory -- deviceid -- deviceip -- devicemodel -- devicetype -- deviceconntype -- C14-C21 – anonymized categorical variables - - - +- `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 + + + # 特征提取 @@ -65,18 +65,18 @@ 1. ID 类特征(稀疏,数量多) ```python - id -- siteid -- appid -- deviceid +- `site_id` +- `app_id` +- `device_id` ``` 2. 类别类特征(稀疏,但数量有限) ```python - C1 -- sitecategory -- devicetype -- C14-C21 +- `site_category` +- `device_type` +- `C14-C21` ``` @@ -87,7 +87,7 @@ ``` - + ## 类别类特征 @@ -97,7 +97,7 @@ 2. 类似词向量,用一个 Embedding Table 将每个类别映射到对应的向量 - + ## ID 类特征 @@ -112,7 +112,7 @@ ID 类特征的特点是稀疏数据,但量比较大,直接使用 One-hot 上面的方法尽管存在一定的碰撞概率,但能够处理任意数量的 ID 特征,并保留一定的效果[2]。 - + ## 数值型特征 @@ -122,12 +122,12 @@ ID 类特征的特点是稀疏数据,但量比较大,直接使用 One-hot - 用区间分割处理成类别类特征,稀疏化表示,模糊细微上的差别 - + # 特征处理 - + ## 类别型特征 @@ -177,7 +177,7 @@ class CategoryFeatureGenerator(object): 本任务中,类别类特征会输入到 DNN 中使用。 - + ## ID 类特征 @@ -205,7 +205,7 @@ class IDfeatureGenerator(object): ``` - + ## 交叉类特征 @@ -225,12 +225,12 @@ def gen_cross_fea(self, fea1, fea2): 我们通过组合出两者组合来捕捉这类信息。 - + ## 特征维度 - + ### Deep submodel(DNN)特征 @@ -251,19 +251,19 @@ def gen_cross_fea(self, fea1, fea2): -appcategory +`app_category` 21 -sitecategory +`site_category` 22 -deviceconntype +`device_conn_type` 5 @@ -275,7 +275,7 @@ def gen_cross_fea(self, fea1, fea2): -bannerpos +`banner_pos` 7 @@ -289,7 +289,7 @@ def gen_cross_fea(self, fea1, fea2): - + ### Wide submodel(LR)特征 @@ -311,44 +311,44 @@ def gen_cross_fea(self, fea1, fea2): id -10000 +100000 -siteid -10000 +`site_id` +100000 -appid -10000 +`app_id` +100000 -deviceid -10000 +`device_id` +100000 -deviceid X siteid -1000000 +`device_id` X `site_id` +10000000 Total -1,040,000 +10,400,000 - + # 输入到 PaddlePaddle 中 diff --git a/ctr/dataset.org b/ctr/dataset.org index 9a93d4d4..5ef55c9a 100644 --- a/ctr/dataset.org +++ b/ctr/dataset.org @@ -2,23 +2,23 @@ * 数据集介绍 数据集使用 ~csv~ 格式存储,其中各个字段内容如下: -- 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 +- ~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 * 特征提取 下面我们会简单演示几种特征的提取方式。 @@ -27,15 +27,15 @@ 1. ID 类特征(稀疏,数量多) - id - - site_id - - app_id - - device_id + - ~site_id~ + - ~app_id~ + - ~device_id~ 2. 类别类特征(稀疏,但数量有限) - C1 - - site_category - - device_type - - C14-C21 + - ~site_category~ + - ~device_type~ + - ~C14-C21~ 3. 数值型特征转化为类别型特征 - hour (可以转化成数值,也可以按小时为单位转化为类别) @@ -146,30 +146,30 @@ ID 类特征的特点是稀疏数据,但量比较大,直接使用 One-hot 我们通过组合出两者组合来捕捉这类信息。 ** 特征维度 *** Deep submodel(DNN)特征 -|------------------+-----------| -| feature | dimention | -|------------------+-----------| -| app_category | 21 | -| site_category | 22 | -| device_conn_type | 5 | -| hour | 24 | -| banner_pos | 7 | -|------------------+-----------| -| Total | 79 | -|------------------+-----------| +|--------------------+-----------| +| feature | dimention | +|--------------------+-----------| +| ~app_category~ | 21 | +| ~site_category~ | 22 | +| ~device_conn_type~ | 5 | +| hour | 24 | +| ~banner_pos~ | 7 | +|--------------------+-----------| +| Total | 79 | +|--------------------+-----------| *** Wide submodel(LR)特征 -|---------------------+-----------| -| Feature | Dimention | -|---------------------+-----------| -| id | 10000 | -| site_id | 10000 | -| app_id | 10000 | -| device_id | 10000 | -| device_id X site_id | 1000000 | -|---------------------+-----------| -| Total | 1,040,000 | -|---------------------+-----------| +|-------------------------+-----------| +| Feature | Dimention | +|-------------------------+-----------| +| id | 100000 | +| ~site_id~ | 100000 | +| ~app_id~ | 100000 | +| ~device_id~ | 100000 | +| ~device_id~ X ~site_id~ | 10000000 | +|-------------------------+-----------| +| Total | 10,400,000 | +|-------------------------+-----------| * 输入到 PaddlePaddle 中 Deep 和 Wide 两部分均以 ~sparse_binary_vector~ 的格式[1]输入,输入前需要将相关特征拼合,模型最终只接受 3 个 input, 分别是 diff --git a/ctr/train.py b/ctr/train.py index 9733f3b6..e808d17c 100644 --- a/ctr/train.py +++ b/ctr/train.py @@ -5,9 +5,9 @@ import logging import paddle.v2 as paddle from paddle.v2 import layer from paddle.v2 import data_type as dtype -from data_provider import categorial_features, id_features, field_index, detect_dataset, AvazuDataset, get_all_field_names +from data_provider import field_index, detect_dataset, AvazuDataset -id_features_space = 10000 +id_features_space = 100000 dnn_layer_dims = [128, 64, 32, 1] train_data_path = './train.txt' data_meta_info = detect_dataset(train_data_path, 500000) @@ -90,18 +90,20 @@ trainer = paddle.trainer.SGD( dataset = AvazuDataset(train_data_path, n_records_as_test=test_set_size) + def event_handler(event): if isinstance(event, paddle.event.EndIteration): if event.batch_id % 100 == 0: - logging.warning("Pass %d, Samples %d, Cost %f" % ( - event.pass_id, event.batch_id * batch_size, event.cost)) + logging.warning("Pass %d, Samples %d, Cost %f" % + (event.pass_id, event.batch_id * batch_size, + event.cost)) if event.batch_id % 1000 == 0: result = trainer.test( reader=paddle.batch(dataset.test, batch_size=1000), feeding=field_index) - logging.warning("Test %d-%d, Cost %f" % (event.pass_id, event.batch_id, - result.cost)) + logging.warning("Test %d-%d, Cost %f" % + (event.pass_id, event.batch_id, result.cost)) trainer.train( -- GitLab