排序¶
设置¶
In [ ]
已复制!
pip install ydf -U
pip install ydf -U
什么是排序?¶
排序,也称为 排序学习,是确定项目顺序的任务。例如,当您在 Google 上搜索某个查询时,它会对网页进行排序并首先显示排名靠前的结果。表示排序数据集的一种常见方式是使用“相关性”得分。元素的顺序由其相关性定义:相关性较高的项目应出现在相关性较低的项目之前。错误成本由预测项目相关性与正确项目相关性之间的差异定义。例如,将相关性为 3 和 4 的两个项目排序错误,不如将相关性为 1 和 5 的两个项目排序错误那么糟糕。YDF 希望排序数据集以“扁平”格式呈现。查询和对应文档的数据集可能如下所示:
query | document_id | feature_1 | feature_2 | relevance |
---|---|---|---|---|
cat | 1 | 0.1 | blue | 4 |
cat | 2 | 0.5 | green | 1 |
cat | 3 | 0.2 | red | 2 |
dog | 4 | NA | red | 0 |
dog | 5 | 0.2 | red | 0 |
dog | 6 | 0.6 | green | 1 |
相关性/标签是一个介于 0 和 5 之间的浮点数值(通常介于 0 和 4 之间),其中 0 表示“完全不相关”,4 表示“非常相关”,5 表示“与查询相同”。
在此示例中,文档 1 与查询“cat”非常相关,而文档 2 仅与 cat“相关”。没有文档真正讨论“dog”(文档 6 的最高相关性为 1)。然而,对于 dog 查询,仍然期望返回文档 6(因为这是讨论 dog“最多”的文档)。
训练排序模型¶
模型的任务(例如,分类、回归、排序、提升)由 learner 参数 task
决定。
In [1]
已复制!
# Load libraries
import ydf # Yggdrasil Decision Forests
import pandas as pd # We use Pandas to load small datasets
import numpy as np
# Download and load a ranking datasets as Pandas DataFrames
ds_path = "https://raw.githubusercontent.com/google/yggdrasil-decision-forests/main/yggdrasil_decision_forests/test_data/dataset"
train_ds = pd.read_csv(f"{ds_path}/synthetic_ranking_train.csv")
test_ds = pd.read_csv(f"{ds_path}/synthetic_ranking_test.csv")
# Print the first 5 training examples
train_ds.head(5)
# 导入库 import ydf # Yggdrasil 决策森林 import pandas as pd # 我们使用 Pandas 加载小型数据集 import numpy as np # 下载并将排序数据集加载为 Pandas DataFrame ds_path = "https://raw.githubusercontent.com/google/yggdrasil-decision-forests/main/yggdrasil_decision_forests/test_data/dataset" train_ds = pd.read_csv(f"{ds_path}/synthetic_ranking_train.csv") test_ds = pd.read_csv(f"{ds_path}/synthetic_ranking_test.csv") # 打印前 5 个训练样本 train_ds.head(5)
Out[1]
GROUP | LABEL | cat_int_0 | cat_int_1 | cat_str_0 | cat_str_1 | num_0 | num_1 | num_2 | num_3 | |
---|---|---|---|---|---|---|---|---|---|---|
0 | G0 | 0.493644 | NaN | 11.0 | V_18 | V_7 | 0.923738 | 0.373921 | 0.154973 | 0.892344 |
1 | G0 | 1.461350 | 28.0 | 5.0 | V_15 | V_28 | 0.627094 | 0.907925 | 0.556397 | 0.839919 |
2 | G0 | 0.662606 | 6.0 | 22.0 | NaN | V_2 | 0.690948 | 0.129315 | 0.832686 | 0.318354 |
3 | G0 | 2.510630 | 7.0 | 1.0 | V_5 | V_12 | 0.698481 | NaN | 0.899466 | 0.831899 |
4 | G0 | 0.691813 | 15.0 | 24.0 | V_7 | V_27 | 0.102744 | 0.237528 | 0.379345 | 0.699236 |
在此数据集中,每一行表示一对查询/文档(称为“GROUP”)。“LABEL”表示相关性,它指示查询与文档的匹配程度。查询和文档的特征合并在一起作为其他列中的特征,例如 cat_int_0
、cat_int_1
等。
我们可以训练一个排序模型
In [2]
已复制!
model = ydf.GradientBoostedTreesLearner(
label="LABEL",
ranking_group="GROUP",
task=ydf.Task.RANKING).train(train_ds)
model = ydf.GradientBoostedTreesLearner( label="LABEL", ranking_group="GROUP", task=ydf.Task.RANKING).train(train_ds)
Train model on 3990 examples Model trained in 0:00:00.695050
默认情况下,YDF 使用 NDCG 评估排序模型。
In [3]
已复制!
evaluation = model.evaluate(test_ds)
print(evaluation)
evaluation = model.evaluate(test_ds) print(evaluation)
NDCG: 0.726741 num examples: 1010 num examples (weighted): 1010