当前位置: 首页 > news >正文

借助 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 用于精排的优势

  1. 考虑整体顺序:ListWise 能充分考量物品间的相对顺序,使排序结果更贴合用户真实偏好,因为用户不仅关注单个物品,还在意其排列顺序。
  2. 适应复杂场景:面对实际推荐系统中复杂的用户需求和行为,ListWise 可通过学习用户对不同物品列表的反馈,更好地应对,增强排序的准确性和鲁棒性。
  3. 提高推荐效果:合理的物品排序有助于提升推荐系统的点击率、转化率等指标,进而提升用户体验和业务收益。

四、ListWise 样本具体的构建过程

4.1 确定样本的上下文

样本的上下文确定至关重要,它可以是用户的一次搜索行为、一段时间内的浏览历史等。例如在电商推荐系统中,用户搜索“智能手机”这一行为就构成了样本的上下文。

4.2 收集候选物品及相关特征

明确上下文后,收集该情境下的所有候选物品,并提取其特征。这些特征涵盖物品基本属性(如品牌、型号、内存等)、销售数据(销量、销售额)、用户评价(评分、评论数)以及与用户相关的特征(用户对品牌的历史购买次数、浏览时长等)。

以“智能手机”搜索场景为例,候选物品的特征如下:

特征名称示例值
品牌苹果
型号iPhone 14
内存128GB
销量5000 台
品牌知名度得分0.9(0-1 之间)
用户评价分数4.7(满分 5 分)
用户对该品牌历史购买次数3 次

4.3 确定物品的真实排序标签

为引导模型学习正确排序,需确定候选物品的真实排序标签。获取方式多样,如:

  1. 用户点击行为:用户点击的物品可认为排序更靠前,依据点击先后确定相对顺序。
  2. 用户购买行为:购买行为是更强的偏好信号,购买的物品排序更优。
  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. 数据准备

    • 特征:歌曲的播放量、收藏量、歌手知名度、发布年份等。
    • 标签:用户对歌曲的收藏行为(收藏为 1,未收藏为 0),并根据收藏先后确定真实排序。
  2. 构建神经网络模型

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)
  1. 训练模型
# 假设 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}')
  1. 模型评估
    使用测试集计算归一化折损累计增益(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()}')
  1. 模型应用
    将训练好的模型用于实际精排,对用户搜索“流行音乐”后的歌曲列表排序并展示。

六、ListWise 方法在精排中的挑战与解决方案

  1. 数据稀疏性:实际推荐系统中用户反馈稀疏,导致训练数据不足。可采用数据增强技术,如模拟用户行为、扩展物品特征,增加数据量和质量。
  2. 计算复杂度:ListWise 需对整个物品列表计算,计算复杂度高。可通过优化算法、分布式计算降低复杂度,提高效率。
  3. 模型可解释性:相比 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&#xff1a;递归法2&#xff1a;动态规划法3&#xff1a;优化空间复杂度 2.分割连接字符串3. 给定一个字符串s和一组单词dict&#xff0c;在s中添加空格将s变成一个句子 DP1 斐波那契数列 法1&#xff1a;递归 // 递归 #include <iostream>…...

java8、9新特性

JAVA8 Lambda 表达式 (parameters) -> expression 或 (parameters) ->{ statements; } 提供了一种更为简洁的语法&#xff0c;尤其适用于函数式接口。相比于传统的匿名内部类&#xff0c;Lambda 表达式使得代码更为紧凑&#xff0c;减少了样板代码的编写。 它允许将函…...

作业:zuoye

1.闹钟&#xff08;错的&#xff09; #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底层数据结构——链表

文章目录 定义内部实现总结 定义 链表提供了高效的节点重排能力&#xff0c;以及顺序性的节点访间方式&#xff0c;并且可以通过增删节点来灵活地调整链表的长度。 作为一种常用数据结构&#xff0c;链表内置在很多高级的编程语言里面&#xff0c;因为Redis使用的C语言并没有…...

问题解决 4S 法

在深入研读《像高手一样解决问题》的第二章后&#xff0c;犹如打开了一扇通往高效问题解决领域的新大门&#xff0c;其中所阐述的问题解决 4S 法&#xff0c;更是给人以拨云见日之感。 一、陈述&#xff08;State&#xff09;&#xff1a;明确问题本质 这是问题解决的起始点&…...

SQL-leetcode—1407. 排名靠前的旅行者

1407. 排名靠前的旅行者 表&#xff1a;Users ---------------------- | Column Name | Type | ---------------------- | id | int | | name | varchar | ---------------------- id 是该表中具有唯一值的列。 name 是用户名字。 表&#xff1a;Rides -------------------…...

机器学习(李宏毅)——Transformer

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

React进阶之React状态管理CRA

React状态管理&CRA 状态管理理论讲解案例 context 上下文结合状态来维护todoListindex.jsApp.jsTaskList.jsTasksContext.jsAddTask.js Escape 脱围机制refforwardRef&#xff08;不建议使用&#xff09; 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能够看到东西&#xff0c;就说明好了 …...

Web自动化测试—测试用例流程设计

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

HTML全局属性与Meta元信息详解:优化网页的灵魂

目录 前言 一、HTML中的全局属性 常用的全局属性 二、Meta元信息标签&#xff1a;网页背后的重要配置 常用的Meta标签 三、Meta元信息的进阶使用 总结 前言 在HTML开发中&#xff0c;有一些属性和标签是全局性的&#xff0c;能够影响网页的多个方面&#xff0c;比如页面的…...

day001 折半查找/二分查找

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

Linux 资源监控:优化与跟踪系统性能

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

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

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&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...