当前位置: 首页 > article >正文

DeepCross模型实现推荐算法

1. 项目简介

A032-DeepCross项目是一个基于深度学习的推荐算法实现,旨在解决个性化推荐问题。随着互联网平台上信息和内容的爆炸式增长,用户面临着信息过载的困境,如何为用户提供高效、精准的推荐成为了关键。该项目背景基于现代推荐系统的发展,利用用户行为数据和内容特征,来生成符合用户偏好的推荐结果。项目使用的核心模型是DeepCross模型,这是一种结合了深度神经网络(DNN)和交叉特征结构的混合模型。DeepCross模型通过对用户和物品的特征进行嵌入,并应用交叉特征层来捕捉不同特征之间的高阶交互,进而提升推荐精度。与传统的矩阵分解模型相比,DeepCross模型能够更好地处理非线性关系,适用于处理大量的稀疏数据,广泛应用于电商、社交平台、内容推荐等场景。通过该项目的实现,目标是优化现有推荐算法的效果,并为用户提供更精准的个性化内容推荐体验。

在这里插入图片描述

2.技术创新点摘要

混合架构: DeepCross模型结合了两种架构的优势:深度神经网络(DNN)和交叉网络。DNN用于捕捉特征之间的高阶非线性交互,而交叉网络则高效地建模不同层次的特征交叉,避免了手动特征工程的复杂性。这种模型的融合能够更好地表示特征交互,提升推荐系统捕捉数据中低阶和高阶模式的能力。

高效的特征交叉层: 交叉网络引入了一种独特的特征交互机制,通过在每一层计算输入特征的交叉积来实现。这一过程允许模型在保持计算效率的同时,明确地建模原始特征之间的交互关系。与传统的基于多项式的模型不同,交叉网络能够建模高阶交互,而不会导致参数数量的指数级增加。

StepRunner和EpochRunner类的模块化训练: 代码中实现的StepRunnerEpochRunner类将训练过程模块化,使得管理单个步骤和基于epoch的更新变得更加简便。这种结构为集成优化技术(如学习率调度器和训练过程中的评估指标)提供了灵活性,使得该模型能够更好地适应不同的数据集和训练需求。

正则化与性能监控: 在整个训练过程中,模型有效地集成了正则化策略,并监控关键性能指标。例如,模型通过AUC(曲线下面积)等指标来跟踪性能,确保模型在训练过程中持续优化,减少过拟合的风险,并确保模型在处理未见数据时具备良好的泛化能力。

3. 数据集与预处理

在DeepCross模型项目中,数据集来源于某个推荐系统领域,包含用户行为数据和物品特征数据。该数据集的特点包括:高维、稀疏性较强,且包含大量的类别型特征(如用户ID、物品ID、性别、地区等)。这种类型的数据集通常具有大量离散化的特征,需要有效的预处理和特征工程,以提高模型的性能。

数据预处理流程主要包括以下几个步骤:

  1. 缺失值处理:首先,对数据中的缺失值进行处理。某些数值型特征的缺失值可以用均值、中位数或其他统计值进行填充,而类别型特征可以用特殊的“未知”类别进行标记。
  2. 特征编码:由于类别型特征不能直接输入到模型中,需要将其转换为数值形式。常用的编码方式包括独热编码(One-Hot Encoding)和嵌入表示(Embedding) 。对于高维类别型特征,模型采用嵌入方式,将每个类别映射到一个低维的向量空间中,从而减少计算量并保留更多的特征信息。
  3. 归一化:数值型特征通常需要进行归一化处理,将不同量级的特征值缩放到同一范围,以避免某些特征对模型的影响过大。常用的归一化方法包括最小-最大缩放标准化
  4. 特征交叉:特征工程的重要环节是进行特征交叉,通过组合不同的特征来生成新的交叉特征。这一过程能够捕捉不同特征之间的潜在关系,有助于提高模型的预测性能。DeepCross模型利用其特有的交叉网络结构,自动完成特征交叉的过程,避免了手动设计交叉特征的复杂性。
  5. 数据拆分:为了评估模型的性能,数据集通常会按照一定比例拆分为训练集、验证集和测试集。在本项目中,使用了标准的80/20的拆分比例,将大部分数据用于训练模型,其余用于验证和测试模型的泛化能力。

4. 模型架构

从代码中可以看出,模型是基于DeepCross模型的实现,具体使用了CrossNetMatrix模块来构建Deep Cross V2(DCNV2)模型。下面是关于模型架构的详细解释:

1. 模型结构的逻辑

该模型的结构包括两大部分:交叉网络(Cross Network)多层感知机(MLP,Multi-Layer Perceptron) 。具体架构如下:

  1. 输入层

    1. 输入包括两类特征:数值型特征和类别型特征。
    2. 对数值型特征,直接输入至网络中,记为 Xnum。
    3. 对类别型特征,采用嵌入表示(Embedding),将类别型特征映射为低维稠密向量,记为 Xcat。这些嵌入向量的维度为 dembed。
  2. 交叉网络(Cross Network)

    1. 交叉网络的主要作用是捕捉特征之间的高阶交互,避免手动特征工程。
    2. 模型使用的是CrossNetMatrix,其中每一层的计算公式为:
    3. x l + 1 = x 0 x l T W l + b l + x l \mathbf{x}_{l+1} = \mathbf{x}_0 \mathbf{x}_l^T \mathbf{W}_l + \mathbf{b}_l + \mathbf{x}_l xl+1=x0xlTWl+bl+xl
    4. 其中,xl\mathbf{x}_lxl 是第 lll 层的输入特征,Wl\mathbf{W}_lWl 是该层的权重矩阵,bl\mathbf{b}_lbl 是偏置项,x0\mathbf{x}_0x0 是初始输入特征。通过这一操作,模型在不同层次上交叉输入特征,捕捉特征间的多阶交互。
  3. 多层感知机(MLP)

    1. 交叉网络输出的特征被传入多层感知机(MLP),用于进一步捕捉特征的非线性关系。
    2. MLP的结构为多层全连接层,使用ReLU激活函数,层与层之间加入了Dropout以防止过拟合。
      1. h i + 1 = ReLU ( W i h i + b i ) \mathbf{h}_{i+1} = \text{ReLU}(\mathbf{W}_i \mathbf{h}_i + \mathbf{b}_i) hi+1=ReLU(Wihi+bi)
    3. 其中 Wi\mathbf{W}_iWi 和 bi\mathbf{b}_ibi 分别是第 iii 层的权重矩阵和偏置项,hi\mathbf{h}_ihi 是第 iii 层的输出。
  4. 输出层

    1. 最终输出层使用Sigmoid激活函数,输出为一个概率值,表示样本属于某个类别的概率: y ^ = σ ( W out h + b out ) \hat{y} = \sigma(\mathbf{W}_{\text{out}} \mathbf{h} + \mathbf{b}_{\text{out}}) y^=σ(Wouth+bout)
    2. 其中 σ是Sigmoid函数,Wout是输出层的权重矩阵。

2. 模型的整体训练流程

  • 损失函数: 模型使用二元交叉熵损失(Binary Cross-Entropy Loss)来衡量预测结果与真实标签之间的差距。其公式为:
  • L = − 1 N ∑ i = 1 N [ y i log ⁡ ( y ^ i ) + ( 1 − y i ) log ⁡ ( 1 − y ^ i ) ] \mathcal{L} = -\frac{1}{N} \sum_{i=1}^N [y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i)] L=N1i=1N[yilog(y^i)+(1yi)log(1y^i)]
  • 其中,NNN 是样本数量,yiy_iyi 是真实标签,yi\hat{y}_iyi 是模型预测的概率值。
  • 优化器: 模型使用Adam优化器进行训练,自动调整学习率以加快收敛速度。
  • 评估指标: 模型主要使用AUC(ROC曲线下面积)作为评估指标。AUC衡量了模型区分正负样本的能力,AUC值越高,说明模型性能越好。

5. 核心代码详细讲解

1. 数据预处理和特征工程
from sklearn.preprocessing import LabelEncoder, QuantileTransformer
from sklearn.pipeline import Pipeline 
from sklearn.impute import SimpleImputer 
dfdata = pd.read_csv("/home/mw/input/eat_pytorch_datasets3807/eat_pytorch_datasets/eat_pytorch_datasets/criteo_small.zip",sep="\t",header=None)
dfdata.columns = ["label"] + ["I"+str(x) for x in range(1,14)] + ["C"+str(x) for x in range(14,40)]
cat_cols = [x for x in dfdata.columns if x.startswith('C')]
num_cols = [x for x in dfdata.columns if x.startswith('I')]
num_pipe = Pipeline(steps = [('impute', SimpleImputer()), ('quantile', QuantileTransformer())])

for col in cat_cols:
    dfdata[col] = LabelEncoder().fit_transform(dfdata[col])
dfdata[num_cols] = num_pipe.fit_transform(dfdata[num_cols])
categories = [dfdata[col].max() + 1 for col in cat_cols]
  • LabelEncoder: 将类别型特征编码为整数,便于模型处理。
  • SimpleImputer: 用于填充数值型特征中的缺失值。
  • QuantileTransformer: 将数值型特征进行分位数归一化处理,将数据转换为均匀分布。
  • Pipeline: 将缺失值填充和归一化操作结合在一起,应用于数值型特征。
  • LabelEncoder应用于每个类别型特征,将其转换为数值。
  • 最后计算categories: 通过统计每个类别型特征的最大值,生成类别数量列表,用于嵌入层的初始化。

2. 模型架构构建
def create_net():
    net = DeepCross(
        d_numerical= ds_train.X_num.shape[1],
        categories= ds_train.get_categories(),
        d_embed_max = 8,
        n_cross = 2, cross_type = "matrix",
        mlp_layers = [128,64,32], mlp_dropout=0.25,
        stacked = True,
        n_classes = 1
    )return net
  • DeepCross模型: 该模型由交叉网络和多层感知机(MLP)构成。
  • d_numerical: 数值特征的维度,输入到网络中的数值特征数量。
  • categories: 类别型特征的嵌入层信息,包含每个类别的类别数。
  • d_embed_max: 设置嵌入层的最大维度(8维),用于类别型特征嵌入。
  • n_cross: 设置交叉网络的层数(2层交叉层),用于高阶特征交叉。
  • cross_type: 使用的是交叉网络的"matrix"方式,即CrossNetMatrix。
  • mlp_layers: 设置MLP的层数及每层的节点数,分别为128, 64, 32。
  • mlp_dropout: 设置每层MLP的Dropout比例,防止过拟合。
  • stacked: 是否使用堆叠式的MLP结构。
  • n_classes: 设置模型的输出节点数,这里是二分类问题,因此输出节点为1。

3. 模型训练与评估
model = KerasModel(net,
                   loss_fn = nn.BCEWithLogitsLoss(),
                   metrics_dict = {"auc": AUC()},
                   optimizer = torch.optim.Adam(net.parameters(), lr=0.002, weight_decay=0.001)
                  )
dfhistory = model.fit(train_data=dl_train, val_data=dl_val, epochs=20, patience=5,
                      monitor = "val_auc", mode="max", ckpt_path='checkpoint.pt')
val_auc = roc_auc_score(labels.cpu().numpy(), preds.cpu().numpy())
  • KerasModel: 定义了深度学习模型的训练与评估流程,封装了模型、损失函数、评估指标、优化器等。
  • loss_fn: 使用二元交叉熵损失(BCEWithLogitsLoss),适合二分类任务。
  • metrics_dict: 设置AUC作为模型的评估指标。
  • optimizer: 使用Adam优化器,并且设置学习率为0.002,权重衰减参数为0.001。
  • model.fit: 开始训练模型,设置了训练和验证数据、训练轮次(20轮)、早停机制(5轮无提升则停止)和监控的指标(AUC)。
  • roc_auc_score: 计算模型在验证集上的AUC值,用于评估模型的性能。

6. 模型优缺点评价

优点:
  1. 高效的特征交叉:DeepCross模型通过交叉网络自动捕捉特征之间的高阶交互,避免了手动特征工程的复杂性。通过这种方式,模型能够有效处理类别型和数值型特征之间的关系,并在推荐任务中表现出色。
  2. 灵活的嵌入表示:模型对类别型特征使用了嵌入层,将高维的离散特征转换为低维的稠密表示,降低了模型的计算复杂度,同时保留了特征的语义信息。
  3. 多层感知机(MLP)的非线性建模能力:MLP能够进一步提取非线性特征,增强模型对复杂数据的表达能力,从而提升预测精度。
  4. AUC评估指标:使用AUC作为模型性能的评估指标,适合二分类任务,能够较好地衡量模型的区分能力。
缺点:
  1. 过拟合的潜在风险:虽然模型使用了Dropout等正则化技术,但在处理小数据集时,仍然存在过拟合的风险。特别是当MLP层数较多时,模型容易拟合训练数据,但在测试数据上的表现可能不理想。
  2. 对类别型特征处理的局限性:尽管嵌入层能够有效处理类别型特征,但对于类别数量过多或过少的特征,嵌入维度的选择可能不够灵活,导致信息丢失或计算资源浪费。
  3. 模型复杂性高:由于模型结合了交叉网络和MLP,计算复杂度较高,尤其是当数据量大时,训练时间和资源需求较大。
改进方向:
  1. 模型结构优化:可以尝试增加更多层次的交叉网络,以捕捉更复杂的特征交互。同时,可以引入注意力机制,使模型能够更好地聚焦于重要特征。
  2. 超参数调整:进一步优化嵌入层维度、交叉层数、MLP节点数等超参数,提升模型的整体性能。
  3. 更多的数据增强方法:可以在数据预处理阶段引入更多的数据增强方法,如SMOTE或类别平衡技术,以应对类别不平衡问题,提高模型的泛化能力。

↓↓↓更多热门推荐:

DeepFM模型预测高潜购买用户
CNN-LSTM住宅用电量预测

点赞收藏关注,免费获取本项目代码和数据集,点下方名片↓↓↓


http://www.kler.cn/a/315358.html

相关文章:

  • UAC2.0 speaker——同时支持 16bit,24bit 和 32bit
  • Ceph 中PG与PGP的概述
  • SHA-256哈希函数
  • 用MVVM设计模式提升WPF开发体验:分层架构与绑定实例解析
  • 【VIM】vim 常用命令
  • ios swift开发--ios远程推送通知配置
  • 【软件测试】--xswitch将请求代理到测试桩
  • 【linux】df命令
  • 『玉竹』基于Laravel 开发的博客、微博客系统和Android App
  • Android 命令行关机
  • Google 官方数据库框架Room使用教程
  • 【MySQL 03】表的操作
  • mpls 动态LSP的标签发布协议
  • TCP/IP - IP
  • 鸿蒙NEXT生态应用核心技术理念:统一生态,原生智能
  • web自动化学习笔记
  • K8s 之控制器的定义及详细调用案例
  • SpringBoot 整合 Caffeine 实现本地缓存
  • UDP_SOCKET编程实现
  • 行阶梯形矩阵的定义,通过正例和反例说明如何判断一个矩阵是不是行阶梯形矩阵
  • 9月22日,每日信息差
  • 基于python+django+mysql+Nanodet检测模型的水稻虫害检测系统
  • 基于Python+SQLite的课程管理系统
  • Spring boot中常用注解解释
  • 汽车焊机数据通信:Profinet转Canopen网关的神奇连接
  • 新160个crackme - 062-syllogism-crackme1