README.md 4.3 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 135
# NCF

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

```
├── README.md # 文档
├── requirements.txt   # 需要的安装包
├── gmf.py # gmf网络文件
├── mlp.py # mlp网络文件
├── neumf.py # neumf网络文件
├── create_data.sh # 生成训练数据脚本
├── Dataset.py # 测试数据集处理
├── get_train_data.py # 生成测试数据集
├── evaluate.py # 预测并计算指标文件
├── train.py # 训练文件
├── infer.py # 预测文件
├── args.py # 参数文件
├── utils.py # 通用函数
├── train_gpu.sh # gpu训练shell脚本
├── train_cpu.sh # cpu训练shell脚本
```

## 简介

很多应用场景,并没有显性反馈的存在。因为大部分用户是沉默的用户,并不会明确给系统反馈“我对这个物品的偏好值是多少”。因此,推荐系统可以根据大量的隐性反馈来推断用户的偏好值。[《Neural Collaborative Filtering 》](https://arxiv.org/pdf/1708.05031.pdf)作者利用深度学习来对user和item特征进行建模,使模型具有非线性表达能力。具体来说使用多层感知机来学习user-item交互函数,提出了一种隐性反馈协同过滤解决方案。

## 环境

 PaddlePaddle 1.7.0 

 python3.7 

## 数据下载及预处理

[Data.zip](https://paddlerec.bj.bcebos.com/ncf/Data.zip)

在create_data.sh脚本文件中添加文件的路径,并运行脚本。

```sh
mkdir Data
pip install -r requirements.txt  #安装必需包
wget -P Data https://paddlerec.bj.bcebos.com/ncf/Data.zip #下载数据集
unzip Data/Data.zip -d Data/
python get_train_data.py --num_neg 4 \ #负采样个数
                --train_data_path "Data/train_data.csv"  #生成训练数据
```



## 单机训练

GPU环境

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

```sh
CUDA_VISIBLE_DEVICES=0 python train.py --use_gpu 1 \ #使用gpu	
                                        --NeuMF 1 \ #nn和gmf网络结合
                                        --epochs 20 \ #训练轮次
                                        --batch_size 256 \ #batch大小
                                        --num_factors 8 \ #gmf网络输入的embedding大小
                                        --num_neg 4 \ #负采样个数
                                        --lr 0.001 \ #学习率
                                        --model_dir 'model_dir' #模型保存目录
```

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

```
./train_gpu.sh
```

CPU环境

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

```sh
python train.py --use_gpu 0 \ #使用cpu	
                --NeuMF 1 \ #nn和gmf网络结合
                --epochs 20 \ #训练轮次
                --batch_size 256 \ #batch大小
                --num_factors 8 \ #gmf网络输入的embedding大小
                --num_neg 4 \ #负采样个数
                --lr 0.001 \ #学习率
                --model_dir 'model_dir'  #模型保存目录
```

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

```
./train_cpu.sh
```

## 单机预测

预测使用CPU环境,速度较快。

```
python infer.py
```

## 模型效果

训练:

```
use_gpu:1, NeuMF:1, epochs:20, batch_size:256, num_factors:8, num_neg:4, lr:0.001, model_dir:model_dir, layers:[64, 32, 16, 8]
W0428 12:15:20.169631  1161 device_context.cc:237] Please NOTE: device: 0, CUDA Capability: 70, Driver API Version: 10.1, Runtime API Version: 9.0
W0428 12:15:20.173840  1161 device_context.cc:245] device: 0, cuDNN Version: 7.3.
2020-04-28 12:15:21,945-INFO: epoch: 0, batch_id: 0, batch_time: 0.01069s, loss: 0.69115
2020-04-28 12:15:21,956-INFO: epoch: 0, batch_id: 1, batch_time: 0.00917s, loss: 0.68997
2020-04-28 12:15:21,976-INFO: epoch: 0, batch_id: 2, batch_time: 0.00901s, loss: 0.68813
...
2020-04-28 12:15:22,726-INFO: epoch: 0, batch_id: 72, batch_time: 0.00874s, loss: 0.44167
2020-04-28 12:15:22,736-INFO: epoch: 0, batch_id: 73, batch_time: 0.00862s, loss: 0.44800
2020-04-28 12:15:22,746-INFO: epoch: 0, batch_id: 74, batch_time: 0.00871s, loss: 0.43535

```

预测:

在参数epoch:20,num_factors:8及用指标HR@10、NDCG@10与论文进行对比:

本例:

```
2020-04-28 12:17:56,541-INFO: epoch: 20, epoch_time: 101.68907s, HR: 0.57268, NDCG: 0.32499
```

论文:

```
HR: 0.688, NDCG: 0.410
```