ML.NET 示例:搜索引擎结果排名

ML.NET 示例中文版:https://github.com/feiyun0112/machinelearning-samples.zh-cn/edit/master/samples/csharp/getting-started/Ranking_Web

英文原版请访问:https://github.com/dotnet/machinelearning-samples/tree/master/samples/csharp/getting-started/Ranking_Web

v1.3.1动态API最新控制台应用程序.csv 文件搜索引擎结果排名排名LightGBM

这个介绍性示例演示如何使用ml.net来预测显示搜索引擎结果的最佳顺序。在机器学习领域,这种预测被称为排名。

问题

排名是搜索引擎面临的一个常见问题,因为用户希望查询结果根据其相关性进行排名/排序。这个问题包括各种业务场景,其中个性化排序是用户体验的关键,这已经超出了搜索引擎的需求。下面是几个具体的例子:

  • 旅行社-提供一份酒店列表,列出最有可能被排名靠前的用户购买/预订的酒店。

  • 购物-按与用户购物偏好一致的顺序显示产品目录中的项目。

  • 招聘-检索根据最适合新职位空缺的候选人排列的职位申请。

排名对任何场景都很有用,在这些场景中,按照增加点击、购买、预订等可能性的顺序列出项目非常重要。

在这个示例中,我们展示了如何将排名应用于搜索引擎结果。要执行排名,目前有两种算法可用-FastTree Boosting(FastRank)和Light Gradient Boosting Machine(LightGBM)。在这个示例中,我们使用LightGBM的LambdaRank实现自动构建一个ML模型来预测排名。

数据集

本示例使用的数据基于最初由Microsoft Bing提供的公共数据集。数据集在CC-by 4.0许可证下发布,包括训练、验证和测试数据。

@article{DBLP:journals/corr/QinL13,author    = {Tao Qin and Tie{-}Yan Liu},title     = {Introducing {LETOR} 4.0 Datasets},journal   = {CoRR},volume    = {abs/1306.2597},year      = {2013},url       = {https:timestamp = {Mon, 01 Jul 2013 20:31:25 +0200},biburl    = {https:bibsource = {dblp computer science bibliography, https:
}

此数据集的说明如下:

这些数据集是机器学习数据,其中查询和URL由ID表示。 数据集由从查询-网址对中提取的特征向量以及相关性判断标签组成:

  • 相关性判断是从商业网络搜索引擎(Microsoft Bing)的一个失效标签集中获得的,该标签集取5个值,从0(不相关)到4(完全相关)。

  • 这些特征基本上是由我们(微软)提取的,是研究界广泛使用的特征。

在这些数据文件中,每一行对应一个查询-网址对。第一列是相关标签,第二列是查询id,其他列是特性。相关性标签的值越大,查询-网址对的相关性就越大。查询-网址对由136维特征向量表示。

机器学习任务 - 排名

如前所述,本示例使用LightGBM LambdaRank算法,该算法使用名为Learning to Rank的监督学习技术。该技术要求训练/验证/测试数据集包含一组数据实例,每个实例都用它们的相关性得分(例如相关性判断标签)进行标记。标签是一个数字/序数值,例如{0,1,2,3,4}。主题专家可以手动对这些数据实例及其相关度评分进行标记。或者,可以使用其他度量来确定标签,例如对给定搜索结果的单击次数。

预计数据集将具有比“完美”更多的“差的”相关性分数。这有助于避免将排名列表直接转换为大小相等的{0、1、2、3、4}容器。关联度得分也会被重用,这样每个组中大多数样本被标记为0,这意味着结果是“差的”。而只有一个或几个标记为4,这意味着结果是“完美”。下面是数据集标签分布的细分。您将注意到,0(差的)比4(完美)标签多70倍:

  • Label 0 -- 624,263

  • Label 1 -- 386,280

  • Label 2 -- 159,451

  • Label 3 -- 21,317

  • Label 4 -- 8,881

一旦训练/验证/测试数据集被标记为相关分数,那么就可以使用这些数据对模型(ranker)进行训练和评估。通过模型训练过程,ranker学习如何根据标签值对组内的每个数据实例进行评分。单个数据实例的结果得分本身并不重要——相反,应该将这些得分相互比较,以确定组数据实例的相对顺序。一个数据实例的得分越高,它在其组中的相关性越强,排名也越高。

解决方案

由于本示例的数据集已经标记了相关分数,因此我们可以立即开始训练模型。如果您从一个没有标记的数据集开始,您将需要首先通过让主题专家提供相关性得分或使用其他一些度量来确定相关性来完成此过程。

通常,训练、验证和测试模型的模式包括以下步骤:

  1. 模型是在训练数据集上训练的。然后使用验证数据集评估模型的度量。

  2. 重复步骤1,通过重新训练和重新模型,直到达到所需的指标。此步骤的结果是应用必要的数据转换和训练器的管道。

  3. 管道用于在组合的训练+验证数据集上训练。然后在测试数据集上评估模型的度量(仅一次)——这是用于测量模型质量的最后一组度量。

  4. 最后一步是对组合的训练+验证+测试全部数据集上重新训练管道。然后,该模型就可以部署到生产环境中了。

对模型在生产中的表现的最终估计是步骤3中的指标。生产环境使用的最终模型,根据所有可用数据进,在步骤4中进行训练。

本示例执行上述步骤的简化版本以对搜索引擎结果进行排序:

  1. 管道是通过必要的数据转换和LightGBM LambdaRank训练器设置的。

  2. 模型是使用训练数据集训练。然后使用验证数据集对模型进行评估。这将为每个搜索引擎结果生成一个预测。预测通过检查指标进行评估;特别是Normalized Discounted Cumulative Gain(NDCG)。

  3. 管道用于使用培训+验证数据集重新训练模型。使用测试数据集对生成的模型进行评估——这是模型的最后一组度量。

  4. 最后一次使用培训+验证+测试数据集对模型进行再训练。最后一步是使用模型来执行新传入搜索的排名预测。这将为每个搜索引擎结果产生一个分数。分数用于确定与同一查询中的其他结果(例如组)相关的排名。

1. 设置管道

本示例使用依赖于LightGBM LambdaRank的LightGbmRankingTrainer训练模型。模型需要以下输入列:

  • Group Id—包含每个数据实例的组ID的列。数据实例包含在表示单个查询中所有候选结果的逻辑分组中,每个组都有一个称为组ID的标识符。对于搜索引擎数据集,搜索结果按其对应的查询分组,其中组ID对应于查询ID。组ID数据类型必须为键类型。

  • Label—包含每个数据实例的相关性标签的列,其中较高的值表示较高的相关性。标签数据类型必须是键类型或单精度浮点数。

  • Features—确定数据实例的相关性/排名方面有影响的列。 特征数据必须是单精度浮点数类型的固定大小向量。

当设置训练器时,自定义增益(或相关性增益)也可用于对每个标记的相关性得分应用权重。这有助于确保模型更加重视对权重更高的结果进行排名。在本示例中,我们使用默认提供的权重。

以下代码用于设置管道:

const string FeaturesVectorName = "Features";IDataView trainData = mlContext.Data.LoadFromTextFile<SearchResultData>(trainDatasetPath, separatorChar: '\t', hasHeader: true);var featureCols = trainData.Schema.AsQueryable().Select(s => s.Name).Where(c =>c != nameof(SearchResultData.Label) &&c != nameof(SearchResultData.GroupId)).ToArray();IEstimator<ITransformer> dataPipeline = mlContext.Transforms.Concatenate(FeaturesVectorName, featureCols).Append(mlContext.Transforms.Conversion.MapValueToKey(nameof(SearchResultData.Label))).Append(mlContext.Transforms.Conversion.Hash(nameof(SearchResultData.GroupId), nameof(SearchResultData.GroupId), numberOfBits: 20));IEstimator<ITransformer> trainer = mlContext.Ranking.Trainers.LightGbm(labelColumnName: nameof(SearchResultData.Label), featureColumnName: FeaturesVectorName, rowGroupColumnName: nameof(SearchResultData.GroupId));  ;
IEstimator<ITransformer> trainerPipeline = dataPipeline.Append(trainer);

2. 训练与评估模型

首先,我们需要使用训练数据集训练我们的模型。然后,我们需要评估我们的模型,以确定它在排名上的有效性。为此,模型将针对另一个未在训练中使用的数据集(验证数据集)运行。

Evaluate()验证数据集的预测值与数据集的标签进行比较,并生成您可以探索的各种度量。具体来说,我们可以使用Evaluate()返回的RankingMetrics中包含的Discounted Cumulative Gain(DCG)和Normalized Discounted Cumulative Gain(NDCG)来衡量模型的质量。

在评估示例模型的RankingMetrics时,您会注意到DCG和NDCG报告了以下度量值(运行示例时看到的值将类似于这些值):

  • DCG - @1:11.9736, @2:17.5429, @3:21.2532, @4:24.4245, @5:27.0554, @6:29.5571, @7:31.7560, @8:33.7904, @9:35.7949, @10:37.6874

  • NDCG: @1:0.4847, @2:0.4820, @3:0.4833, @4:0.4910, @5:0.4977, @6:0.5058, @7:0.5125, @8:0.5182, @9:0.5247, @10:0.5312

NDCG值是最有用的检查,因为这允许我们比较我们的模型在不同数据集的排名能力。NDCG的潜在值从0.01.0不等,其中1.0是一个完美的模型,与理想的排名完全匹配。

考虑到这一点,让我们看看我们的模型的NDCG值。特别是,让我们看看*NDCG@10的值,即0.5312。这是返回前10搜索引擎结果的查询的平均NDCG,有助于判断前10结果的排名是否正确。为了提高模型的排序能力,需要对特征工程和模型超参数进行实验,并对流水线进行相应的修改。我们将通过修改管道、训练模型和评估度量来继续迭代,直到达到所需的模型质量。

请参阅以下用于训练和评估模型的代码:


ITransformer model = pipeline.Fit(trainData);IDataView validationData = mlContext.Data.LoadFromTextFile<SearchResultData>(ValidationDatasetPath, separatorChar: '\t', hasHeader: false);[...]IDataView predictions = model.Transform(validationData);[...]RankingMetrics metrics = mlContext.Ranking.Evaluate(predictions);

3. 重新训练并执行模型的最终评估

一旦达到所需的度量,生成的管道将用于组合的训练+验证数据集上的训练。然后,我们最后一次使用测试数据集评估此模型,以获得模型的最终度量。

请参阅以下代码:


model = pipeline.Fit(trainValidationData);IDataView testData = mlContext.Data.LoadFromTextFile<SearchResultData>(TestDatasetPath, separatorChar: '\t', hasHeader: false);[...]IDataView predictions = model.Transform(testData);[...]RankingMetrics metrics = mlContext.Ranking.Evaluate(predictions);

4. 重新训练并使用模型

最后一步是使用所有数据(培训+验证+测试)重新训练模型。

在模型被训练之后,我们可以使用Predict() API来预测新的、传入的用户查询的搜索引擎结果排名。


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

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

相关文章

深入理解 JVM Class文件格式(四)

&#xff08;3&#xff09;CONSTANT_Integer_info 一个常量池中的CONSTANT_Integer_info数据项, 可以看做是CONSTANT_Integer类型的一个实例。 它存储的是源文件中出现的int型数据的值。 同样&#xff0c; 作为常量池中的一种数据类型&#xff0c; 它的第一个字节也是一个tag值…

.Net Core中使用Quartz.Net Vue开即用的UI管理

Quartz.NETQuartz.Net 定制UI维护了常用作业添加、删除、修改、停止、启动功能&#xff0c;直接使用cron表达式设置作业执行间隔&#xff0c;有完整的日志记录。Quartz.NET是一个功能齐全的开源作业调度系统&#xff0c;可用于从最小的应用程序到大型企业系统。Quartz.NET是一个…

Ancient Distance(妙啊!!!) [2020牛客暑期多校训练营(第四场)]

Ancient Distance 给定一颗根为111有nnn个节点的树&#xff0c;每次可以选定树上kkk节点当作特殊节点&#xff0c; 定义dis(u)dis(u)dis(u)为&#xff0c;从u−>1u->1u−>1遇上的第一个特殊点的距离&#xff0c;如果遇不上特殊点则dis(u)dis(u)dis(u)无穷大。 有nn…

深入理解 JVM Class文件格式(五)

&#xff08;8&#xff09; CONSTANT_Class_info 常量池中的一个CONSTANT_Class_info&#xff0c; 可以看做是CONSTANT_Class数据类型的一个实例。 他是对类或者接口的符号引用。 它描述的可以是当前类型的信息&#xff0c; 也可以描述对当前类的引用&#xff0c; 还可以描述对…

混沌工程详细介绍——Netflix持续交付实践探寻

内容来源&#xff1a;DevOps案例深度研究 – Netflix的文化与工程实践战队&#xff08;本文只展示部分案例PPT及研究成果&#xff0c;更多细节请关注案例分享活动&#xff0c;及本公众号&#xff09;。本案例内容贡献者&#xff1a;高金梅&#xff0c;李晓莉&#xff0c;潘雄鹰…

P4175 [CTSC2008]网络管理(整体二分)

P4175 [CTSC2008]网络管理 给定一棵有nnn个节点的树&#xff0c;点有点权&#xff0c;有两种操作&#xff1a;① 修改某个点的点权&#xff0c;② 查询两点路径间的点权第kkk大。 给定u,vu, vu,v&#xff0c;选定111号节点为根节点&#xff0c;设inf(x)inf(x)inf(x)表示从根节…

深入理解 JVM Class文件格式(六)

经过前几篇文章&#xff0c; 终于将常量池介绍完了&#xff0c; 之所以花这么大的功夫介绍常量池&#xff0c; 是因为对于理解class文件格式&#xff0c;常量池是必须要了解的&#xff0c; 因为class文件中其他地方&#xff0c;大量引用了常量池中的数据项。 对于还不了解常量池…

远程开发初探 - VS Code Remote Development

如果你是学生&#xff0c;你还在你的 windows 电脑上为各种环境配置头疼的时候&#xff0c;你应该了解一下 Remote Development。如果你喜欢 linux 的开发环境和舒适的 shell&#xff0c;但却不舍得抛弃 windows/macos 图形界面给你带来的用户体验和一些软件的兼容(QQ, 微信), …

深入理解 JVM Class文件格式(七)

本专栏列前面的一系列博客&#xff0c; 对Class文件中的一部分数据项进行了介绍。 本文将会继续介绍class文件中未讲解的信息。 先回顾一下上面一篇文章。 在上一篇博客中&#xff0c; 我们介绍了&#xff1a; this_class 对当前类的描述 super_class 对当前类的超类的描述 in…

P3250 [HNOI2016]网络(整体二分)

P3250 [HNOI2016]网络 给定一棵树&#xff0c;有三种操作&#xff1a; 给定u,v,wu, v, wu,v,w&#xff0c;表示u,vu, vu,v路径上有一个重要度为www的请求&#xff0c;给定ttt&#xff0c;第ttt个发生的请求结束&#xff0c;给定一个xxx&#xff0c;假设xxx发生故障&#xff0…

微信小程序集成腾讯云 IM SDK

1、背景因业务功能需求需要接入IM&#xff08;即时聊天&#xff09;功能&#xff0c;一开始想到的是使用 WebSocket 来实现这个功能&#xff0c;然天意捉弄&#xff08;哈哈&#xff09;服务器版本太低不支持 wx 协议&#xff08;也就不支持 WebSocket了&#xff09;不得不寻找…

深入理解 JVM Class文件格式(八)

在本专栏的第一篇文章 深入理解Java虚拟机到底是什么 中&#xff0c; 我们主要讲解了什么是虚拟机&#xff0c; 这篇博客是对JVM的一个概述。 在随后的几篇文章中&#xff0c;一直在讲解class文件格式。 在今天这篇博客中&#xff0c; 将会继续讲解class文件中的其他信息。 在本…

Function!(计蒜客 - 42386)

Function! fa(x)ax(a>0,a≠1)f_a(x) a ^ x(a > 0, \ a \neq 1)fa​(x)ax(a>0, a​1)&#xff0c;我们要求∑a2n(a∑ban⌊fa−1(b)⌋⌈fb−1(a)⌉)\sum\limits_{a 2} ^{n} \left(a \sum\limits_{b a} ^{n} \lfloor f_a ^{-1}(b) \rfloor \lceil f_b ^{-1}(a) \rce…

深入理解 JVM Class文件格式(九)

经过前八篇关于class文件的博客&#xff0c; 关于class文件格式的内容也基本上讲完了。 本文是关于class文件格式的最后一篇。 在这篇博客中&#xff0c; 将会讲解关于方法的几个属性。 理解这篇博客的内容&#xff0c; 对于理解JVM执行引擎起着重要作用。 关于虚拟机执行引擎有…

MongoDB入门及 c# .netcore客户端MongoDB.Driver2.9.1使用

MongoDB 是一个基于分布式文件存储的数据库。由 C 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。什么场景下使用MongoDBMongoDB虽然是NoSQL(非关系型的数据库)&#xff0c;但是实际使用的时候可以当做关系型数据库来用&#xff0c;mysql等数据库中单表数据量…

#4604. The kth maximum number(整体二分 + 树套树)

#4604. The kth maximum number 给定一个大小不超过51055 \times 10 ^ 55105的矩形区域&#xff0c;有一些点有点权。 每次询问给定x1,y1,x2,y2,kx_1, y_1, x_2, y_2, kx1​,y1​,x2​,y2​,k问以x1,y1x_1, y_1x1​,y1​为右下角&#xff0c;x2,y2x_2, y_2x2​,y2​为左上角的…

深入理解 JVM Class文件格式(十)

到此&#xff0c; 所有关于class文件格式的重要内容都已经讲解完了&#xff0c; 不敢说面面俱到&#xff0c; 但是敢说大部分重要的内容都包含在内了。前前后后用了9篇博客来专门讲解class文件结构&#xff0c; 为什么花那么多的时间和精力来介绍class文件呢&#xff1f; 简而言…

《WTM送书活动:向更遥远的星辰大海起航~》

点击上方蓝字关注我们吧是的,没错~这一篇不是大老刘写的 哈哈~啥? 你想知道为啥? 大老刘为了你们不加班,熬夜改BUG,姑娘不乐意了...然后...后面请自行脑补~哎~生活还要继续鸭....那么,接下来由我陪大家唠一段儿~ 单口...各位看官老爷们:注意了!第一件事情呢我们的WTM框…

P4602 [CTSC2018]混合果汁(主席树)

P4602 [CTSC2018]混合果汁 共有nnn种果汁&#xff0c;第iii种果汁的美味度为did_idi​&#xff0c;每升价格为pip_ipi​&#xff0c;在一瓶混合果汁中&#xff0c;最多只能添加lil_ili​升。 有mmm个询问&#xff0c;每次询问给出两个数g,Lg, Lg,L&#xff0c;我们要找出价格…

Java中的对象一定在堆上分配吗?

首先&#xff0c;为解释这个问题&#xff0c;需要的基本知识如下&#xff08;如果对以下概念不太熟悉&#xff0c; 可以先了解下&#xff09;&#xff1a; 1.JVM内存结构&#xff0c;传送门 2.即时编译&#xff08;JIT&#xff09;&#xff0c;传送门 3. 逃逸分析&#xff0c;…