推荐模型复现(一):熟悉Torch-RecHub框架与使用

简介: Torch-RecHub是一个轻量级的pytorch推荐模型框架

1 Torch-RecHub框架


Torch-RecHub是一个轻量级的pytorch推荐模型框架


1.1 框架概述

核心定位:易使用易扩展、可复现业界实用的推荐模型、聚焦泛生态化的模型复现研究

工程设计:基于PyTorch原生的类和函数,模型训练与模型定义解耦,无basemodel,在符合论文思想的基础上,使同学快速上手

学习参考:参考DeepCTR、FuxiCTR等优秀开源框架的特性


1.2 主要特性

scikit-learn风格易用的API(fit、predict),开箱即用

模型训练与模型定义解耦,易拓展,可针对不同类型的模型设置不同的训练机制

支持pandas的DataFrame、Dict等数据类型的输入,降低上手成本

高度模块化,支持常见Layer,容易调用组装形成新的模型

LR、MLP、FM、FFM、CIN

target-attention、self-attention、transformer

支持常见排序模型

WideDeep、DeepFM、DIN、DCN、xDeepFM等

支持常见召回模型

DSSM、YoutubeDNN、YoutubeDSSM、FacebookEBR、MIND等

丰富的多任务学习支持

SharedBottom、ESMM、MMOE、PLE、AITM等模型

GradNorm、UWL、MetaBanlance等动态loss加权机制

聚焦更生态化的推荐场景

支持丰富的训练机制


1.3 Torch-RecHub架构设计

 Torch-RecHub主要由数据处理模块、模型层模块和训练器模块组成:

image.png

数据处理模块

特征处理:DenseFeature(用于构建数值型特征)、SparseFeature(用于处理类别型特征)、SequenceFeature(用于处理序列特征)

数据构造:DataGenerator(数据生成器,用于创建三大数据集)

模型层模块

排序模型:WideDeep、DeepFM、DCN、xDeepFM、DIN、DIEN、SIM

召回模型:DSSM、YoutubeDNN、YoutubeSBC、FaceBookDSSM、Gru4Rec、MIND、SASRec、ComiRec

多任务模型:SharedBottom、ESMM、MMOE、PLE、AITM

训练器模块

CTRTrainer:用于精排模型训练与评估

MTLTrainer:用于多任务排序模型训练与评估

MatchTrainer:用于召回模型训练与评估


2 Torch-RecHub的使用


 以下采用小样本的criteo数据集,仅有115条数据。该数据集是Criteo Labs发布的在线广告数据集。它包含数百万个展示广告的点击反馈记录,该数据可作为点击率(CTR)预测的基准。数据集具有40个特征,第1列是标签,其中值1表示已点击广告,而值0表示未点击广告。其他特征包含13个dense特征和26个sparse特征。


import numpy as np
import pandas as pd
import torch
from tqdm import tqdm
from sklearn.preprocessing import MinMaxScaler, LabelEncoder
from torch_rechub.basic.features import DenseFeature, SparseFeature
from torch_rechub.utils.data import DataGenerator
from torch_rechub.trainers import CTRTrainer
from torch_rechub.models.ranking import WideDeep
data_path = './data/criteo/criteo_sample.csv'
# 导入数据集
data = pd.read_csv(data_path)
data.head()
label I1  I2  I3  I4  I5  I6  I7  I8  I9  ... C17 C18 C19 C20 C21 C22 C23 C24 C25 C26
0 0 0.0 0 104.0 27.0  1990.0  142.0 4.0 32.0  37.0  ... e5ba7672  25c88e42  21ddcdc9  b1252a9d  0e8585d2  NaN 32c7478e  0d4a6d1a  001f3601  92c878de
1 0 0.0 -1  63.0  40.0  1470.0  61.0  4.0 37.0  46.0  ... e5ba7672  d3303ea5  21ddcdc9  b1252a9d  7633c7c8  NaN 32c7478e  17f458f7  001f3601  71236095
2 0 0.0 370 4.0 1.0 1787.0  65.0  14.0  25.0  489.0 ... 3486227d  642f2610  55dd3565  b1252a9d  5c8dc711  NaN 423fab69  45ab94c8  2bf691b1  c84c4aec
3 1 19.0  10  30.0  10.0  1.0 3.0 33.0  47.0  126.0 ... e5ba7672  a78bd508  21ddcdc9  5840adea  c2a93b37  NaN 32c7478e  1793a828  e8b83407  2fede552
4 0 0.0 0 36.0  22.0  4684.0  217.0 9.0 35.0  135.0 ... e5ba7672  7ce63c71  NaN NaN af5dc647  NaN dbb486d7  1793a828  NaN NaN
5 rows × 40 columns
dense_features = [f for f in data.columns.tolist() if f[0] == "I"]
sparse_features = [f for f in data.columns.tolist() if f[0] == "C"]
# 数据NaN值填充,对sparse特征的NaN数据填充字符串为-996,对dense特征的NaN数据填充0
data[sparse_features] = data[sparse_features].fillna('-996',)
data[dense_features] = data[dense_features].fillna(0,)
def convert_numeric_feature(val):
    v = int(val)
    if v > 2:
        return int(np.log(v)**2)
    else:
        return v - 2
# 进行归一化
for feat in dense_features:
    sparse_features.append(feat + "_cat")
    data[feat + "_cat"] = data[feat].apply(lambda x: convert_numeric_feature(x))
sca = MinMaxScaler()  #scaler dense feature
data[dense_features] = sca.fit_transform(data[dense_features])
# 处理sparse特征数据
for feat in sparse_features:
    lbe = LabelEncoder()
    data[feat] = lbe.fit_transform(data[feat])
# 得到最终的数据
dense_feas = [DenseFeature(feature_name) for feature_name in dense_features]
sparse_feas = [SparseFeature(feature_name, vocab_size=data[feature_name].nunique(), embed_dim=16) for feature_name in sparse_features]
y = data["label"]
del data["label"]
x = data
# 构造数据生成器
data_generator = DataGenerator(x, y)
batch_size = 2048
# 将数据集分隔成训练集70%、验证集10%和测试集20%
train_dataloader, val_dataloader, test_dataloader = data_generator.generate_dataloader(split_ratio=[0.7, 0.1], batch_size=batch_size)
the samples of train : val : test are  80 : 11 : 24
# 配置多层感知器模块的参数
mlp_params={
    "dims": [256, 128], 
    "dropout": 0.2, 
    "activation": "relu"}
# 构建WideDeep模型
model = WideDeep(wide_features=dense_feas, deep_features=sparse_feas, mlp_params=mlp_params)
learning_rate = 1e-3
weight_decay = 1e-3
device = 'cuda:0'
save_dir = './models/'
epoch = 2
optimizer_params={
    "lr": learning_rate, 
    "weight_decay": weight_decay}
# 构建训练器
ctr_trainer = CTRTrainer(model, optimizer_params=optimizer_params, n_epoch=epoch, earlystop_patience=10, 
                         device=device, model_path=save_dir)
# 模型训练
ctr_trainer.fit(train_dataloader, val_dataloader)
epoch: 0
train: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:12<00:00, 12.33s/it]
validation: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:10<00:00, 10.66s/it]
epoch: 0 validation: auc: 0.35
epoch: 1
train: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:10<00:00, 10.71s/it]
validation: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:10<00:00, 10.69s/it]
epoch: 1 validation: auc: 0.35
 模型评估
auc = ctr_trainer.evaluate(ctr_trainer.model, test_dataloader)
print(f'test auc: {auc}')
validation: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:10<00:00, 10.60s/it]
test auc: 0.6203703703703703


3 总结


 本次任务,主要介绍了Torch-RecHub框架和基本的使用方法:

Torch-RecHub框架主要基于PyTorch和sklearn,易使用易扩展、可复现业界实用的推荐模型,高度模块化,支持常见Layer,支持常见排序模型、召回模型、多任务学习;

使用方法:使用DataGenerator构建数据加载器,通过构建轻量级的模型,并基于统一的训练器进行模型训练,最后完成模型评估。


目录
相关文章
|
7月前
|
机器学习/深度学习 监控 算法
Keras进阶:模型调优与部署
该文介绍了Keras模型调优与部署的策略。调优包括调整网络结构(增减层数、改变层类型、使用正则化)、优化算法与参数(选择优化器、学习率衰减)、数据增强(图像变换、噪声添加)、模型集成(Bagging、Boosting)和超参数搜索(网格搜索、随机搜索、贝叶斯优化)。部署涉及模型保存加载、压缩(剪枝、量化、蒸馏)、转换(TensorFlow Lite、ONNX)和服务化(TensorFlow Serving、Docker)。文章强调了持续监控与更新的重要性,以适应不断变化的数据和需求。【6月更文挑战第7天】
155 8
|
8月前
|
算法 数据可视化 TensorFlow
【经验与Bug】tensorflow草记
1 常用小知识 conda activate tf 在anaconda prompt使用,进入名为tf的虚拟环境。 pip install <包名>== 可以查看指定包能被找到的所有版本。 pip install <包名> -i https://pypi.org/simple
71 0
|
8月前
|
机器学习/深度学习 传感器 算法
PyTorch基础之优化器模块、训练和测试模块讲解(附源码)
PyTorch基础之优化器模块、训练和测试模块讲解(附源码)
186 0
|
机器学习/深度学习 移动开发 数据挖掘
如何用CSharpOpenCv集成Yolov3的模型
如何用CSharpOpenCv集成Yolov3的模型
325 0
如何用CSharpOpenCv集成Yolov3的模型
|
编解码 并行计算 算法
MMdetection框架速成系列 第01部分:学习路线图与步骤+优先学习的两个目标检测模型代码+loss计算流程+遇到问题如何求助+Anaconda3下的安装教程(mmdet+mmdet3d)
Tip:目前 MMDetection 实现的算法中主要包括 one-stage 和 two-stage 算法,而 two-stage 算法可以简单认为是 one-stage + pool + one-stage 步骤。
993 0
|
PyTorch 算法框架/工具 异构计算
动手撸个自己的数据集进行训练Pytorch框架(索引式)
动手撸个自己的数据集进行训练Pytorch框架(索引式)
767 0
动手撸个自己的数据集进行训练Pytorch框架(索引式)
从零开始带你一步一步使用 YOLOv3 测试自己的数据
从零开始带你一步一步使用 YOLOv3 测试自己的数据
385 0
从零开始带你一步一步使用 YOLOv3 测试自己的数据
|
API 算法框架/工具 Python
DL之Keras:基于Keras框架建立模型实现【预测】功能的简介、设计思路、案例分析、代码实现之详细攻略(经典,建议收藏)(一)
DL之Keras:基于Keras框架建立模型实现【预测】功能的简介、设计思路、案例分析、代码实现之详细攻略(经典,建议收藏)
DL之Keras:基于Keras框架建立模型实现【预测】功能的简介、设计思路、案例分析、代码实现之详细攻略(经典,建议收藏)(一)
|
机器学习/深度学习 JSON 移动开发
DL框架之Keras:深度学习框架Keras框架的简介、安装(Python库)、相关概念、Keras模型使用、使用方法之详细攻略(三)
DL框架之Keras:深度学习框架Keras框架的简介、安装(Python库)、相关概念、Keras模型使用、使用方法之详细攻略
DL框架之Keras:深度学习框架Keras框架的简介、安装(Python库)、相关概念、Keras模型使用、使用方法之详细攻略(三)
|
机器学习/深度学习 测试技术 API
DL框架之Keras:深度学习框架Keras框架的简介、安装(Python库)、相关概念、Keras模型使用、使用方法之详细攻略(二)
DL框架之Keras:深度学习框架Keras框架的简介、安装(Python库)、相关概念、Keras模型使用、使用方法之详细攻略
DL框架之Keras:深度学习框架Keras框架的简介、安装(Python库)、相关概念、Keras模型使用、使用方法之详细攻略(二)