README.md 4.6 KB
Newer Older
O
overlordmax 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
# ESMM

以下是本例的简要目录结构及说明: 

```
├── README.md			 # 文档
├── net.py				 # ESMM网络结构
├── train.py			 # ESMM模型训练脚本
├── infer.py			 # ESMM模型预测脚本
├── reader.py			 # 数据预处理文件
├── utils.py			 # 通用函数
├── args.py				 # 参数脚本
├── get_data.sh			 # 生成训练数据脚本
├── dataset_generator.py # dataset生成脚本
├── gpu_train.sh		 # gpu训练shell脚本
├── cpu_train.sh		 # cpu训练shell脚本
├── gpu_infer.sh		 # gpu预测shell脚本
├── cpu_infer.sh		 # cpu预测shell脚本
```

## 简介

不同于CTR预估问题,CVR预估面临两个关键问题:

1. **Sample Selection Bias (SSB)** 转化是在点击之后才“有可能”发生的动作,传统CVR模型通常以点击数据为训练集,其中点击未转化为负例,点击并转化为正例。但是训练好的模型实际使用时,则是对整个空间的样本进行预估,而非只对点击样本进行预估。即是说,训练数据与实际要预测的数据来自不同分布,这个偏差对模型的泛化能力构成了很大挑战。
2. **Data Sparsity (DS)** 作为CVR训练数据的点击样本远小于CTR预估训练使用的曝光样本。

ESMM是发表在 SIGIR’2018 的论文[《Entire Space Multi-Task Model: An Effective Approach for Estimating Post-Click Conversion Rate》](  https://arxiv.org/abs/1804.07931  )文章基于 Multi-Task Learning 的思路,提出一种新的CVR预估模型——ESMM,有效解决了真实场景中CVR预估面临的数据稀疏以及样本选择偏差这两个关键问题

本项目再Paddlepaddle定义ESMM的网络结构,并在论文的公开数据集[Ali-CCP:Alibaba Click and Conversion Prediction](  https://tianchi.aliyun.com/datalab/dataSet.html?dataId=408  )验证模型的效果(目前只抽取部分数据验证模型的正确性)。

## 环境

 PaddlePaddle 1.7.0 

 python3.7 

## 数据下载及预处理

执行get_data.sh即可获得处理后的数据

```shell
./get_data.sh
```

## 单机训练

GPU环境

在gpu_train.sh脚本文件中设置好数据路径、参数。

```shell
CUDA_VISIBLE_DEVICES=0 python train.py	--use_gpu True\  #是否使用gpu
                                        --epochs 100\  #训练轮次
                                        --batch_size 64\  #batch_size大小
                                        --embed_size 12\  #每个featsigns的embedding维度
                                        --cpu_num 2\  #cpu数量
                                        --model_dir ./model_dir \  #模型保存路径
                                        --train_data_path ./train_data \  #训练数据路径
                                        --vocab_path ./vocab/vocab_size.txt #embedding词汇表大小路径
```

修改脚本的可执行权限并运行

```shell
./gpu_train.sh
```

CPU环境

在cpu_train.sh脚本文件中设置好数据路径、参数。

```shell
python train.py --use_gpu False\  #是否使用gpu
                --epochs 100\  #训练轮次
                --batch_size 64\  #batch_size大小
                --embed_size 12\  #每个featsigns的embedding维度
                --cpu_num 2\  #cpu数量
                --model_dir ./model_dir \  #模型保存路径
                --train_data_path ./train_data \  #训练数据路径
                --vocab_path ./vocab/vocab_size.txt #embedding词汇表大小路径
```

修改脚本的可执行权限并运行

```
./cpu_train.sh
```

## 预测

GPU环境

在gpu_infer.sh脚本文件中设置好数据路径、参数。

```sh
python infer.py --use_gpu True\  #是否使用gpu
                --batch_size 64\  #batch_size大小
                --test_data_path ./test_data \  #训练数据路径
                --vocab_path ./vocab/vocab_size.txt #embedding词汇表大小路径
```

修改脚本的可执行权限并运行

```shell
./gpu_infer.sh
```

CPU环境

O
overlordmax 已提交
111
在cpu_infer.sh脚本文件中设置好数据路径、参数。
O
overlordmax 已提交
112 113 114 115 116 117 118 119 120

```shell
python infer.py --use_gpu False\  #是否使用gpu
                --batch_size 64\  #batch_size大小
                --cpu_num 2\  #cpu数量
                --test_data_path ./test_data \  #训练数据路径
                --vocab_path ./vocab/vocab_size.txt #embedding词汇表大小路径
```

O
overlordmax 已提交
121 122 123 124 125 126 127 128
修改脚本的可执行权限并运行

```
./cpu_infer.sh
```



O
overlordmax 已提交
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
## 模型效果

目前只抽取部分数据验证模型正确性。模型预测结果实例如下:

> auc_ctr	auc_0.tmp_0		lod: {}
> 	dim: 1
> 	layout: NCHW
> 	dtype: double
> 	data: [0.971812]
> 	
> auc_ctcvr	auc_1.tmp_0		lod: {}
> 	dim: 1
> 	layout: NCHW
> 	dtype: double
> 	data: [0.499668]