排名¶
设置¶
In [ ]:
Copied!
pip install ydf -U
pip install ydf -U
什么是排名?¶
排名,也称为 学习排名,是确定项目顺序的任务。例如,当你在谷歌搜索一个查询时,它会对网页进行排名,并首先显示排名最高的结果。表示排名数据集的常见方式是使用“相关性”分数。元素的顺序由其相关性定义:相关性较大的项目应该出现在相关性较小的项目之前。错误的成本由预测项目的相关性与正确项目的相关性之间的差异定义。例如,将两个相关性为3和4的项目顺序错误,不如将两个相关性为1和5的项目顺序错误来得严重。
YDF希望排名数据集以“扁平”格式呈现。查询及相应文档的数据集可能如下所示:
查询 | 文档ID | 特征1 | 特征2 | 相关性 |
---|---|---|---|---|
猫 | 1 | 0.1 | 蓝色 | 4 |
猫 | 2 | 0.5 | 绿色 | 1 |
猫 | 3 | 0.2 | 红色 | 2 |
狗 | 4 | NA | 红色 | 0 |
狗 | 5 | 0.2 | 红色 | 0 |
狗 | 6 | 0.6 | 绿色 | 1 |
相关性/标签是一个介于0和5之间的浮点数值(通常在0和4之间),其中0表示“完全无关”,4表示“非常相关”,5表示“与查询相同”。
在这个例子中,文档1对查询“猫”非常相关,而文档2仅仅是“与猫相关”。没有真正谈论“狗”的文档(文档6的最高相关性为1)。然而,狗的查询仍然期望返回文档6(因为这是谈论“狗”最“多”的文档)。
训练排序模型¶
模型的任务(例如,分类、回归、排序、提升)由学习器参数 task
决定。
In [1]:
Copied!
# 加载库
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)
# 加载库
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]:
Copied!
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]:
Copied!
evaluation = model.evaluate(test_ds)
print(evaluation)
evaluation = model.evaluate(test_ds)
print(evaluation)
NDCG: 0.726741 num examples: 1010 num examples (weighted): 1010