频繁项集聚合编辑

一种桶聚合,用于查找频繁项集。它是一种关联规则挖掘的形式,用于识别经常一起出现的项。经常一起购买的商品或倾向于同时发生的日志事件是频繁项集的例子。查找频繁项集有助于发现不同数据点(项)之间的关系。

聚合报告封闭项集。如果不存在具有相同文档比率(也称为其支持度值)的超集,则频繁项集称为封闭项集。例如,我们有两个以下频繁项集的候选项,它们具有相同的支持度值:1. 苹果、橙子、香蕉 2. 苹果、橙子、香蕉、西红柿。只返回第二个项集(苹果、橙子、香蕉、西红柿),而跳过第一个项集(它是第二个项集的子集)。如果两个项集的支持度值不同,则可能会同时返回它们。

聚合的运行时间取决于数据和提供的参数。聚合完成可能需要相当长的时间。因此,建议使用异步搜索来异步运行请求。

语法编辑

一个frequent_item_sets聚合在隔离时如下所示

"frequent_item_sets": {
  "minimum_set_size": 3,
  "fields": [
    {"field": "my_field_1"},
    {"field": "my_field_2"}
  ]
}

表 49. frequent_item_sets 参数

参数名称

描述

必需

默认值

fields

(数组)要分析的字段。

必需

minimum_set_size

(整数)一个项集的最小大小

可选

1

minimum_support

(整数)一个项集的最小支持度

可选

0.1

size

(整数)要返回的顶级项集的数量。

可选

10

filter

(对象)从分析中过滤文档的查询

可选

match_all

字段编辑

分析字段支持的字段类型为关键字、数字、IP、日期以及这些类型的数组。您还可以将运行时字段添加到分析字段中。

如果分析字段的组合基数很高,则聚合可能需要大量的系统资源。

您可以使用includeexclude参数过滤每个字段的值。这些参数可以是正则表达式字符串或精确术语的字符串数组。过滤后的值将从分析中删除,因此减少了运行时间。如果同时定义了includeexclude,则exclude优先;这意味着先评估include,然后评估exclude

最小集合大小编辑

最小集合大小是集合需要包含的最小项数。值为 1 返回单个项的频率。仅返回包含至少minimum_set_size个项的项集。例如,仅当最小集合大小为 3 或更小时,才会返回项集橙子、香蕉、苹果

最小支持度编辑

最小支持度值是项集必须存在于文档中的比率,才能被视为“频繁”。具体来说,它是介于 0 和 1 之间的归一化值。它是通过将包含项集的文档数除以文档总数来计算的。

例如,如果给定的项集包含在五个文档中,并且文档总数为 20,则该项集的支持度为 5/20 = 0.25。因此,仅当最小支持度为 0.25 或更低时,才会返回此集合。由于更高的最小支持度会修剪更多项,因此计算所需的资源更少。minimum_support参数会影响聚合所需的内存和运行时间。

大小编辑

此参数定义要返回的最大项集数。结果包含前 k 个项集;支持度值最高的项集。此参数会对聚合所需的内存和运行时间产生重大影响。

过滤器编辑

用于过滤文档的查询,作为分析的一部分使用。与过滤器不匹配的文档在生成项集时将被忽略,但在计算项集的支持度时仍会计算在内。

如果要将项集分析范围缩小到感兴趣的字段,请使用过滤器。使用顶级查询来过滤数据集。

示例编辑

在以下示例中,我们使用电子商务 Kibana 示例数据集。

具有两个分析字段和一个exclude参数的聚合编辑

在第一个示例中,目标是根据交易数据 (1.) 找出客户经常一起购买哪些产品类别,以及 (2.) 他们从哪些城市进行这些购买。我们希望排除位置信息不可用(城市名称为其他)的结果。最后,我们对包含三个或更多项的集合感兴趣,并希望看到支持度最高的前三个频繁项集。

请注意,我们在第一个示例中使用了异步搜索端点。

POST /kibana_sample_data_ecommerce/_async_search
{
   "size":0,
   "aggs":{
      "my_agg":{
         "frequent_item_sets":{
            "minimum_set_size":3,
            "fields":[
               {
                  "field":"category.keyword"
               },
               {
                  "field":"geoip.city_name",
                  "exclude":"other"
               }
            ],
            "size":3
         }
      }
   }
}

上述 API 调用的响应包含异步搜索请求的标识符(id)。您可以使用标识符检索搜索结果

GET /_async_search/<id>

API 返回类似于以下内容的响应

(...)
"aggregations" : {
    "my_agg" : {
      "buckets" : [ 
        {
          "key" : { 
            "category.keyword" : [
              "Women's Clothing",
              "Women's Shoes"
            ],
            "geoip.city_name" : [
              "New York"
            ]
          },
          "doc_count" : 217, 
          "support" : 0.04641711229946524 
        },
        {
          "key" : {
            "category.keyword" : [
              "Women's Clothing",
              "Women's Accessories"
            ],
            "geoip.city_name" : [
              "New York"
            ]
          },
          "doc_count" : 135,
          "support" : 0.028877005347593583
        },
        {
          "key" : {
            "category.keyword" : [
              "Men's Clothing",
              "Men's Shoes"
            ],
            "geoip.city_name" : [
              "Cairo"
            ]
          },
          "doc_count" : 123,
          "support" : 0.026310160427807486
        }
      ],
    (...)
  }
}

返回的项集数组。

key对象包含一个项集。在这种情况下,它由category.keyword字段的两个值和geoip.city_name字段的一个值组成。

包含项集的文档数。

项集的支持度值。它是通过将包含项集的文档数除以文档总数来计算的。

响应显示,客户最常一起购买的类别是女装女鞋,纽约的客户倾向于经常一起购买这些类别的商品。换句话说,购买标记为女装产品的客户更有可能也购买女鞋类别的产品,而纽约的客户最有可能一起购买这些类别的产品。支持度第二高的项集是女装女式配饰,客户主要来自纽约。最后,支持度第三高的项集是男装男鞋,客户主要来自开罗。

具有两个分析字段和一个过滤器的聚合编辑

我们以第一个示例为例,但希望将项集范围缩小到欧洲地区。为此,我们添加了一个过滤器,这次我们不使用exclude参数

POST /kibana_sample_data_ecommerce/_async_search
{
  "size": 0,
  "aggs": {
    "my_agg": {
      "frequent_item_sets": {
        "minimum_set_size": 3,
        "fields": [
          { "field": "category.keyword" },
          { "field": "geoip.city_name" }
        ],
        "size": 3,
        "filter": {
          "term": {
            "geoip.continent_name": "Europe"
          }
        }
      }
    }
  }
}

结果将仅显示从与过滤器匹配的文档创建的项集,即欧洲的购买。使用filter,计算出的support仍然会考虑所有购买。这与在顶级指定查询不同,在顶级指定查询的情况下,support仅根据欧洲的购买计算。

使用运行时字段分析数值编辑

频繁项聚合使您能够使用运行时字段对数值进行分桶。下一个示例演示了如何使用脚本来向文档中添加一个名为price_range的运行时字段,该字段根据单个交易的含税总价计算得出。然后,可以在频繁项聚合中将运行时字段用作要分析的字段。

GET kibana_sample_data_ecommerce/_search
{
  "runtime_mappings": {
    "price_range": {
      "type": "keyword",
      "script": {
        "source": """
           def bucket_start = (long) Math.floor(doc['taxful_total_price'].value / 50) * 50;
           def bucket_end = bucket_start + 50;
           emit(bucket_start.toString() + "-" + bucket_end.toString());
        """
      }
    }
  },
  "size": 0,
  "aggs": {
    "my_agg": {
      "frequent_item_sets": {
        "minimum_set_size": 4,
        "fields": [
          {
            "field": "category.keyword"
          },
          {
            "field": "price_range"
          },
          {
            "field": "geoip.city_name"
          }
        ],
        "size": 3
      }
    }
  }
}

API 返回类似于以下内容的响应

(...)
"aggregations" : {
    "my_agg" : {
      "buckets" : [
        {
          "key" : {
            "category.keyword" : [
              "Women's Clothing",
              "Women's Shoes"
            ],
            "price_range" : [
              "50-100"
            ],
            "geoip.city_name" : [
              "New York"
            ]
          },
          "doc_count" : 100,
          "support" : 0.0213903743315508
        },
        {
          "key" : {
            "category.keyword" : [
              "Women's Clothing",
              "Women's Shoes"
            ],
            "price_range" : [
              "50-100"
            ],
            "geoip.city_name" : [
              "Dubai"
            ]
          },
          "doc_count" : 59,
          "support" : 0.012620320855614974
        },
        {
          "key" : {
            "category.keyword" : [
              "Men's Clothing",
              "Men's Shoes"
            ],
            "price_range" : [
              "50-100"
            ],
            "geoip.city_name" : [
              "Marrakesh"
            ]
          },
          "doc_count" : 53,
          "support" : 0.011336898395721925
        }
      ],
    (...)
    }
  }

响应显示了客户最常一起购买的类别、倾向于购买这些类别商品的客户的位置,以及这些购买中最常见的價格范围。