SPADE用每用户Pareto距离量意外之喜,随机刷分失效

SPADE: Escaping the Popularity-Similarity Frontier to Measure Serendipitous Recommendations

Tobias Vente, Maarten Peirsman, Noah Daniëls, Hannu Toivonen, Bart Goethals

cs.IR, cs.AI, cs.LG

2026-09-25

把物品放进流行度-历史相似度平面,用到用户专属Pareto前沿的欧氏距离当意外之喜,且只对命中测试集的推荐计分。随机推荐在MIND上Primitivity高达5.50,SPADE只有0.0037。

这篇在解决什么

推荐系统把serendipity当成工程目标:相关、意外、相对新鲜。线下beyond-accuracy指标常常只盯一维。内容距离或PMI只看跟用户历史有多远,会把全局爆款当成「惊喜」,只因为这个用户没看过。跟热门基线比的Primitivity又绑死在你选的「原始推荐器」上。时间差指标要有机发现日志,一般没有。漏掉的那一维会把假阳性抬成高分:又偏又无关、或者又热又「对这个用户算新」。

方法

SPADE把每个候选放进二维平面。横轴是全局流行度,交互次数除以最高频物品,缩到[0,1]。纵轴是跟用户历史的相似度,用未归一化的逐点互信息PMI对历史物品求和。选未归一化PMI是因为它跟流行度负相关;归一化PMI会把正相关性引回来,前沿塌成右上角一个点,距离没有意义。对低频共现做α=1的经验贝叶斯平滑,负值裁成0。每个用户的相似度再Min-Max到[0,1],两轴量纲对齐。

用户专属Pareto前沿是「没有另一件又更热又更像」的物品集合。单件SPADE分是到这条前沿的最小欧氏距离。列表分只对「推荐且落在该用户测试集」的物品取平均,再对用户平均。测不到的推荐不进分子,这是跟Novelty、Primitivity、共现意外的关键差别。

实验用CiteULike、MIND、MovieLens-1M/20M、Netflix,五核过滤,三个大数据集抽到1万用户。算法是EASE、SLIM、ItemKNN、Popularity、Random,Recpack实现,强泛化80/20划分,K从1到30。

结果

定性上,用户1874历史以剧情、犯罪、惊悚为主,科幻只占9%。测试集里的1997年科幻片Retroactive相似度0.46、流行度0.005,落在左下,离前沿最远。用户2186主看动作冒险,犯罪占11.6%,The Way of the Gun相似度0.38、流行度0.05,同样被标成高分惊喜。两例都是相关但既不热也不贴历史。

定量上,传统指标不看相关性,Random就能刷分。MIND上Random的NDCG只有0.0006,Primitivity 5.499、共现意外0.282,跟认真模型一个量级;SPADE给0.0037。五个数据集上Random和Popularity的SPADE都垫底。

数据集EASE SPADEPopularity SPADERandom SPADERandom Primitivity
Netflix0.1270.0290.0045.498
ML-1M0.1010.0310.0145.477
MIND0.2340.0370.0045.499
ML-20M0.1320.0320.0035.496
CiteULike0.4060.0160.0085.496

EASE在ML-1M上NDCG 0.335、Novelty 1.09,单看这两项无法知道「新」的那些是不是用户真点过的。SPADE把计分限制在测试集命中上,强迫相关性和意外同时成立。

为什么重要

对做推荐评估的人,这是一把不容易被随机和热门钻空子的线下尺。它不生成惊喜,只判断算法有没有把相关且远离「又热又像」边界的东西推出去。Pareto前沿在推荐里多用于训练时的多目标权衡,这里拿来做事后度量,用法是反的。

代码公开。指标本身不解决怎么优化serendipity,只解决怎么量。

局限与存疑

只给测试集命中打分,用户没交互过的推荐再意外也不进平均,召回差的模型会被压分,这是设计也是偏置。相似度纯协同、无内容特征,冷启动物品的PMI不稳,平滑只能压噪声不能造信号。MIND、ML-20M、Netflix抽到1万用户,前沿形状可能随抽样变。没有在线用户研究,「离前沿远」跟用户自述惊喜之间没有主观校准。欧氏距离把两轴当各向同性,流行度和相似度的可替换性是假设。Random的Novelty在部分数据集上是inf,传统指标自己也不干净,SPADE的对照优势部分来自对手更脆。

术语

原文与代码

社区讨论

相关论文

全部论文解读