推荐系统-数据分割、性能验证

推荐系统基础概念

  1. 前言

    作者根据开源项目 gorse 的每一步提交, 系统性学习推荐系统架构组成以及gorse中使用的推荐算法的实现。 通过参考算法文档以及代码实现,作者对gorse的学习过程以及进度 与 博客发布的时间线保持一致

  2. 数据集分割

    1. 原因

      推荐系统的根本任务是学习一个函数 f:(U,I)→Rf: (\mathcal{U}, \mathcal{I}) \to \mathbb{R}f:(U,I)R,该函数能够预测用户 U\mathcal{U}U 对物品 I\mathcal{I}I 的偏好(例如评分)

      然而,我们的最终目标是最小化模型在未观测到的数据上的误差,即泛化误差。一个模型如果在训练集上表现优异,但在未见数据上表现糟糕,则称之为过拟合 (Overfitting)。它过度学习了训练数据中的特有模式乃至噪声,而未能捕捉到底层的、具有普适性的偏好规律。

      因此,数据集划分的根本目的,就是从有限的训练数据中,模拟出未见数据的场景,从而对模型的泛化能力进行可靠的估计

    2. 常见数据划分优缺点

      • 留出法

        这是最简单直接的方法。它从原始数据集中随机抽取一部分(例如80%)作为训练集,剩下的一部分(20%)作为测试集。

        大致流程:

        对数据集 D\mathcal{D}D 进行一次性的、互斥的划分,形成训练集 D∗train\mathcal{D}*{train}Dtrain 和测试集 D∗test\mathcal{D}*{test}Dtest,满足 D∗train∩D∗test=∅\mathcal{D}*{train} \cap \mathcal{D}*{test} = \emptysetDtrainDtest=D∗train∪D∗test=D\mathcal{D}*{train} \cup \mathcal{D}*{test} = \mathcal{D}DtrainDtest=D

        D∗train\mathcal{D}*{train}Dtrain 上训练模型 MMM,之后在 D∗test\mathcal{D}*{test}Dtest 上评估 MMM 的性能,其结果作为对泛化误差的估计。*

        • 优点:现简单,计算开销小,尤其适合在数据量非常庞大的场景下进行快速实验和验证。
        • 缺点:单次随机划分的结果带有很强的偶然性。可能某一次划分恰好把一些“困难”或“简单”的样本都分到了测试集中,从而导致评估结果出现偏差。
      • K折交叉验证

        为了克服留出法的偶然性,它将整个数据集分成 K 个大小相似、互不相交的子集(称为“折”)。然后进行 K 次训练和评估,每次都选择其中 1 个折作为测试集,剩下的 K-1 个折合并作为训练集。最后,将 K 次的评估结果取平均值,作为模型的最终性能指标。

        大致流程

        将数据集 D\mathcal{D}D 随机划分为 K 个大小近似相等的互斥子集(折,Folds): D1,D2,…,DK\mathcal{D}_1, \mathcal{D}_2, \dots, \mathcal{D}_KD1,D2,,DK

        进行 K 轮迭代,对于第 k∈{1,…,K}k \in \{1, \dots, K\}k{1,,K} 轮:

        • 令测试集为 Dtest(k)=Dk\mathcal{D}_{test}^{(k)} = \mathcal{D}_kDtest(k)=Dk

        • 令训练集为 Dtrain(k)=D∖Dk\mathcal{D}_{train}^{(k)} = \mathcal{D} \setminus \mathcal{D}_kDtrain(k)=DDk

        • Dtrain(k)\mathcal{D}_{train}^{(k)}Dtrain(k) 上训练模型 MkM_kMk,并在 Dtest(k)\mathcal{D}_{test}^{(k)}Dtest(k) 上计算其性能指标 ϵk\epsilon_kϵk

        最终的性能估计为 K 轮指标的均值。同时,也可以计算指标的标准差,以衡量模型性能的稳定性。

        • 优点:充分利用了所有数据,每个样本都有一次机会成为测试数据,使得评估结果更加稳定、可靠,大大降低了单次划分带来的偶然误差。
        • 缺点:计算成本高: 计算开销是留出法的 K 倍。常用的 K 值为 5 或 10。

        参考代码:

        func (set *TrainSet) KFold(k int, seed int64) ([]TrainSet, []TrainSet) {trainFolds := make([]TrainSet, k)testFolds := make([]TrainSet, k)rand.New(rand.NewSource(seed))perm := rand.Perm(set.Length())foldSize := set.Length() / kbegin, end := 0, 0	// todo 数据集划分for i := 0; i < k; i++ {end += foldSizeif i < set.Length()%k {end++}// Test settestIndex := perm[begin:end]testFolds[i].interactionUsers = selectInt(set.interactionUsers, testIndex)testFolds[i].interactionItems = selectInt(set.interactionItems, testIndex)testFolds[i].interactionRatings = selectFloat(set.interactionRatings, testIndex)// Train settrainIndex := concatenate(perm[0:begin], perm[end:set.Length()])trainFolds[i].interactionUsers = selectInt(set.interactionUsers, trainIndex)trainFolds[i].interactionItems = selectInt(set.interactionItems, trainIndex)trainFolds[i].interactionRatings = selectFloat(set.interactionRatings, trainIndex)begin = end}return trainFolds, testFolds
        }
        
      • 留一法交叉验证

        这是K折交叉验证的一种极端情况,即 K 的值等于数据集中样本的总数 N。在推荐场景下,这通常意味着每次只留下一个用户的某一次交互记录作为测试,用该用户的所有其他数据来训练。

        大致流程:

        K-折交叉验证的一个特例,其中 K=NK=NK=N,N 是数据集中样本的总数。

        • 优点:由于几乎所有数据都参与了训练,模型的评估结果偏差极小,最能反映模型在真实数据上的期望性能。
        • 缺点:计算成本极其高昂。如果数据集稍大,执行一次完整的留一法验证将会耗费难以想象的时间。因此,它只适用于数据集规模非常小的场景。
      • 基于时间的划分

        基于时间的划分方法严格按照时间戳来切分数据。例如,选取一个时间点,将此时间点之前的所有数据作为训练集,之后的数据作为测试集。

        大致流程

        严格依据交互发生的时间戳进行划分。

        1. 选取一个时间点 TsplitT_{split}Tsplit

        2. 所有时间戳 t<Tsplitt < T_{split}t<Tsplit 的交互数据构成训练集 Dtrain\mathcal{D}_{train}Dtrain

        3. 所有时间戳 t≥Tsplitt \ge T_{split}tTsplit 的交互数据构成测试集 Dtest\mathcal{D}_{test}Dtest

        • 优点:最能模拟线上真实环境,可以有效评估模型对未来用户行为的预测能力。这是检验模型是否能跟上用户兴趣变化趋势的黄金标准。
        • 适用场景:对于任何具有时序特征的推荐任务(例如电商、新闻、社交媒体),这都是首选的划分方法。
    3. 总结

      根据不同的推荐场景选择合适的划分方法

      划分方法优点缺点主要适用场景
      留出法简单、快速结果偶然性大数据量巨大时的快速实验或初步验证。
      K折交叉验证结果稳定,数据利用率高计算开销相对较大常规的模型选择和评估,是学术界和工业界的标准实践。
      留一法评估偏差小,结果最可靠计算成本极高数据集规模很小,且对评估精度要求极高的罕见情况。
      时间划分最贴近真实应用场景需要数据包含时间信息用户兴趣会随时间变化的场景,如新闻、电商推荐。
  3. 推荐模型性能验证

    模型验证的核心目标是科学地度量模型的泛化能力,确保其在未知数据上的表现符合预期。

    1. 离线评估 (Offline Evaluation)

      离线评估是在模型上线前,使用固定的历史数据集进行的验证。它是成本最低、迭代速度最快的评估方式。

      所有离线评估都必须基于正确的数据集划分,以模拟真实世界的数据不可见性。主要协议包括:

      • 时序划分 (Temporal Split): 业界标准。按时间切分,用过去的数据训练,预测未来的数据。这是唯一能在线下可靠模拟线上环境的方法。

      • K-折交叉验证 (K-Fold Cross-Validation): 学术界标准。适用于静态、非时序数据集,通过多次划分求平均来获得鲁棒的评估结果。

      • 留出法 (Hold-out): 用于超大规模数据集的快速验证,但结果稳定性较差。

      核心评估指标 (Key Metrics)

      根据推荐任务的不同,我们关注的指标也不同。

      1. 评分预测 (Rating Prediction) 任务

        这类任务的目标是预测用户对物品的具体评分。

        • 平均绝对误差 (Mean Absolute Error, MAE):

          它衡量的是预测评分与真实评分之间差值的绝对值的平均值。MAE对所有误差一视同仁。
          MAE=1∣Dtest∣∑(u,i)∈Dtest∣rui−r^ui∣ \text{MAE} = \frac{1}{|\mathcal{D}_{test}|} \sum_{(u,i) \in \mathcal{D}_{test}} |r_{ui} - \hat{r}_{ui}| MAE=Dtest1(u,i)Dtestruir^ui

        • 均方根误差 (Root Mean Square Error, RMSE):

          与MAE相比,RMSE通过平方项放大了较大预测误差的惩罚,对模型的离谱预测(比如真实评分为1分,预测为5分)更为敏感。
          RMSE=1∣Dtest∣∑(u,i)∈Dtest(rui−r^ui)2 \text{RMSE} = \sqrt{\frac{1}{|\mathcal{D}_{test}|} \sum_{(u,i) \in \mathcal{D}_{test}} (r_{ui} - \hat{r}_{ui})^2} RMSE=Dtest1(u,i)Dtest(ruir^ui)2

        gorse中的相关实现代码:

        func RootMeanSquareError(prediction []float64, truth []float64) float64 {tmp := make([]float64, len(prediction))floats.SubTo(tmp, prediction, truth)	// 误差floats.Mul(tmp, tmp)					// 平方return math.Sqrt(stat.Mean(tmp, nil))	// 平均值开根号 
        }
        func MeanAbsoluteError(prediction []float64, truth []float64) float64 {tmp := make([]float64, len(prediction))	floats.SubTo(tmp, prediction, truth)	// 误差abs(tmp)								// 绝对值 return stat.Mean(tmp, nil)				// 平均值
        }
        
      2. Top-N 排序推荐 (Ranking) 任务

        这是现代推荐系统最核心的任务,即为用户生成一个有序的推荐列表。

        精确率 (Precision@K) / 召回率 (Recall@K):

        • Precision@K: 在推荐的Top-K个物品中,用户真正喜欢的物品所占的比例。它衡量推荐结果的准确性
        • Recall@K: 在用户所有喜欢的物品中,被我们成功推荐到Top-K列表里的比例。它衡量推荐结果的全面性
      3. 分类任务 (Classification) - 如点击率(CTR)预估

        这类任务的目标是预测用户点击某个物品的概率。

        AUC (Area Under the ROC Curve):
        AUC衡量的是模型将正样本排在负样本前面的能力。它不依赖于某个具体的点击阈值,能综合评估模型在所有阈值下的排序能力,是CTR预估模型最核心的离线评估指标之一。

    2. 在线评估(Online Evaluation)

      当模型在离线评估中表现出色后,必须通过在线实验来验证其在真实环境中的效果。这是检验模型商业价值的最终标准。

      • A/B 测试 (A/B Testing):

        • 机制: 将用户随机分成若干组,一组(控制组)使用现有模型A,另一组或多组(实验组)使用新模型B、C等。在一段时间内,比较各组的核心业务指标。
        • 评估指标: 不再是RMSE或NDCG,而是真实的商业KPI,例如:点击率(CTR)、转化率(CVR)、用户停留时长、GMV(商品交易总额)等。
        • 优点: 结果最可靠,具有统计学意义,能直接衡量商业价值。
        • 缺点: 实验周期长,成本高,可能对部分用户造成负面体验。
      • 交叉测试 (Interleaving):

        • 机制: 将两个模型(A和B)的推荐结果混合在一起,展示给同一个用户。通过追踪用户最终点击了来自哪个模型的物品,来快速判断哪个模型更优。
        • 优点: 比A/B测试更敏感,能用更少的时间和流量获得显著的统计结果,非常适合快速迭代多个算法版本。
        • 缺点: 实现相对复杂,主要用于判断模型的相对好坏,难以直接评估对绝对业务指标的影响。
    3. 超越精确度的质量评估 (Qualitative Evaluation)

      一个高精度的模型不一定是一个好的推荐模型。例如,模型可能总是推荐那些热门的、用户早已熟知的物品。因此,还需要关注以下质量指标:

      • 覆盖率 (Coverage): 模型能够推荐出的物品占总物品库的比例。高覆盖率意味着模型具有更好的挖掘长尾物品的能力。
      • 多样性 (Diversity): 推荐列表中的物品是否种类丰富,而不是高度同质化。
      • 新颖性 (Novelty): 模型推荐的物品是否是用户之前不知道的、全新的物品。
      • 惊喜度 (Serendipity): 模型能否推荐出那些用户意想不到、但又确实令其满意的物品。
    4. 总结

      一个成熟的模型验证流程应该是:通过离线评估快速筛选和迭代算法,辅以质量评估确保推荐广度和深度,最终通过在线评估来决策模型是否上线。

      评估范式核心目的主要方法/指标优点缺点
      离线评估快速验证算法的理论性能RMSE, MAE, Precision/Recall@K, NDCG@K, AUC快速、低成本、可重复无法完全模拟真实环境,与线上表现可能存在偏差(Gap)
      在线评估验证模型的真实商业价值A/B测试, 交叉测试结果真实可靠,直接关联业务KPI慢、高成本、有风险
      质量评估衡量推荐的人性化和探索能力覆盖率, 多样性, 新颖性弥补纯精度指标的盲点,提升用户体验通常难以直接量化和优化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/88540.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/88540.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从电商新手到单日变现5000+,我是如何做到闲鱼爆单的

很多人想做项目赚钱&#xff0c;却总是迈不出第一步。今天给大家分享一个可以从电商小白到成功跑通项目&#xff0c;实现单日GMV 5000的项目。今天将分享从选品、内容制作、销售服务的全过程实战经验。1&#xff1a;闲鱼实战&#xff0c;强执行力01实操前的准备执行力就是你的动…

vue3实现pdf文件预览 - vue-pdf-embed

参考地址&#xff1a;https://juejin.cn/post/7105933034771185701 这个参考文章的代码直接可以复制使用&#xff0c;样式也是给到的&#xff0c;但是实现的是一页一页的显示pdf内容&#xff0c;我的需求是要全部展示出来&#xff0c;页码切换时是做一个滚动定位操作。 思路&am…

【AI论文】OmniPart:基于语义解耦与结构连贯性的部件感知三维生成

摘要&#xff1a;创建具有显式、可编辑部件结构的三维资产&#xff0c;对于推动交互式应用的发展至关重要。然而&#xff0c;大多数生成方法仅能生成整体式形状&#xff0c;限制了其实际应用价值。我们提出OmniPart——一种新型的部件感知三维物体生成框架&#xff0c;旨在实现…

Pandas-数据查看与质量检查

Pandas-数据查看与质量检查一、数据查看&#xff1a;快速掌握数据概况1. 整体概览&#xff1a;shape与info()2. 数值特征预览&#xff1a;describe()3. 随机抽样&#xff1a;head()与sample()二、数据质量检查&#xff1a;识别与处理问题1. 缺失值检查与处理处理策略&#xff1…

类和对象拓展——日期类

一.前言通过前面对类和对象的学习&#xff0c;现在我们可以开始实践日期类的代码编写。在实际操作过程中&#xff0c;我会补充之前文章中未提及的相关知识点。二.正文 1. 日期类代码实现我们先来看看要实现什么功能吧&#xff0c;把他放在Date.h中#pragma once #include<ios…

大模型KV缓存量化误差补偿机制:提升推理效率的关键技术

大模型KV缓存量化误差补偿机制&#xff1a;提升推理效率的关键技术摘要 随着大型语言模型&#xff08;LLM&#xff09;参数规模突破千亿级别&#xff0c;推理过程中的显存占用与计算延迟成为制约其实际部署的核心瓶颈。KV缓存&#xff08;Key-Value Cache&#xff09;作为Trans…

QT跨平台应用程序开发框架(6)—— 常用显示类控件

目录 一&#xff0c;Label 1.1 主要属性 1.2 文本格式 1.3 设置图片 1.4 其它常用属性 1.5 设置伙伴 二&#xff0c;LCD Number 2.1 主要属性 2.2 实现倒计时 ​2.3 两个问题 三&#xff0c;ProgressBar 3.1 主要属性 3.2 进度条按时间增长 3.3 改变样式 3.4 一个问题 四&#…

LINUX文件系统权限,命令解释器alias,文件查看和查找

1、文件査看:查看/etc/passwd文件的第5行[rootserver ~]# head -5 /etc/passwd | tail -1 #先找到前5行&#xff0c;用管道符过滤&#xff0c;显示倒数第一行2、文件查找(1)在当前目录及子目录中&#xff0c;查找大写字母开头的txt文件[rootserver ~]# find / -name "[…

AI图像修复工具CodeFormer实测:马赛克去除与画质增强效果评测

大家好&#xff01;平时看图片或视频&#xff0c;是不是特别烦人脸被马赛克遮住的地方&#xff1f;比如老照片模糊、视频关键部分被打码&#xff0c;看着很不舒服。今天给大家分享一款超好用的去马赛克神器——CodeFormer&#xff0c;完全免费&#xff0c;新手也能轻松搞定&…

知识宇宙-思考篇:AI大模型如何重塑软件开发流程?

名人说&#xff1a;博观而约取&#xff0c;厚积而薄发。——苏轼《稼说送张琥》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录AI大模型重塑软件开发&#xff1a;从码农到AI编程伙伴的华丽转身一、AI大模型的编程&…

Rocky Linux上使用NVM安装Node.js 18

问题描述 Rocky Linux 9 默认 yum 安装的 Node.js 版本是16&#xff0c;vite启动报错&#xff1a;TypeError: crypto$2.getRandomValues is not a function &#xff0c;需安装更高版本的 Node.js 使用nvm安装Node.js的好处 多版本管理&#xff0c;NVM 允许你安装多个不同版本的…

JVM 中“对象存活判定方法”全面解析

1. 前言 在 Java 开发过程中&#xff0c;我们常常听到“垃圾回收”&#xff08;Garbage Collection, GC&#xff09;这一术语。JVM 通过垃圾回收机制自动管理内存&#xff0c;极大地简化了程序员的内存控制负担。然而&#xff0c;GC 究竟是如何判断哪些对象该回收、哪些应保留…

苹果公司高ROE分析

公司通过增加负债提升净资产收益率&#xff08;ROE&#xff09;的核心机制在于财务杠杆效应和资本结构优化&#xff0c;以下从原理、操作路径、风险边界及苹果案例四维度展开分析&#xff1a;名称解释&#xff1a; ROIC(投入资本回报率)&#xff1a;ROICNOPATInvested Capital …

【Linux系统】进程概念

1. 进程概念1.1 进程的本质核心定义用户视角&#xff1a;程序的动态执行实例&#xff08;如同时运行多个Chrome窗口即多个进程&#xff09;。内核视角&#xff1a;资源分配的最小实体单位&#xff0c;独享CPU时间片、内存空间和文件资源。现代定义&#xff1a;进程 内核数据结…

从LLM到VLM:视觉语言模型的核心技术与Python实现

本教程的完整代码可以在GitHub上找到&#xff0c;如果你有任何问题或建议&#xff0c;欢迎交流讨论。 引言&#xff1a;为什么需要VLM&#xff1f; 当我们与ChatGPT对话时&#xff0c;它能够理解复杂的文字描述&#xff0c;生成流畅的回答。但如果我们给它一张图片&#xff0c…

老系统改造增加初始化,自动化数据源配置(tomcat+jsp+springmvc)

老系统改造增加初始化&#xff0c;自动化数据源配置一、前言二、改造描述1、环境说明2、实现步骤简要思考三、开始改造1、准备sql初始化文件2、启动时自动读取jdbc文件&#xff0c;创建数据源&#xff0c;如未配置&#xff0c;需要一个默认的临时数据源2.1去掉sping mvc原本配置…

卫星通信终端天线的5种对星模式之二:DVB跟踪

要实现稳定可靠的卫星通信&#xff0c;地面终端天线必须精准地对准远方的卫星。对星的过程是一个不断搜索、不断逼近的过程&#xff0c;其目标是让天线波束中心精确指向卫星&#xff0c;从而获得最大信号接收与发射效率。 卫星通信终端天线的对星技术是保障卫星通信链路稳定的…

重构下一代智能电池“神经中枢”:GCKontrol定义高性能BMS系统级设计标杆

概述BMS&#xff08;电池管理系统&#xff09;作为新能源汽车动力电池与整车的核心纽带&#xff0c;通过实时监控电压、电流、温度及SOC等参数&#xff0c;控制电池充放电过程&#xff0c;保障电池安全性与使用寿命。随着电动汽车智能化发展&#xff0c;对BMS的响应速度、精度和…

面试150 对称二叉树

思路 联想递归三部曲&#xff1a;传入参数、遍历方式、返回什么。本题联想到先序遍历的方式,需要遍历整颗二叉树,最后返回的是一个布尔值。然后我们需要传入的是左子树和左子树的节点,然后分别进行比较。 # Definition for a binary tree node. # class TreeNode: # def __…

多线程的区别和联系

进程和线程的区别和联系1.一个进程可以包含多个线程&#xff0c;不能够没有线程2.进程是系统资源分配的基本单位&#xff0c;线程是系统调度执行的基本单位3.同一个进程里的线程之间&#xff0c;共用同一份系统资源4.线程是当下实现并发编程的主流方式&#xff0c;通过多线程&a…