Link Search Menu Expand Document Documentation Menu

支持的算法

OpenSearch 提供内置的机器学习 (ML) 算法,可在您的集群中原生运行,用于异常检测、聚类和预测分析等任务。这些算法允许您直接在 OpenSearch 中分析数据,而无需外部机器学习模型或服务。每种算法都针对特定用例进行了优化,从检测指标中的异常模式到将相似数据点分组在一起。

常见限制

除 Localization 算法外,以下所有算法仅支持从索引中检索 10,000 个文档作为输入。

K-means

K-means 是一种简单且流行的无监督聚类机器学习算法,构建于 Tribuo 库之上。K-means 将随机选择聚类中心,然后迭代计算以优化聚类中心的位置,直到每个观测值都属于离其最近的聚类。

参数

参数 类型 描述 默认值
聚类中心 整型 用于对生成数据进行分组的聚类数量 2
迭代次数 整型 对数据执行的迭代次数,直到生成均值 10
距离类型 枚举,例如 EUCLIDEANCOSINEL1 用于测量聚类中心之间距离的度量类型 EUCLIDEAN

支持的 API

示例

以下示例使用 Iris 数据索引同步训练 k-means。

POST /_plugins/_ml/_train/kmeans
{
    "parameters": {
        "centroids": 3,
        "iterations": 10,
        "distance_type": "COSINE"
    },
    "input_query": {
        "_source": ["petal_length_in_cm", "petal_width_in_cm"],
        "size": 10000
    },
    "input_index": [
        "iris_data"
    ]
}

限制

训练过程支持多线程,但线程数必须小于 CPU 数量的一半。

线性回归

线性回归映射输入和输出之间的线性关系。在 ML Commons 中,线性回归算法采用自公共机器学习库 Tribuo,该库提供多维线性回归模型。该模型支持训练中的线性优化器,包括 Linear Decay、SQRT_DECAY、ADAADAMRMS_PROP 等流行方法。

支持的优化器: SIMPLE_SGDLINEAR_DECAY_SGDSQRT_DECAY_SGDADA_GRADADA_DELTAADAMRMS_PROP
支持的目标函数: ABSOLUTE_LOSSHUBERSQUARED_LOSS
支持的动量类型: STANDARDNESTEROV

参数

参数 类型 描述 默认值
目标 字符串 要预测的目标变量的名称。标识模型在训练期间将学习预测哪个特征。 NA
学习率 Double 迭代优化算法中使用的初始步长。 0.01
动量因子 Double 额外权重因子,用于加速权重调整的速度。这有助于使最小化例程脱离局部最小值。 0
epsilon Double 用于稳定梯度反转的值。 1.00E-06
beta1 Double 矩估计的指数衰减率。 0.9
beta2 Double 矩估计的指数衰减率。 0.99
衰减率 Double 均方根传播 (RMSProp)。 0.9
动量类型 字符串 定义的随机梯度下降 (SGD) 动量类型,有助于在正确方向上加速梯度向量,从而实现快速收敛。 STANDARD
优化器 字符串 模型中使用的优化器。 ADA_GRAD
目标函数 字符串 使用的目标函数。 SQUARED_LOSS
训练轮次 整数 迭代次数。 5
批量大小 整数 最小批量大小。 1
日志记录间隔 整数 训练迭代期间的日志记录频率。设置为 -1 可禁用日志记录。 -1
种子 长整型 用于可重现结果的随机种子。控制随机数生成器的初始化。 12345

支持的 API

示例

以下示例基于先前训练的线性回归模型创建新的预测。

请求示例

POST _plugins/_ml/_predict/LINEAR_REGRESSION/ROZs-38Br5eVE0lTsoD9
{
  "parameters": {
    "target": "price"
  },
  "input_data": {
    "column_metas": [
      {
        "name": "A",
        "column_type": "DOUBLE"
      },
      {
        "name": "B",
        "column_type": "DOUBLE"
      }
    ],
    "rows": [
      {
        "values": [
          {
            "column_type": "DOUBLE",
            "value": 3
          },
          {
            "column_type": "DOUBLE",
            "value": 5
          }
        ]
      }
    ]
  }
}

示例响应

{
  "status": "COMPLETED",
  "prediction_result": {
    "column_metas": [
      {
        "name": "price",
        "column_type": "DOUBLE"
      }
    ],
    "rows": [
      {
        "values": [
          {
            "column_type": "DOUBLE",
            "value": 17.25701855310131
          }
        ]
      }
    ]
  }
}

限制

ML Commons 仅支持线性随机梯度训练器或优化器,其无法有效映射训练数据中的非线性关系。当与复杂数据集一起使用时,线性随机训练器可能会导致一些收敛问题和不准确的结果。

RCF

随机森林切割 (Random Cut Forest, RCF) 是一种概率数据结构,主要用于无监督异常检测。其用途还扩展到密度估计和预测。OpenSearch 利用 RCF 进行异常检测。ML Commons 支持 RCF 的两种新变体以适应不同用例

  • 批量 RCF:检测非时间序列数据中的异常。
  • 时间固定 (Fixed in time, FIT) RCF:检测时间序列数据中的异常。

参数

RCF 支持以下参数。

批量 RCF

参数 类型 描述 默认值
树的数量 整型 森林中的树的数量。 30
样本大小 整型 森林中流采样器使用的相同大小。 256
输出之后 整型 流采样器返回结果前所需的点数。 32
训练数据大小 整型 您的训练数据大小。 数据集大小
异常分数阈值 双精度浮点型 异常分数的阈值。 1.0

FIT RCF

time_field 外,所有参数均为可选。

参数 类型 描述 默认值
树的数量 整型 森林中的树的数量。 30
瓦片大小 整型 一个瓦片,或最近记录的连续序列。 8
样本大小 整型 森林中流采样器使用的样本大小。 256
输出之后 整型 流采样器返回结果前所需的点数。 32
时间衰减 双精度浮点型 森林中流采样器使用的衰减因子。 0.0001
异常率 双精度浮点型 异常率。 0.005
时间字段 字符串 (必需)RCF 用作时间序列数据的时间字段。 不适用
日期格式 字符串 time_field 字段的日期和时间格式。 yyyy-MM-ddHH:mm:ss
时区 字符串 time_field 字段的时区。 UTC

支持的 API

限制

对于 FIT RCF,您可以使用历史数据训练模型,并将训练好的模型存储在您的索引中。使用 Predict API 时,模型将被反序列化并预测新的数据点。但是,索引中的模型不会用新数据刷新,因为该模型是时间固定的。

RCF 汇总

RCF 汇总是一种基于使用代表进行聚类 (Clustering Using Representatives, CURE) 算法的聚类算法。与使用随机迭代进行聚类的 k-means 相比,RCF 汇总使用分层聚类技术。该算法从一组随机选择的聚类中心开始,这些聚类中心大于聚类中心的真实分布。在迭代过程中,彼此距离过近的聚类中心对会自动合并。因此,聚类中心的数量 (max_k) 收敛到符合真实情况的合理聚类数量,而不是固定的 k 个聚类数量。

参数

参数 类型 描述 默认值
max_k 整数 允许的最大聚类中心数量。 2
距离类型 字符串。有效值为 EUCLIDEANL1L2LInfinity 用于测量聚类中心之间距离的度量类型。 EUCLIDEAN

支持的 API

示例:训练和预测

以下示例估计聚类中心并为给定数据帧中的每个样本提供聚类标签。

请求示例

POST _plugins/_ml/_train_predict/RCF_SUMMARIZE
{
  "parameters": {
    "centroids": 3,
    "max_k": 15,
    "distance_type": "L2"
  },
  "input_data": {
    "column_metas": [
      {
        "name": "d0",
        "column_type": "DOUBLE"
      },
      {
        "name": "d1",
        "column_type": "DOUBLE"
      }
    ],
    "rows": [
      {
        "values": [
          {
            "column_type": "DOUBLE",
            "value": 6.2
          },
          {
            "column_type": "DOUBLE",
            "value": 3.4
          }
        ]
      }
    ]
  }
}

示例响应

预测结果中的 rows 参数已针对长度进行修改。在您的响应中,预计响应正文将包含更多行和列。

{
  "status": "COMPLETED",
  "prediction_result": {
    "column_metas": [
      {
        "name": "ClusterID",
        "column_type": "INTEGER"
      }
    ],
    "rows": [
      {
        "values": [
          {
            "column_type": "DOUBLE",
            "value": 0
          }
        ]
      }
    ]
  }
}

本地化

本地化算法查找聚合数据(例如,按时间聚合)的子集级别信息,这些信息展示了感兴趣的活动,例如峰值、下降、变化或异常。本地化可应用于不同的场景,例如数据探索或根本原因分析,以揭示聚合数据中驱动感兴趣活动的贡献者。

参数

filter_queryanomaly_start 外,所有参数均为必需。

参数 类型 描述 默认值
索引名称 字符串 要分析的数据集合。 不适用
属性字段名称 列表 实体键的字段。 不适用
聚合 列表 值的字段和聚合。 不适用
时间戳字段名称 字符串 时间戳字段。 null
开始时间 长整型 时间范围的开始。 0
结束时间 长整型 时间范围的结束。 0``
最小时间间隔 长整型 分析的最小时间间隔/尺度。 0
输出数量 整数 本地化/切片的最大值数量。 0
过滤查询 长整型 (可选)减少用于分析的数据集合。 不适用
anomal`y_star 时间单位 (可选)数据将在此时间之后进行分析。 不适用

示例:执行本地化

以下示例对 RCA 索引执行本地化。

请求示例

POST /_plugins/_ml/_execute/anomaly_localization
{
  "index_name": "rca-index",
  "attribute_field_names": [
    "attribute"
  ],
  "aggregations": [
    {
      "sum": {
        "sum": {
          "field": "value"
        }
      }
    }
  ],
  "time_field_name": "timestamp",
  "start_time": 1620630000000,
  "end_time": 1621234800000,
  "min_time_interval": 86400000,
  "num_outputs": 10
}

示例响应

每当算法在指定时间间隔内执行时,API 都会响应每个聚合的贡献值和基本值的总和。

{
  "results" : [
    {
      "name" : "sum",
      "result" : {
        "buckets" : [
          {
            "start_time" : 1620630000000,
            "end_time" : 1620716400000,
            "overall_aggregate_value" : 65.0
          },
          {
            "start_time" : 1620716400000,
            "end_time" : 1620802800000,
            "overall_aggregate_value" : 75.0,
            "entities" : [
              {
                "key" : [
                  "attr0"
                ],
                "contribution_value" : 1.0,
                "base_value" : 2.0,
                "new_value" : 3.0
              },
              {
                "key" : [
                  "attr1"
                ],
                "contribution_value" : 1.0,
                "base_value" : 3.0,
                "new_value" : 4.0
              },
              {
                ...
              },
             {
                "key" : [
                  "attr8"
                ],
                "contribution_value" : 6.0,
                "base_value" : 10.0,
                "new_value" : 16.0
              },
              {
                "key" : [
                  "attr9"
                ],
                "contribution_value" : 6.0,
                "base_value" : 11.0,
                "new_value" : 17.0
              }
            ]
          }
        ]
      }
    }
  ]
}

限制

本地化算法只能直接执行。因此,它不能与 ML Commons 的 Train 和 Predict API 一起使用。

逻辑回归

逻辑回归是一种分类算法,它根据输入变量对离散结果的概率进行建模。在 ML Commons 中,这些分类包括二元分类和多类分类。最常见的是二元分类,它取两个值,例如“真/假”或“是/否”,并根据指定的值预测结果。或者,多类输出可以根据类型对不同的输入进行分类。这使得逻辑回归在您试图确定输入如何最适合指定类别的情况下最有用。

支持的优化器: SIMPLE_SGDLINEAR_DECAY_SGDSQRT_DECAY_SGDADA_GRADADA_DELTAADAMRMS_PROP支持的目标函数: HINGELOGMULTICLASS
支持的动量类型: STANDARDNESTEROV

参数

参数 类型 描述 默认值
学习率 Double 迭代优化算法中使用的初始步长。 1
动量因子 Double 额外权重因子,用于加速权重调整的速度。这有助于使最小化例程脱离局部最小值。 0
epsilon Double 用于稳定梯度反转的值。 0.1
beta1 Double 矩估计的指数衰减率。 0.9
beta2 Double 矩估计的指数衰减率。 0.99
衰减率 Double 均方根传播 (RMSProp)。 0.9
动量类型 字符串 随机梯度下降 (SGD) 动量,有助于在正确方向上加速梯度向量,从而实现快速收敛。 STANDARD
优化器 字符串 模型中使用的优化器。 ADA_GRAD
目标 字符串 目标字段。 null
目标函数 字符串 目标函数类型。 LOGMULTICLASS
训练轮次 整数 迭代次数。 5
批量大小 整数 最小批量大小。 1
日志记录间隔 整数 多次迭代后丢失的日志间隔。如果算法不包含日志,则间隔为 1 1000

支持的 API

示例:使用 Iris 数据进行训练/预测

以下示例在 OpenSearch 中使用 Iris 数据集创建索引,然后使用逻辑回归训练数据。最后,它使用训练好的模型逐行预测 Iris 类型。

创建 Iris 索引

在使用此请求之前,请确保您已下载 Iris 数据

PUT /iris_data
{
  "mappings": {
    "properties": {
      "sepal_length_in_cm": {
        "type": "double"
      },
      "sepal_width_in_cm": {
        "type": "double"
      },
      "petal_length_in_cm": {
        "type": "double"
      },
      "petal_width_in_cm": {
        "type": "double"
      },
      "class": {
        "type": "keyword"
      }
    }
  }
}

从 IRIS_data.txt 摄取数据

POST _bulk
{ "index" : { "_index" : "iris_data" } }
{"sepal_length_in_cm":5.1,"sepal_width_in_cm":3.5,"petal_length_in_cm":1.4,"petal_width_in_cm":0.2,"class":"Iris-setosa"}
{ "index" : { "_index" : "iris_data" } }
{"sepal_length_in_cm":4.9,"sepal_width_in_cm":3.0,"petal_length_in_cm":1.4,"petal_width_in_cm":0.2,"class":"Iris-setosa"}
...
...

训练逻辑回归模型

此示例使用多类逻辑回归分类方法。在此,花萼和花瓣的长度和宽度作为输入,用于训练模型,以根据 class(由 target 参数指示)对聚类中心进行分类。

请求

{
  "parameters": {
    "target": "class"
  },
  "input_query": {
    "query": {
      "match_all": {}
    },
    "_source": [
      "sepal_length_in_cm",
      "sepal_width_in_cm",
      "petal_length_in_cm",
      "petal_width_in_cm",
      "class"
    ],
    "size": 200
  },
  "input_index": [
    "iris_data"
  ]
}

示例响应

model_id 将用于预测 Iris 的类别。

{
  "model_id" : "TOgsf4IByBqD7FK_FQGc",
  "status" : "COMPLETED"
}

预测结果

使用训练好的 Iris 数据集的 model_id,逻辑回归将根据输入数据预测 Iris 的类别。

POST _plugins/_ml/_predict/logistic_regression/SsfQaoIBEoC4g4joZiyD
{
  "parameters": {
    "target": "class"
  },
  "input_data": {
    "column_metas": [
      {
        "name": "sepal_length_in_cm",
        "column_type": "DOUBLE"
      },
      {
        "name": "sepal_width_in_cm",
        "column_type": "DOUBLE"
      },
      {
        "name": "petal_length_in_cm",
        "column_type": "DOUBLE"
      },
      {
        "name": "petal_width_in_cm",
        "column_type": "DOUBLE"
      }
    ],
    "rows": [
      {
        "values": [
          {
            "column_type": "DOUBLE",
            "value": 6.2
          },
          {
            "column_type": "DOUBLE",
            "value": 3.4
          },
          {
            "column_type": "DOUBLE",
            "value": 5.4
          },
          {
            "column_type": "DOUBLE",
            "value": 2.3
          }
        ]
      },
      {
        "values": [
          {
            "column_type": "DOUBLE",
            "value": 5.9
          },
          {
            "column_type": "DOUBLE",
            "value": 3.0
          },
          {
            "column_type": "DOUBLE",
            "value": 5.1
          },
          {
            "column_type": "DOUBLE",
            "value": 1.8
          }
        ]
      }
    ]
  }
}

示例响应

{
  "status" : "COMPLETED",
  "prediction_result" : {
    "column_metas" : [
      {
        "name" : "result",
        "column_type" : "STRING"
      }
    ],
    "rows" : [
      {
        "values" : [
          {
            "column_type" : "STRING",
            "value" : "Iris-virginica"
          }
        ]
      },
      {
        "values" : [
          {
            "column_type" : "STRING",
            "value" : "Iris-virginica"
          }
        ]
      }
    ]
  }
}

限制

收敛指标未内置于 Tribuo 的训练器中。因此,ML Commons 无法通过 ML Commons API 指示收敛状态。

指标关联

指标关联功能是 OpenSearch 2.7 中发布的一项实验性功能。它不能在生产环境中使用。要就改进该功能提供反馈,请在 ML Commons 仓库中创建问题。

指标关联算法在一组指标数据中查找事件。该算法将事件定义为时间上的一个窗口,其中多个指标同时显示异常行为。给定一组指标后,该算法会计算发生的事件数量、每个事件发生的时间,并确定每个事件涉及哪些指标。

要启用指标关联算法,请更新以下集群设置

PUT /_cluster/settings
{
  "persistent" : {
    "plugins.ml_commons.enable_inhouse_python_model": true
  }
}

参数

要使用指标关联算法,请包含以下参数。

参数 类型 描述 默认值
指标 数组 时间序列中可与异常行为关联的指标列表 不适用

输入

指标关联输入是指标数据的 M x T 数组,其中 M 是指标的数量,T 是每个单独指标值序列的长度。

将指标输入算法时,请假定以下内容

  1. 对于每个指标,输入序列的长度都相同,T。
  2. 所有输入指标都应具有相同的对应时间戳集。
  3. 总数据点数 M * T <= 10000。

示例:简单指标关联

以下示例将指标数量 (M) 输入为 3,时间步长 (T) 输入为 128

POST /_plugins/_ml/_execute/METRICS_CORRELATION
{"metrics": [[-1.1635416, -1.5003631, 0.46138194, 0.5308311, -0.83149344, -3.7009873, -3.5463789, 0.22571462, -5.0380244, 0.76588845, 1.236113, 1.8460795, 1.7576948, 0.44893077, 0.7363948, 0.70440894, 0.89451003, 4.2006273, 0.3697659, 2.2458954, -2.302939, -1.7706926, 1.7445002, -1.5246059, 0.07985192, -2.7756078, 1.0002468, 1.5977372, 2.9152713, 1.4172368, -0.26551363, -2.2883027, 1.5882446, 2.0145164, 3.4862874, -1.2486862, -2.4811826, -0.17609037, -2.1095612, -1.2184235, 0.63118523, -1.8909532, 2.039797, -0.5317177, -2.2922578, -2.0179775, -0.07992507, -0.12554549, -0.2553092, 1.1450123, -0.4640453, -2.190223, -4.671612, -1.5076426, 1.635445, -1.1394824, -0.7503817, 0.98424894, -0.38896716, 1.0328646, 1.9543738, -0.5236269, 0.14298044, 3.2963762, 8.1641035, 5.717064, 7.4869685, 2.5987444, 11.018798, 9.151356, 5.7354255, 6.862203, 3.0524514, 4.431755, 5.1481285, 7.9548607, 7.4519925, 6.09533, 7.634116, 8.898271, 3.898491, 9.447067, 8.197385, 5.8284273, 5.804283, 7.7688456, 10.574343, 7.5679493, 7.1888094, 7.1107903, 8.454468, 8.066334, 8.83665, 7.11204, 4.4898267, 8.614764, 6.336754, 11.577503, 3.3998494, 9.501525, 13.17289, 6.1116023, 5.143777, 2.7813284, 3.7917604, 7.1683135, 7.627272, 7.290255, 3.1299121, 7.089733, 9.140584, 8.844729, 9.403275, 10.220029, 8.039719, 8.85549, 4.034555, 4.412663, 7.54451, 7.2116737, 4.6346946, 7.0044127, 9.7557, 10.982841, 5.897937, 6.870126, 3.5638695, 5.7872133], [1.3037996, 2.7976995, -0.12042701, 1.3688855, 1.6955005, -2.2575269, 0.080582514, 3.011721, -0.4320283, 3.2440786, -1.0321085, 1.2346085, -2.3152106, -0.9783513, 0.6837618, 1.5320586, -1.6148578, -0.94538075, 0.55978125, -4.7430468, 3.466028, 2.3792691, 1.3269067, -0.35359794, -1.5547276, 0.5202475, 1.0269136, -1.7531714, 0.43987304, -0.18845831, 2.3086758, 2.519588, 2.0116413, 0.019745048, -0.010070452, 2.496933, 1.1557871, 0.08433053, 1.375894, -1.2135965, -1.2588277, -0.31454003, 0.045949124, -1.7518936, -2.3533764, -2.0125146, 0.10255043, 1.1782314, 2.4579153, -0.8780899, -4.1442213, 3.8300152, 2.772975, 2.6803262, 0.9867382, 0.77618766, 0.46541777, 3.8959959, -2.1713195, 0.10609512, -0.26438138, -2.145317, 3.6734529, 1.4830295, -5.3445525, -10.6427765, -8.300354, -1.9608921, -6.6779685, -10.019544, -8.341513, -9.607174, -7.2441607, -3.411102, -6.180552, -8.318714, -6.060591, -7.790343, -5.9695, -7.9429936, -3.775652, -5.2827606, -3.7168224, -6.729588, -9.761094, -7.4683576, -7.2595067, -6.6790915, -9.832726, -8.352172, -6.936336, -8.252518, -6.787475, -9.091013, -11.465944, -6.712504, -8.987438, -6.946672, -8.877166, -6.7854185, -3.6417139, -6.1036086, -5.360772, -4.0435786, -4.5864973, -6.971063, -10.522461, -6.3692527, -4.387658, -9.723745, -4.7020173, -5.097396, -9.903703, -4.882414, -4.1999683, -6.7829437, -6.2555966, -8.121125, -5.334131, -9.174302, -3.9752126, -4.179469, -8.335524, -9.359406, -6.4938803, -6.794677, -8.382997, -9.879416], [1.8792984, -3.1561708, -0.8443318, -1.998743, -0.6319316, 2.4614046, -0.44511616, 0.82785237, 1.7911717, -1.8172283, 0.46574894, -1.8691323, 3.9586513, 0.8078605, 0.9049874, 5.4086914, -0.7425967, -0.20115769, -1.197923, 2.741789, 0.85432875, -1.1688408, -1.7771784, 1.615249, -4.1103697, 0.4721327, -2.75669, -0.38393462, -3.1137516, -2.2572582, 0.9580673, -3.7139492, -0.68303126, 1.6007807, 0.6313973, -2.5115106, 0.703251, 2.4844077, -1.7405633, -3.007687, 2.372802, 2.4684637, 0.6443977, -3.1433117, 0.05976736, -1.9809214, 3.514713, 2.1880944, 1.242541, 1.8236228, 0.8642841, -0.17313614, 1.7042321, 0.8298376, 4.2443194, 0.13983983, 1.1940852, 2.5076652, 39.285202, 82.73858, 44.707516, -4.267148, 0.25930226, 0.20799652, -3.7213502, 1.475217, -1.2394199, -0.0034497892, 1.1413965, 55.18923, -2.2969518, -4.1400924, -2.4707043, 43.193188, -0.19258368, 3.471275, 1.1374166, 1.2147579, 4.13017, -2.0576499, 2.1529694, -0.28360432, 0.8477302, -0.63012695, 1.2569811, 1.943168, 0.17070436, 3.2358394, -2.3737662, 0.77060974, 4.99065, 3.1079204, 3.6347675, 0.6801177, -2.2205186, 1.0961101, -2.4445753, -2.0919478, -2.895031, 2.5458927, 0.38599384, 1.0492333, -0.081834644, -7.4079595, -2.1785216, -0.7277175, -2.7413428, -3.2083786, 3.2958643, -1.1839997, 5.4849496, 2.0259023, 5.607272, -1.0125756, 3.721461, 2.5715313, 0.7741753, -0.55034757, 0.7526307, -2.6758716, -2.964664, -0.57379586, -0.28817406, -3.2334063, -0.22387607, -2.0793931, -6.4562697, 0.80134094]]}

示例响应

API 返回以下信息

  • event_window:事件间隔
  • event_pattern:时间窗口内的强度分数和事件的整体严重性
  • suspected_metrics:涉及的指标集

在以下示例响应中,每个项目都对应于指标数据中发现的事件。算法在请求的输入数据中找到一个事件,如 event_pattern 输出长度为 1 所示。event_window 显示事件发生在时间点 $t$ = 52 和 $t$ = 72 之间。最后,suspected_metrics 显示事件涉及所有三个指标。

{
  "function_name": "METRICS_CORRELATION",
  "output": {
    "inference_results": [
      {
        "event_window": [
          52,
          72
        ],
        "event_pattern": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.99625e-05, 0.0001052875, 0.0002605894, 0.00064648513, 0.0014303402, 0.002980127, 0.005871893, 0.010885878, 0.01904726, 0.031481907, 0.04920215, 0.07283493, 0.10219432, 0.1361888, 0.17257516, 0.20853643, 0.24082609, 0.26901975, 0.28376183, 0.29364157, 0.29541212, 0.2832976, 0.29041746, 0.2574534, 0.2610143, 0.22938538, 0.19999361, 0.18074994, 0.15539801, 0.13064545, 0.10544432, 0.081248805, 0.05965102, 0.041305058, 0.027082501, 0.01676033, 0.009760197, 0.005362286, 0.0027713624, 0.0013381141, 0.0006126331, 0.0002634901, 0.000106459476, 4.0407333e-05, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        "suspected_metrics": [0,1,2]
      }
    ]
  }
}