借助 ListWise 提升推荐系统精排效能:技术、案例与优化策略
目录
- 一、引言
- 二、ListWise 方法概述
- 三、ListWise 用于精排的优势
- 四、ListWise 样本具体的构建过程
- 4.1 确定样本的上下文
- 4.2 收集候选物品及相关特征
- 4.3 确定物品的真实排序标签
- 4.4 构建样本列表
- 4.5 划分训练集、验证集和测试集
- 五、ListWise 方法案例分析
- 六、ListWise 方法在精排中的挑战与解决方案
- 七、结论
一、引言
在推荐系统的精排阶段,精准地对候选物品进行排序是提升用户体验和业务价值的关键。传统的排序方法存在一定局限,而 ListWise 方法作为一种先进的排序策略,将物品列表作为整体进行优化,备受关注。本文将深入探讨 ListWise 在精排中的应用,借助理论、案例和代码实现。
二、ListWise 方法概述
ListWise 方法直接对物品列表进行排序,区别于 PointWise(单个物品打分)和 PairWise(物品对比较)方法。其核心是通过特定损失函数,让模型学习到符合用户对物品列表整体偏好的排序。常见的 ListWise 方法有 LambdaMART、ListNet、ListMLE 等,各自适用于不同场景,目标均为提升排序的准确性与效率。
三、ListWise 用于精排的优势
- 考虑整体顺序:ListWise 能充分考量物品间的相对顺序,使排序结果更贴合用户真实偏好,因为用户不仅关注单个物品,还在意其排列顺序。
- 适应复杂场景:面对实际推荐系统中复杂的用户需求和行为,ListWise 可通过学习用户对不同物品列表的反馈,更好地应对,增强排序的准确性和鲁棒性。
- 提高推荐效果:合理的物品排序有助于提升推荐系统的点击率、转化率等指标,进而提升用户体验和业务收益。
四、ListWise 样本具体的构建过程
4.1 确定样本的上下文
样本的上下文确定至关重要,它可以是用户的一次搜索行为、一段时间内的浏览历史等。例如在电商推荐系统中,用户搜索“智能手机”这一行为就构成了样本的上下文。
4.2 收集候选物品及相关特征
明确上下文后,收集该情境下的所有候选物品,并提取其特征。这些特征涵盖物品基本属性(如品牌、型号、内存等)、销售数据(销量、销售额)、用户评价(评分、评论数)以及与用户相关的特征(用户对品牌的历史购买次数、浏览时长等)。
以“智能手机”搜索场景为例,候选物品的特征如下:
特征名称 | 示例值 |
---|---|
品牌 | 苹果 |
型号 | iPhone 14 |
内存 | 128GB |
销量 | 5000 台 |
品牌知名度得分 | 0.9(0-1 之间) |
用户评价分数 | 4.7(满分 5 分) |
用户对该品牌历史购买次数 | 3 次 |
4.3 确定物品的真实排序标签
为引导模型学习正确排序,需确定候选物品的真实排序标签。获取方式多样,如:
- 用户点击行为:用户点击的物品可认为排序更靠前,依据点击先后确定相对顺序。
- 用户购买行为:购买行为是更强的偏好信号,购买的物品排序更优。
- 专家标注:必要时请领域专家人工标注物品排序,获取准确标签。
比如用户搜索“智能手机”后,依次点击了 A、B、C 三款手机,那么真实排序为 A > B > C。
4.4 构建样本列表
将候选物品特征与真实排序标签组合成样本。每个样本以列表形式呈现,列表元素是包含物品特征和真实排序标签的元组。
示例代码如下:
# 假设候选物品的特征存储在一个列表中,每个元素是一个特征向量
item_features = [[0, 14, 128, 5000, 0.9, 4.7, 3], # 物品 1(iPhone 14)的特征,这里用简单编码表示品牌等信息[1, 22, 256, 4000, 0.8, 4.6, 2], # 物品 2 的特征[2, 10, 64, 3000, 0.7, 4.5, 1] # 物品 3 的特征
]
# 假设物品的真实排序标签为 2(物品 1)> 1(物品 2)> 0(物品 3)
true_ranks = [2, 1, 0]# 构建样本列表
sample = []
for i in range(len(item_features)):sample.append((item_features[i], true_ranks[i]))print(sample)
4.5 划分训练集、验证集和测试集
将构建好的样本列表按一定比例划分为训练集、验证集和测试集。训练集用于模型训练,验证集调整超参数,测试集评估模型性能。
from sklearn.model_selection import train_test_split# 假设 sample 是上述构建的样本列表
train_sample, test_sample = train_test_split(sample, test_size=0.2, random_state=42)
train_sample, val_sample = train_test_split(train_sample, test_size=0.2, random_state=42)print(f"训练集样本数量: {len(train_sample)}")
print(f"验证集样本数量: {len(val_sample)}")
print(f"测试集样本数量: {len(test_sample)}")
五、ListWise 方法案例分析
以 ListNet 为例,使用普通神经网络实现。假设我们是一个音乐推荐系统,要对用户搜索“流行音乐”后的歌曲列表进行精排。
-
数据准备:
- 特征:歌曲的播放量、收藏量、歌手知名度、发布年份等。
- 标签:用户对歌曲的收藏行为(收藏为 1,未收藏为 0),并根据收藏先后确定真实排序。
-
构建神经网络模型:
import torch
import torch.nn as nn
import torch.optim as optimclass ListNet(nn.Module):def __init__(self, input_size):super(ListNet, self).__init__()self.fc1 = nn.Linear(input_size, 128)self.relu = nn.ReLU()self.fc2 = nn.Linear(128, 64)self.fc3 = nn.Linear(64, 1)def forward(self, x):out = self.fc1(x)out = self.relu(out)out = self.fc2(out)out = self.relu(out)out = self.fc3(out)return out# 假设特征维度为 10
input_size = 10
model = ListNet(input_size)
- 训练模型:
# 假设 X_train 是训练集特征,y_train 是训练集标签(真实排序)
X_train = torch.randn(100, input_size)
y_train = torch.randint(0, 2, (100,))criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)for epoch in range(100):optimizer.zero_grad()outputs = model(X_train)loss = criterion(outputs.squeeze(), y_train.float())loss.backward()optimizer.step()if (epoch + 1) % 10 == 0:print(f'Epoch [{epoch + 1}/100], Loss: {loss.item():.4f}')
- 模型评估:
使用测试集计算归一化折损累计增益(NDCG)等指标。
# 假设 X_test 是测试集特征,y_test 是测试集标签(真实排序)
X_test = torch.randn(20, input_size)
y_test = torch.randint(0, 2, (20,))def dcg_score(y_true, y_score, k=5):order = torch.argsort(y_score, descending=True)y_true = torch.take(y_true, order[:k])gains = 2 ** y_true - 1discounts = torch.log2(torch.arange(len(y_true), dtype=torch.float32) + 2)return torch.sum(gains / discounts)def ndcg_score(y_true, y_score, k=5):best_dcg = dcg_score(y_true, y_true, k)if best_dcg == 0:return 0return dcg_score(y_true, y_score, k) / best_dcgwith torch.no_grad():outputs = model(X_test)ndcg = ndcg_score(y_test, outputs.squeeze())print(f'NDCG: {ndcg.item()}')
- 模型应用:
将训练好的模型用于实际精排,对用户搜索“流行音乐”后的歌曲列表排序并展示。
六、ListWise 方法在精排中的挑战与解决方案
- 数据稀疏性:实际推荐系统中用户反馈稀疏,导致训练数据不足。可采用数据增强技术,如模拟用户行为、扩展物品特征,增加数据量和质量。
- 计算复杂度:ListWise 需对整个物品列表计算,计算复杂度高。可通过优化算法、分布式计算降低复杂度,提高效率。
- 模型可解释性:相比 PointWise 和 PairWise,ListWise 模型可解释性差。可通过特征重要性分析、模型可视化提高可解释性,帮助理解决策过程。
七、结论
ListWise 方法在推荐系统精排阶段优势显著。通过本文对其原理、优势、样本构建、案例及挑战的介绍。未来,ListWise 可结合深度学习、优化损失函数等,进一步提高排序准确性和效率。
相关文章:
借助 ListWise 提升推荐系统精排效能:技术、案例与优化策略
目录 一、引言二、ListWise 方法概述三、ListWise 用于精排的优势四、ListWise 样本具体的构建过程4.1 确定样本的上下文4.2 收集候选物品及相关特征4.3 确定物品的真实排序标签4.4 构建样本列表4.5 划分训练集、验证集和测试集 五、ListWise 方法案例分析六、ListWise 方法在精…...

C++中什么时候用. 什么时候用->
学了一年C今天出了一个大岔子,因为太久没有做链表类型题目了,并且STL用惯了今天遇到一题,写的时候发现完全不对劲,搞慌了,首先我们看题目 2. 两数相加 再看我第一次的解答,先不论结果对不对 错的行为有很多…...

从云原生到 AI 原生,谈谈我经历的网关发展历程和趋势
作者:谢吉宝(唐三) 编者按: 云原生 API 网关系列教程即将推出,欢迎文末查看教程内容。本文整理自阿里云智能集团资深技术专家,云原生产品线中间件负责人谢吉宝(唐三) 在云栖大会的精…...
【Python深入浅出】Python3正则表达式:开启高效字符串处理大门
目录 一、正则表达式基础入门1.1 什么是正则表达式1.2 正则表达式的语法规则1.3 特殊字符与转义 二、Python 中的 re 模块2.1 re 模块概述2.2 常用函数与方法2.2.1 re.match()2.2.2 re.search()2.2.3 re.findall()2.2.4 re.sub() 2.3 修饰符(Flags)的使用…...
Vue.js Vue CLI 安装与使用
Vue.js Vue CLI 安装与使用 今天我们来聊聊 Vue CLI 的安装与使用。对于开发 Vue 应用来说,Vue CLI 是一个非常强大的工具,它能帮助你快速创建项目脚手架、配置开发环境、自动化构建流程,从而大大提高开发效率。下面我就和大家一步一步地讲解…...
科技的尽头:在有限与永恒的夹缝中寻找文明的真谛
当人类用燧石点燃第一簇文明之火时,科技发展的齿轮便已开始转动。这个从原始工具到量子计算机的进化历程,既是人类突破生物局限的史诗,也是文明不断自我解构与重构的哲学叙事。站在人工智能与基因编辑并行的时代节点,"科技尽…...

【牛客】动态规划专题一:斐波那契数列
文章目录 DP1 斐波那契数列法1:递归法2:动态规划法3:优化空间复杂度 2.分割连接字符串3. 给定一个字符串s和一组单词dict,在s中添加空格将s变成一个句子 DP1 斐波那契数列 法1:递归 // 递归 #include <iostream>…...
java8、9新特性
JAVA8 Lambda 表达式 (parameters) -> expression 或 (parameters) ->{ statements; } 提供了一种更为简洁的语法,尤其适用于函数式接口。相比于传统的匿名内部类,Lambda 表达式使得代码更为紧凑,减少了样板代码的编写。 它允许将函…...

作业:zuoye
1.闹钟(错的) #include "widget.h" #include "ui_widget.h" #include <QMessageBox>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);// 初始化定时器objTimer new QTimer(th…...
redis底层数据结构——链表
文章目录 定义内部实现总结 定义 链表提供了高效的节点重排能力,以及顺序性的节点访间方式,并且可以通过增删节点来灵活地调整链表的长度。 作为一种常用数据结构,链表内置在很多高级的编程语言里面,因为Redis使用的C语言并没有…...
问题解决 4S 法
在深入研读《像高手一样解决问题》的第二章后,犹如打开了一扇通往高效问题解决领域的新大门,其中所阐述的问题解决 4S 法,更是给人以拨云见日之感。 一、陈述(State):明确问题本质 这是问题解决的起始点&…...
SQL-leetcode—1407. 排名靠前的旅行者
1407. 排名靠前的旅行者 表:Users ---------------------- | Column Name | Type | ---------------------- | id | int | | name | varchar | ---------------------- id 是该表中具有唯一值的列。 name 是用户名字。 表:Rides -------------------…...

机器学习(李宏毅)——Transformer
一、前言 本文章作为学习2023年《李宏毅机器学习课程》的笔记,感谢台湾大学李宏毅教授的课程,respect!!! 读这篇文章必须先了解self-attention,可参阅我上一篇。 二、大纲 Transformer问世原理剖析模型训…...

React进阶之React状态管理CRA
React状态管理&CRA 状态管理理论讲解案例 context 上下文结合状态来维护todoListindex.jsApp.jsTaskList.jsTasksContext.jsAddTask.js Escape 脱围机制refforwardRef(不建议使用) CRA 状态管理 理论讲解 如何针对 effect -> 对action的触发 -&…...
攻克AWS认证机器学习工程师(AWS Certified Machine Learning Engineer) - 助理级别认证:我的成功路线图
引言 当我决定考取AWS认证机器学习工程师 - 助理(AWS Certified Machine Learning Engineer — Associate)级别证书时,我就预料到这将是一段充满挑战但回报颇丰的旅程。跟你说吧,它在这两方面都没让我失望。这项考试面向的是不仅理解机器学习原理,还对AWS生态系统有扎实基…...
前端开发环境
vscde nrm 切换源管理 nvm 切换node版本工具 nodemon node运行js文件热更新 pxcook 易用的自动标注工具, 生成前端代码, 设计研发协作利器,比PS轻量 TypeScript 安装tsc 它的作用就是将ts文件编译为js文件 npm i typescript -g 输入tsc -v能够看到东西,就说明好了 …...

Web自动化测试—测试用例流程设计
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、测试用例通用结构回顾 1.1、现有测试用例存在的问题 可维护性差可读性差稳定性差 1.2、用例结构设计 测试用例的编排测试用例的项目结构 1.3、自动化测试…...

HTML全局属性与Meta元信息详解:优化网页的灵魂
目录 前言 一、HTML中的全局属性 常用的全局属性 二、Meta元信息标签:网页背后的重要配置 常用的Meta标签 三、Meta元信息的进阶使用 总结 前言 在HTML开发中,有一些属性和标签是全局性的,能够影响网页的多个方面,比如页面的…...

day001 折半查找/二分查找
day001 折半查找/二分查找 适用场景顺序表或者顺序数组 时间复杂度:log2N 算法思路 pre: 下限为0,上限为数组长度-1, 下限小于等于上限进行循环 if 比较目标值和中间值,if 大于: 则下限中间值索引1else: 小于: 则上限中间值索…...

Linux 资源监控:优化与跟踪系统性能
在 Evoxt,我们深知有效的 Linux 资源监控对于优化服务器性能至关重要。本指南将介绍关键工具和策略,帮助您监控 CPU、内存、磁盘和网络使用情况,确保您的 Linux 系统始终保持高效运行。 实时系统监控 使用 top(交互式系统监控&am…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...

在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !
我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...