策略产品经理干货系列之推荐系统离线评估方法与指标介绍
itomcoil 2025-05-08 18:58 4 浏览
不同的评估方法存在不同的优缺点,所以在进行推荐评估时,要详细了解其指标,选择合适的评估方法。本篇文章将分享推荐系统离线评估方法,帮助策略产品经理高效地完成工作。希望能对你有所帮助。
今天想就所有策略产品比较关注的推荐系统评估方法展开系列文章介绍,给大家从头到尾讲清楚推荐系统的评估度量衡,同时也是帮助大家明确作为策略如何基于不同的场景确认优化的标的方向。
本系列将基于离线评估、Replay方法、interleaving方法以及线上AB测试的视角来给大家从头到尾讲清楚策略产品对于推荐系统评估体系的搭建,各种评估方式的优缺点及其应用场景,让每一位策略产品对于评估效果的选择了然于心;欢迎大家对于本文进行讨论。
一、推荐系统的评估体系
核心要点:一个成熟的推荐系统评估体系应该综合考虑评估的效率和正确性,利用较少的资源位,快速筛选出效果更好的模型。
对于一个公司来说,最公正和合理的评估方法及时进行线上测试,评估模型是否能够更好达成公司或者团队的商业目标。
但是光使用线上A/B的测试方法要占用宝贵且有限的线上流量字眼,并且可能会对用户体验造成伤害。
所以,正是由于线上测试的种种限制,“离线测试”才成了策略产品退而其其次的选择。离线测试可以利用近乎无限的计算资源,快速得到评估结构,从而实现模型的快速迭代化。
所以,并不是一种单一的评估体系即可满足所有的评价场景和标准,作为策略产品,应该深刻的知晓和运用每一种评估方法去做到评测效率和正确性的平衡。
1. 推荐系统评估体系概述
从上图可以看出,在线上A/B测试(最接近线上真实环境)和传统的离线评估(评测的效率最高)之间,还有Replay和Interleaving等测试方法。
- Replay方法是用来最大程度在离线状态下模拟线上环境的过程。
- Interleaving方法则可以建立快速的线上测试环境。
这种多层级的评估测试方法共同构成了完整的推荐系统评估体系,做到评测实现计算效率和线上真实性反馈的平衡。
2. 应用场景
1)评估效率适用场景
可以看的出来离线评估需要快速验证模型的思想和提升效率,因此存在更多筛选的模型和验证改正思想的时候。
由于数量巨大,“评估效率”就成为了最为关键的考虑因素,线上反馈的“真实性”就没有那么苛刻和高要求,这时候就应该选择效率更高的离线评估法则。
2)线上真实性反馈适用场景
候选模型被一层层筛选出来之后,接近正式上线接单,评估方法对于是否能够真实反馈线上环境更加重要。
在模型正式上线前就需要做最接近真实产品体验的A/B测试做模型评估,产生最具说服力的——业务商业指标,才能进行模型上线,完成模型迭代优化过程。
二、离线评估的方法
- 定位:在推荐系统评估当中,离线评估往往被当做是最常用也是最基本的评估方法。其核心是指在模型部署在线上环境之前,在离线的环境进行评估。
- 优点:1)由于不用部署到生产环境当中,离线评估就没有线上部署的工程风险,也不用浪费线上流量的资源;2)测试时间短、同时可以进行多种并行测试,能够利用丰富线下资源等优点。
- 能力要求:对于策略产品充分掌握离线评估的要点,需要掌握两个方面的知识:一是离线评估的方法有哪些;二是离线评估的指标有哪些。
离线评估的基本原理大家比较熟悉,主要是在离线环境当中,讲数据集分为“训练集”和“测试集”,用“训练集”来训练模型,用“测试集”来评估模型。
根据数据集划分方式不同,离线评估的方法可以分为Hold out检验、交叉检验和自助法。
1. Hold-out留出法
Holdout检验是基础的离线评估方法,其将原始的样本集合随机划分成训练集和测试集。
对于一个推荐模型来说,可以把样本按照90%-10%的比例随机划分成两个部分,90%用来做模型的训练集,10%用来做模型的评估测试集。
Holdout检验的方法会存在一定的缺点,也就是在验证集上计算出的评估指标与训练集和测试集的划分有直接的干系,如果进行少量的Holdout检验,则得到的结论会存在比较大的随机性。
所以,为了消除随机性影响,“交叉检验”法被提出。
2. 交叉检验法
1)K-fold交叉验证法
把全部样本划分成K个大小相等的样本子集(K取决于样本集合总数,一般行业实验取10),依次遍历K个子集,每次会把当前的子集作为验证集,其余所有子集当做是训练集,进行模型的训练和评估。
最后把K次评估的指标的平均值作为最终的评估指标,这个在之前机器学习的章节有提到过。
2)留一验证法
和K-fold交叉验证的思想比较类似,每次就留1个样本作为验证集,其余所有样本作为测试集。
样本总数n,依次遍历n个样本,进行n次验证,再将评估的指标进行平均求得最终指标。缺点就是样本多的情况下,验证的计算和时间成本很大。
事实上,留1验证是留p验证的一种特例。留p验证就是指代n个样本集合中每次留p个样本来做验证集。
3. 自助法Bootstrap
前面提到的关于Hold-out留存法,或者是交叉检验法都需要划分测试集和训练集进行模型评估。然而当样本规模比较小的时候,划分验证集会进一步让训练集减小,最终影响模型训练的效果。
所以诞生了自助法(Bootstrap)自助采样的检验方法:对于总数是n的样本集合来进行n次有放回的随机抽样,得到大小为n的训练集。
在n次采样的过程中,有的样本被重复采样,有的样本没有被抽样过,把这些没有被抽样的样本作为验证集合进行模型验证,这就是自助法验证过程。
三、离线评估的指标
要客观评估一个推荐模型的好坏,那么就需要有一个客观的度量衡指标来进行评估,并且需要多个角度的指标来评估推荐系统,从不同的视角来得到多个维度的结论。
以下是推荐系统在离线评估当中使用的比较多的指标,其实在之前介绍推荐系统排序模块的时候就有给大家概述性介绍,从混淆矩阵的视角出发说明准确率(Accuracy)、召回率(recall)和精确率(Precision),这里我们再详细介绍一下。
混淆矩阵说明
我们通过举例的方式让大家更加容易理解,首先,我们来理解混线矩阵当中的几个概念,用推荐系统举例方便大家理解。
- TP(True Positive)在混淆矩阵中的意思就是模型预测item被点击并且实际也被点击。
- FN(False Negetive)在混淆矩阵中的意思就是模型预测item不会被点击但是实际被点击。
- FP(False Positive)在混淆矩阵中的意思就是模型预测item会被点击但是实际不被点击。
- TN(True Negtive)在混淆矩阵的位置就是预测不被点击实际也是曝光未点击的结果。
1. 准确率(Accuracy)
准确率代表分类正确的样本占据总样本的个数比例,也就是:
其中分母代表总样本数量,分子代表的是无论是预测会被点击还是不被点击,预测结果和实际结果保持一致的的样本数量。
准确率是分类任务当中比较直观的评价指标,虽然有比较强的可解释性,但是也存在明显缺陷。就是当不同分类的样本不均匀的时候,占比大的类别往往就成为了影响预估准确率的主要因素。
如果负样本占比是99%(即100个曝光后的样本都是未点击),那么把所有的样本去预测成负样本都可以获得99%的准确率。
如果把推荐问题当做是一个点击率预估方式的分类问题,在选定阈值进行正负样本区分的前提下,可以用准确率评估推荐模型。
而在实际场景当中更多是利用推荐模型得到一个推荐序列,因此更多用精确率和召回率指标来衡量好坏。
2. 召回率(Recall)与精确率(Precision)
召回率代表分类正确的正样本数占比所有真正的正样本数的比例,也就是:
考察的是推荐系统模型当中在做分类任务时候把所有实际为正样本预测成正样本的能力,更多考察的就是对正样本的覆盖情况。
精确率是分类正确的正样本数量占比分类器判定成正样本的样本个数比例,也就是:
代表着推荐系统模型在做分类任务中分类预测正向样本的精准程度。
精确率和召回率是矛盾统一的两个指标:即为了提高精确率,分类器需要尽量在“更优把握的时候”才把预测样本预测为正样本,但是往往会因为过于保守的预估而漏掉很多“没有把握”的正样本,导致召回率变低。
所以为了综合的反映精确率和召回率的结果,可以采用F1-score,F1-score代表的是精确率和准确率的调和平均值。
其定义如下所示:
3. 均方根误差 RMSE & 绝对百分比误差 MAPE
均方根误差(Root Mean Square Error,RMSE)经常被用来衡量回归模型的好坏。
使用点击率预估模型构建推荐系统的时候,推荐系统预测的其实是样本为正样本的概率,就可以用RMSE来评估。
定义如下:
其中yi表示第i个样本点的真实值,而括号内的后者代表的是第i个点的预测值,n表示的是样本点的个数。一般情况下RMSE能够很友好的反映出预测值和真实值的偏离程度。
但是也存在一个明显的缺点,就是如果个别点的偏离程度非常大(俗称离群点),即使离群点非常的少,也会使得RMSE指标变得比较差。
所以为了解决这个问题,提出了鲁棒性更强的平均绝对百分比误差MAPE(Mean Absolute Percent Mape)。
MAPE的定义公式如下所示:
相比较RMSE,MAPE把每个点的误差做了归一化处理,降低了个别的离群点带来的绝对误差影响。
4. 对数损失函数LogLoss
对数损失函数LogLoss也经常在二分类问题用于离线评估使用的指数,LogLoss定义如下:
其中,yi为输入实例xi的真实类别,pi为预测输入实例xi是正样本的概率,N为样本总数。
其实LogLoss就是逻辑回归的损失函数,大量深度学习模型的输出层正是逻辑回归或者是softmax,因此采用LogLoss作为评估指标可以非常直观的反映模型的损失函数变化。
非常适用于观察模型收敛情况的评估指标。
四、关于离线评估方法与指标介绍
本篇主要是针对日常策略产品工作中推荐系统离线的常用评估方法和评估指标做了详尽的介绍。
离线评估是推荐系统评估效率最快的一种方式,但是其缺点也较为明显,即无法准确的反馈模型策略变更对于线上产生的影响效果,以及和业务场景结合的指标效果体现,这些都是离线评估方法的缺点。
但同时线上评估方法会存在诸多评估效率的问题。因此推荐系统策略产品需要明晓什么场景下应当选择使用什么类型的评估方法,来达到准确真实性和效率的平衡。
关于离线评估方法和对应的指标文章也介绍了对应的优势和缺点,复杂的推荐系统需要综合不同的指标来进行全貌了解。
希望本篇文章能够给大家引入对于推荐系统评估的方法论建议,有帮助还辛苦大家点赞、评论以及收藏三连。
本文由 @策略产品Arthur 原创发布于人人都是产品经理,未经许可,禁止转载
题图来自 Unsplash,基于 CC0 协议
该文观点仅代表作者本人,人人都是产品经理平台仅提供信息存储空间服务。
相关推荐
- Excel新函数TEXTSPLIT太强大了,轻松搞定数据拆分!
-
我是【桃大喵学习记】,欢迎大家关注哟~,每天为你分享职场办公软件使用技巧干货!最近我把WPS软件升级到了版本号:12.1.0.15990的最新版本,最版本已经支持文本拆分函数TEXTSPLIT了,并...
- Excel超强数据拆分函数TEXTSPLIT,从入门到精通!
-
我是【桃大喵学习记】,欢迎大家关注哟~,每天为你分享职场办公软件使用技巧干货!今天跟大家分享的是Excel超强数据拆分函数TEXTSPLIT,带你从入门到精通!TEXTSPLIT函数真是太强大了,轻松...
- 看完就会用的C++17特性总结(c++11常用新特性)
-
作者:taoklin,腾讯WXG后台开发一、简单特性1.namespace嵌套C++17使我们可以更加简洁使用命名空间:2.std::variant升级版的C语言Union在C++17之前,通...
- plsql字符串分割浅谈(plsql字符集设置)
-
工作之中遇到的小问题,在此抛出问题,并给出解决方法。一方面是为了给自己留下深刻印象,另一方面给遇到相似问题的同学一个解决思路。如若其中有写的不好或者不对的地方也请不加不吝赐教,集思广益,共同进步。遇到...
- javascript如何分割字符串(javascript切割字符串)
-
javascript如何分割字符串在JavaScript中,您可以使用字符串的`split()`方法来将一个字符串分割成一个数组。`split()`方法接收一个参数,这个参数指定了分割字符串的方式。如...
- TextSplit函数的使用方法(入门+进阶+高级共八种用法10个公式)
-
在Excel和WPS新增的几十个函数中,如果按实用性+功能性排名,textsplit排第二,无函数敢排第一。因为它不仅使用简单,而且解决了以前用超复杂公式才能搞定的难题。今天小编用10个公式,让你彻底...
- Python字符串split()方法使用技巧
-
在Python中,字符串操作可谓是基础且关键的技能,而今天咱们要重点攻克的“堡垒”——split()方法,它能将看似浑然一体的字符串,按照我们的需求进行拆分,极大地便利了数据处理与文本解析工作。基本语...
- go语言中字符串常用的系统函数(golang 字符串)
-
最近由于工作比较忙,视频有段时间没有更新了,在这里跟大家说声抱歉了,我尽快抽些时间整理下视频今天就发一篇关于go语言的基础知识吧!我这我工作中用到的一些常用函数,汇总出来分享给大家,希望对...
- 无规律文本拆分,这些函数你得会(没有分隔符没规律数据拆分)
-
今天文章来源于表格学员训练营群内答疑,混合文本拆分。其实拆分不难,只要规则明确就好办。就怕规则不清晰,或者规则太多。那真是,Oh,mygod.如上图所示进行拆分,文字表达实在是有点难,所以小熊变身灵...
- Python之文本解析:字符串格式化的逆操作?
-
引言前面的文章中,提到了关于Python中字符串中的相关操作,更多地涉及到了字符串的格式化,有些地方也称为字符串插值操作,本质上,就是把多个字符串拼接在一起,以固定的格式呈现。关于字符串的操作,其实还...
- 忘记【分列】吧,TEXTSPLIT拆分文本好用100倍
-
函数TEXTSPLIT的作用是:按分隔符将字符串拆分为行或列。仅ExcelM365版本可用。基本应用将A2单元格内容按逗号拆分。=TEXTSPLIT(A2,",")第二参数设置为逗号...
- Excel365版本新函数TEXTSPLIT,专攻文本拆分
-
Excel中字符串的处理,拆分和合并是比较常见的需求。合并,当前最好用的函数非TEXTJOIN不可。拆分,Office365于2022年3月更新了一个专业函数:TEXTSPLIT语法参数:【...
- 站长在线Python精讲使用正则表达式的split()方法分割字符串详解
-
欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是《在Python中使用正则表达式的split()方法分割字符串详解》。使用正则表达式分割字符串在Python中使用正则表达式的split(...
- Java中字符串分割的方法(java字符串切割方法)
-
技术背景在Java编程中,经常需要对字符串进行分割操作,例如将一个包含多个信息的字符串按照特定的分隔符拆分成多个子字符串。常见的应用场景包括解析CSV文件、处理网络请求参数等。实现步骤1.使用Str...
- 因为一个函数strtok踩坑,我被老工程师无情嘲笑了
-
在用C/C++实现字符串切割中,strtok函数经常用到,其主要作用是按照给定的字符集分隔字符串,并返回各子字符串。但是实际上,可不止有strtok(),还有strtok、strtok_s、strto...
- 一周热门
- 最近发表
- 标签列表
-
- ps像素和厘米换算 (32)
- ps图案在哪里 (33)
- super().__init__ (33)
- python 获取日期 (34)
- 0xa (36)
- super().__init__()详解 (33)
- python安装包在哪里找 (33)
- linux查看python版本信息 (35)
- python怎么改成中文 (35)
- php文件怎么在浏览器运行 (33)
- eval在python中的意思 (33)
- python安装opencv库 (35)
- python div (34)
- sticky css (33)
- python中random.randint()函数 (34)
- python去掉字符串中的指定字符 (33)
- python入门经典100题 (34)
- anaconda安装路径 (34)
- yield和return的区别 (33)
- 1到10的阶乘之和是多少 (35)
- python安装sklearn库 (33)
- dom和bom区别 (33)
- js 替换指定位置的字符 (33)
- python判断元素是否存在 (33)
- sorted key (33)