本项目使用 TensorFlow、PySpark、Sklearn 实现了一些工业界经典的推荐算法模型
- python 3.7
- pyspark 2.4
- tensorflow 2.0 +
- scikit-learn 0.21
电影评分数据集,包括训练集和测试集。数据集为用户给电影评分的日志,数据集已经拼接了用户特征和电影特征,数据集字段包括:
字段名称 | 字段含义 |
---|---|
movieId | 电影id |
userId | 用户id |
rating | 评分,分值在[0, 5]之间 |
timestamp | 评分的时间 |
label | 样本标签。评分大于等于3.5时,label为1;评分小于3.5时,label为0 |
releaseYear | 电影发行年份 |
movieGenre1 ~ movieGenre3 | 电影的类型 |
movieRatingCount | 对该电影有过评分的用户数 |
movieAvgRating | 该电影评分的平均值 |
movieRatingStddev | 该电影评分的标准差 |
userRatedMovie1 ~ userRatedMovie5 | 用户最近好评过的电影id |
userRatingCount | 用户评分总数 |
userAvgReleaseYear | 用户好评电影年份的平均值 |
userReleaseYearStddev | 用户好评电影年份的标准差 |
userAvgRating | 用户评分平均值 |
userRatingStddev | 用户评分标准差 |
userGenre1 ~ userGenre5 | 用户喜欢的电影风格 |
GBDT+LR 是FaceBook在2014年提出的CTR模型,用于广告推荐场景。它是由GBDT和LR两个模型组合而成:
- GBDT 用于特征的自动筛选、交叉,树的深度决定了特征交叉的阶数,最终生成新的特征向量。相比RF,GBDT每颗树学习到的特征划分与组合方式都有所区别
- LR模型的输入即为GBDT输出的特征向量
- GBDT 用于构建特征工程,LR用于CTR预估,这两部分模型是独立训练的
-
GBDT模型采用
lightgbm
实现,LR模型采用sklearn
实现 -
数据集为
电影评分数据集
-
训练集效果:
train_log_loss: 0.5462617591783033 train_auc: 0.7896601538547148
-
测试集效果:
test_log_loss: 0.5645459026988678 test_auc: 0.7726261543531365
DeepCrossing 是微软在2016年提出的CTR模型,用于Bing搜索引擎的广告搜索推荐场景。其结构如下:
- Feature层:包括类别型特征与数值型特征
- Embedding层:类别型特征需要做embedding处理,数值型特征不需要
- Stacking层:将embedding特征与数值型特征拼接起来
- Multiple Residual Units 层:由残差神经元组成的多层神经网络(本案例使用普通感知机组成的多层神经网络)
- Scoring 层:输出层,取值范围为[0, 1]
- 采用
tensorflow
实现 - 数据集为
电影评分数据集
- 训练集效果:
7403/7403 [==============================] - 106s 14ms/step - loss: 2.5708 - auc: 0.5857 Epoch 2/5 7403/7403 [==============================] - 85s 12ms/step - loss: 0.6333 - auc: 0.7135 Epoch 3/5 7403/7403 [==============================] - 108s 15ms/step - loss: 0.5551 - auc: 0.7814 Epoch 4/5 7403/7403 [==============================] - 84s 11ms/step - loss: 0.5178 - auc: 0.8160 Epoch 5/5 7403/7403 [==============================] - 86s 12ms/step - loss: 0.4954 - auc: 0.8346
- 测试集效果:
1870/1870 [==============================] - 16s 9ms/step - loss: 0.6003 - auc: 0.7541
Wide&Deep 是Google在2016年提出的CTR模型,用于应用商店的APP推荐。
-
Wide部分具有较强的“记忆能力”,能够直接记住每个特征与标签的相关性,产生类似于“如果用户偏好
二次元
标签,就推荐物品A
”的规则推荐Wide部分输入特征为
已经安装的APP
、将要曝光的APP
。它们俩可以做交叉积变换 -
Deep部分具有较强的“泛化能力”,能够发掘稀有特征组合与标签的相关性
- 采用
tensorflow
实现 - 数据集为
电影评分数据集
- 训练集效果:
7403/7403 [==============================] - 176s 24ms/step - loss: 0.7374 - auc: 0.6285 Epoch 2/5 7403/7403 [==============================] - 129s 17ms/step - loss: 0.5981 - auc: 0.7376 Epoch 3/5 7403/7403 [==============================] - 128s 17ms/step - loss: 0.5453 - auc: 0.7922 Epoch 4/5 7403/7403 [==============================] - 109s 15ms/step - loss: 0.5042 - auc: 0.8276 Epoch 5/5 7403/7403 [==============================] - 131s 18ms/step - loss: 0.4792 - auc: 0.8468
- 测试集效果:
1870/1870 [==============================] - 19s 10ms/step - loss: 0.6073 - auc: 0.7529