README.md 4.5 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 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
# Fibinet

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

```
├── README.md # 文档
├── requirements.txt   # 需要的安装包
├── net.py # Fibinet网络文件
├── feed_generator.py # 数据读取文件
├── args.py # 参数脚本
├── get_data.sh # 生成训练数据脚本
├── train.py # 训练文件
├── infer.py # 预测文件
├── train_gpu.sh # gpu训练shell脚本
├── train_cpu.sh # cpu训练shell脚本
├── infer_gpu.sh # gpu预测shell脚本
├── infer_cpu.sh # cpu预测shell脚本
```

## 简介

[《FiBiNET: Combining Feature Importance and Bilinear feature Interaction for Click-Through Rate Prediction》]( https://arxiv.org/pdf/1905.09433.pdf)是新浪微博机器学习团队发表在RecSys19上的一篇论文,文章指出当前的许多通过特征组合进行CTR预估的工作主要使用特征向量的内积或哈达玛积来计算交叉特征,这种方法忽略了特征本身的重要程度。提出通过使用Squeeze-Excitation network (SENET) 结构动态学习特征的重要性以及使用一个双线性函数来更好的建模交叉特征。
本项目在paddlepaddle上实现FibiNET的网络结构,并在开源数据集Criteo上验证模型效果,

## 数据下载及预处理

数据地址:[Criteo]( https://fleet.bj.bcebos.com/ctr_data.tar.gz)

(1)将原始训练集按9:1划分为训练集和验证集

(2)数值特征(连续特征)进行归一化处理

## 环境

 PaddlePaddle 1.7.0 

 python3.7 

## 单机训练

GPU环境

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

```sh
CUDA_VISIBLE_DEVICES=0 python train.py --use_gpu 1 \ #使用gpu
                                    --train_files_path ./train_data_full \ #全量训练数据
                                    --model_dir ./model_dir \ #模型路径
                                    --learning_rate 0.001 \ 
                                    --batch_size 1000 \
                                    --epochs 10 \
                                    --reduction_ratio 3 \ #SENET超参数
                                    --dropout_rate 0.5 
                                    --embedding_size 10
```

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

```
./train_gpu.sh
```

CPU环境

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

```sh
python train.py --use_gpu 0 \ #使用cpu
                --train_files_path ./train_data_full \ #全量训练数据
                --model_dir ./model_dir \ #模型路径
                --learning_rate 0.001 \ 
                --batch_size 1000 \
                --epochs 10 \
                --reduction_ratio 3 \ #SENET超参数
                --dropout_rate 0.5 
                --embedding_size 10
```

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

```
./train_cpu.sh
```

## 单机预测

GPU环境

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

```sh
CUDA_VISIBLE_DEVICES=0 python train.py --use_gpu 0 \ #使用gpu
                                    --test_files_path ./test_data_full \ #使用全量测试数据
                                    --model_dir ./model_dir \ #模型路径
                                    --test_epoch 10 #选择哪个epoch的模型参数进行预测
```

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

```
./infer_gpu.sh
```

CPU环境

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

```sh
python train.py --use_gpu 0 \ #使用cpu
                --test_files_path ./test_data_full \ #使用全量测试数据
                --model_dir ./model_dir \ #模型路径
                --test_epoch 10 #选择哪个epoch的模型参数进行预测
```

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

```
./infer_cpu.sh
```

## 模型效果

训练:

```
2020-06-10 23:34:45,195-INFO: epoch_id: 0, batch_id: 33952, batch_time: 1.26086s, loss: 0.44914, auc: 0.79089
2020-06-10 23:34:46,369-INFO: epoch_id: 0, batch_id: 33953, batch_time: 1.17280s, loss: 0.46410, auc: 0.79089
2020-06-10 23:34:47,413-INFO: epoch_id: 0, batch_id: 33954, batch_time: 1.04139s, loss: 0.43496, auc: 0.79089
2020-06-10 23:34:48,248-INFO: epoch_id: 0, batch_id: 33955, batch_time: 0.83510s, loss: 0.45980, auc: 0.79089
2020-06-10 23:34:49,379-INFO: epoch_id: 0, batch_id: 33956, batch_time: 1.13043s, loss: 0.46738, auc: 0.79089
2020-06-10 23:34:50,392-INFO: epoch_id: 0, batch_id: 33957, batch_time: 1.01046s, loss: 0.46724, auc: 0.79089
2020-06-10 23:34:51,440-INFO: epoch_id: 0, batch_id: 33958, batch_time: 1.04752s, loss: 0.44079, auc: 0.79089
```