使用特征
以下章节描述了学习排名插件提供的具体功能。这些信息将帮助您为学习排名 (LTR) 系统构建和上传功能。有关学习排名插件的作用和功能的更多信息,请参阅机器学习排名核心概念和插件范围。
了解功能在学习排名插件中的作用
学习排名插件将“功能”定义为“OpenSearch 查询”。当您使用搜索词和其他相关参数执行 OpenSearch 查询时,所得分数就是可用于训练数据的值。例如,功能可能包括对诸如 title
等字段的基本 match
查询。
{
"query": {
"match": {
"title": "{{keywords}}"
}
}
}
除了简单的基于查询的功能,您还可以使用文档属性(例如 popularity
)作为功能。例如,您可以使用函数评分查询来获取平均电影评分。
{
"query": {
"function_score": {
"functions": {
"field": "vote_average"
},
"query": {
"match_all": {}
}
}
}
}
另一个示例是基于位置的查询,例如地理距离过滤器。
{
"query": {
"bool" : {
"must" : {
"match_all" : {}
},
"filter" : {
"geo_distance" : {
"distance" : "200km",
"pin.location" : {
"lat" : "{{users_lat}}",
"lon" : "{{users_lon}}"
}
}
}
}
}
}
这些类型的查询是您正在训练的排名 f
函数通过数学方式组合以确定相关性分数的构建块。
在 LTR 查询中使用 Mustache 模板
LTR 查询中的功能使用 Mustache 模板。这允许您将变量插入到搜索查询中。例如,您可以有一个使用 {{keywords}}
插入搜索词的查询。或者您可以使用 {{users_lat}}
和 {{users_lon}}
来包含位置。这使您可以灵活地个性化搜索。
上传和命名功能
学习排名插件使您能够创建和修改功能。定义功能后,您可以记录它们以用于模型训练。通过将记录的功能数据与判断列表结合起来,您可以训练一个模型。一旦模型准备就绪,您就可以上传它,然后将其应用于您的搜索查询。
初始化默认功能存储
学习排名插件使用功能存储来存储有关您的功能和模型的元数据。通常,每个主要搜索实现都有一个功能存储,例如 Wikipedia 与 Wikitravel 相比。
对于大多数用例,您可以使用默认功能存储并避免管理多个功能存储。要初始化默认功能存储,请运行以下请求:
PUT _ltr
如果您需要从头开始,可以使用以下操作删除默认功能存储:
DELETE _ltr
删除功能存储将移除所有现有功能和模型数据。
本指南的其余部分将使用默认功能存储。
使用功能和功能集
“功能集”是已分组的功能集合。您可以使用功能集记录多个功能值以进行离线训练。创建新模型时,将相关功能集复制到模型定义中。
创建功能集
要创建功能集,您可以发送 POST 请求。创建功能集时,您需要提供名称和可选的功能列表,如以下示例请求所示:
POST _ltr/_featureset/more_movie_features
{
"featureset": {
"features": [
{
"name": "title_query",
"params": [
"keywords"
],
"template_language": "mustache",
"template": {
"match": {
"title": "{{keywords}}"
}
}
},
{
"name": "title_query_boost",
"params": [
"some_multiplier"
],
"template_language": "derived_expression",
"template": "title_query * some_multiplier"
},
{
"name": "custom_title_query_boost",
"params": [
"some_multiplier"
],
"template_language": "script_feature",
"template": {
"lang": "painless",
"source": "params.feature_vector.get('title_query') * (long)params.some_multiplier",
"params": {
"some_multiplier": "some_multiplier"
}
}
}
]
}
}
管理功能集
要获取特定功能集,您可以使用以下请求:
GET _ltr/_featureset/more_movie_features
要查看所有已定义功能集的列表,您可以使用以下请求:
GET _ltr/_featureset
如果功能集很多,您可以使用前缀过滤列表,如以下示例请求所示:
GET _ltr/_featureset?prefix=mor
这将仅返回名称以 mor
开头的功能集。
如果您需要重新开始,可以使用以下请求删除功能集:
DELETE _ltr/_featureset/more_movie_features
验证功能
添加新功能时,应验证功能是否按预期工作。您可以通过在功能创建请求中添加 validation
块来完成此操作。这允许学习排名插件在添加功能之前运行查询,从而及早发现任何问题。如果您不运行此验证,您可能直到稍后才发现查询虽然是有效的 JSON,但包含格式错误的 OpenSearch 查询。
要运行验证,您可以指定测试参数和要使用的索引,如以下示例验证块所示:
"validation": {
"params": {
"keywords": "rambo"
},
"index": "tmdb"
},
将验证块放置在功能集定义旁边。在以下示例中,match
查询格式错误(Mustache 模板中缺少花括号)。验证失败,并返回错误:
{
"validation": {
"params": {
"keywords": "rambo"
},
"index": "tmdb"
},
"featureset": {
"features": [
{
"name": "title_query",
"params": [
"keywords"
],
"template_language": "mustache",
"template": {
"match": {
"title": "{{keywords"
}
}
}
]
}
}
扩展功能集
您可能最初不知道哪些功能最有用。在这种情况下,您可以稍后将新功能添加到现有功能集以进行日志记录和模型评估。例如,如果要创建 user_rating
功能,可以使用功能集追加 API,如以下示例请求所示:
POST /_ltr/_featureset/my_featureset/_addfeatures
{
"features": [{
"name": "user_rating",
"params": [],
"template_language": "mustache",
"template" : {
"function_score": {
"functions": {
"field": "vote_average"
},
"query": {
"match_all": {}
}
}
}
}]
}
强制功能名称唯一
学习排名插件强制每个功能名称唯一。这是因为某些模型训练库通过名称引用功能。在前面的示例中,您无法添加新的 user_rating
功能,因为该功能名称已被使用,否则会导致错误。
将功能集视为列表
功能集更像有序列表而不是简单集合。每个功能都具有名称和序数位置。一些 LTR 训练应用程序(例如 RankLib)通过其序数位置(例如,第 1 个功能,第 2 个功能)引用功能。其他应用程序可能会使用功能名称。处理记录的功能时,您可能需要同时处理序数和名称,因为序数是保留的以维持列表顺序。