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.xdnf.cn/news/148088.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

数仓规范:命名规范如何设计?

目录 0 前言 1 表命名规范 2 字段命名规范 3 任务命名规范 4 层级命名规范 5 自定义函数命名规范 6 视图和存储过程的命名规范 7 综合案例分析 8 常见陷阱和如何避免 9 工具和最佳实践 10 小结 想进一步了解数仓建设这门艺术的,可以订阅我的专栏数字化建设…

笔尖划出秋季的声息

笔尖划出秋季的声息 进入秋分,天气渐趋凉爽,天空青蓝明朗,难言伤感。 九月,把一些句子记录好,明年拿出来晒一晒,秋季也就有了答案。 1、经历 9月6日,台风“摩羯”席卷而过粤西,…

[Excel VBA]如何使用VBA按行拆分Excel工作表

如何使用VBA按行拆分Excel工作表 在Excel中,按行拆分工作表并生成多个新工作表是一项实用的技能,尤其在处理大量数据时。以下是一个VBA代码示例,能帮助你轻松实现这一功能。 1. 代码说明 本代码会根据源工作表中每个姓名创建一个新工作表&a…

mybatis 配置文件完成增删改查(二):根据条件查询一个

文章目录 参数占位符#{}:会将其替换为? ——为了防止sql注入${}:会将其替换为实际接收到的数据,拼sql ——无法防止sql注入 查询一个sql特殊字符的处理 参数占位符 #{}:会将其替换为? ——为了防止sql注入 ${}:会将其替换为实际接收到的数据…

2024年一区极光优化+分解+深度学习!VMD-PLO-Transformer-GRU多变量时间序列光伏功率预测

2024年一区极光优化分解深度学习!VMD-PLO-Transformer-GRU多变量时间序列光伏功率预测 目录 2024年一区极光优化分解深度学习!VMD-PLO-Transformer-GRU多变量时间序列光伏功率预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.中秋献礼&#…

python如何跨文件调用自己定义的函数

当自己定义函数过多时,只有一个python文件时代码会很长,不易理清代码框架,比如下面这段代码,如何隐藏具体函数细节呢?也就是把def函数放到另外一个python文件里步骤如下: 一个python文件代码篇幅过长 imp…

面试中如何回答关于 `RecyclerView` 性能优化的理解和实践经验

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点 在面试中展示对 RecyclerView 性能优化的理解和实践经验,你可以从以下几个方面进行阐述: 1. 理解 RecyclerView 的工作…

Maven-五、属性

Maven 文章目录 Maven前言属性定义properties文件加载pom文件属性总结 前言 使用maven中的属性可以来简化我们的配置工作。 属性定义 在pom文件中可以使用**标签设置属性,属性名自定义,然后可以在使用${属性名}**文件中引用自己定义的属性。 使用属性进行配置&a…

干货 | 2024数智新时代制造业数字化创新实践白皮书(免费下载)

导读:本白皮书将对制造业发展历程、现状、趋势与核心难题做深入解读,并在此基础上提出了相应的制造行业解决方案,结合业内实践成功的客户案例来详析信息化转型的有效方法,以供生产制造行业的从业者参考交流。

【网络安全】依赖混淆漏洞实现RCE

未经许可,不得转载。 文章目录 正文 依赖混淆是一种供应链攻击漏洞,发生在企业的内部依赖包错误地从公共库(如npm)下载,而不是从其私有注册表下载。攻击者可以在公共注册表中上传一个与公司内部包同名的恶意包&#xf…

Java的IO流(二)

目录 Java的IO流(二) 字节缓冲流 基本使用 使用缓冲流复制文件 字符缓冲流 缓冲流读取数据原理 字符编码 字符集 转换流 序列化流与反序列化流 基本使用 禁止成员被序列化 序列号不匹配异常 打印流 基本使用 系统打印流与改变流向 Prop…

【Windows】快速帮你解决如何找到 Windows 上的 .condarc 文件

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 专栏介绍 在软件开发和日常使用中,BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

【VLM小白指北 (1) 】An Introduction to Vision-Language Modeling

开一个新坑Vision-Language Modeling (VLM) ,原文76页,慢慢更,for beginners,但也不能之前啥都不会啊。 原文链接:An Introduction to Vision-Language Modeling Introduction 存在的问题:将语言与视觉相…

算法-K个一组翻转链表

// 要实现没k个节点进行翻转的操作,可以按照一下步骤进行 // 1.计算链表长度 // 2.分组反转 // 3. 使用一个虚拟头节点来处理边界情况 // 4.每次处理k个节点进行反转 // 5.如果剩余节点不足k个 则保持原有顺序 // 6.依次反转每组中的节点 // 1.使用prevGroupEEnd追…

【测试】——JUnit

📖 前言:JUnit 是一个流行的 Java 测试框架,主要用于编写和运行单元测试,用来管理测试用例。本文采用JUnit 5 目录 🕒 1. 添加依赖🕒 2. 注解🕘 2.1 Test🕘 2.2 BeforeAll AfterAll&…

OceanBase 3.X 高可用 (一)

OceanBase 3.X 高可用(一) 一、分布式核心 OceanBase 3.x 采用的是paxos 协议,与raft协议相比。其复杂程度高,实现技术难度大。 Paxos 协议允许事务日志乱序发送,顺序提交。raft允许事务顺序发送,顺序提…

Windows Internals 7th Edition English Download

天翼云盘 珍藏美好生活 家庭云|网盘|文件备份|资源分享天翼云盘是中国电信推出的云存储服务,为用户提供跨平台的文件存储、备份、同步及分享服务,是国内领先的免费网盘,安全、可靠、稳定、快速。天翼云盘为用户守护数据资产。https://cloud.1…

高并发内存池(四):查缺补漏 与 申请内存过程的调试

目录 查缺补漏 问题:min函数的冲突问题 申请内存过程的调试 当前文件展示 Common.h ObjectPool.h ConcurrentAlloc.h ThreadCache.h CentralCache.h PageCache.h ThreadCache.cpp CentralCache.cpp PageCache.cpp UnitTest.cpp 单进程单span 单进程…

谷歌收录批量查询,怎么查看批量查询谷歌收录情况

在SEO(搜索引擎优化)领域,确保网站内容被谷歌等搜索引擎有效收录是提升网站可见性和流量的关键步骤。批量查询谷歌收录情况,能够帮助网站管理员快速了解哪些页面已被搜索引擎识别并编入索引,哪些页面可能存在问题需要优…

【python】石头剪刀布,模拟十次并统计获胜次数

解决问题 下面是一个使用Python编写的剪刀、石头、布游戏的程序,包含玩家与计算机对战和模拟计算机对战10次的功能。 import random def get_computer_choice(): return random.randint(0, 2) def get_user_choice(): choice input("请输入剪刀(0)…