教程:在 Azure 数据资源管理器中使用单变量异常检测器

重要

从 2023 年 9 月 20 日开始,将无法创建新的异常检测器资源。 异常检测器服务将于 2026 年 10 月 1 日停用。

介绍

使用异常检测器 API,无需了解机器学习方面的知识,就能查看和检测时序数据中的异常。 异常检测器 API 的算法通过自动查找最佳适配模型并将其应用到数据来进行自适应,并且不限行业、场景或数据量。 使用时序数据,此 API 可以确定异常检测的边界、预期的值,以及哪些数据点异常。

Azure 数据资源管理器是一种完全托管的高性能大数据分析平台,可让你轻松地以准实时方式分析大量数据。 Azure 数据资源管理器工具包提供了用于数据引入、查询、可视化和管理的端到端解决方案。

Azure 数据资源管理器中的异常情况检测功能

函数 1:series_uv_anomalies_fl()

series_uv_anomalies_fl() 函数通过调用单变量异常检测器 API 来检测时序中的异常。 函数接受一组有限的时间序列(作为数字动态数组)和所需的异常情况检测敏感级别。 每个时序都会转换为所需的 JSON(JavaScript 对象表示法)格式,然后发布到异常检测器服务终结点。 服务响应包含高/低/全部异常情况的动态数组、建模基线时序、其正常高/低边界(高于或低于高/低边界的值属于异常情况)和检测到的周期性。

函数 2:series_uv_change_points_fl()

series_uv_change_points_fl() 函数通过调用单变量异常检测器 API 来查找时序中的变化点。 此函数接受一组有限的时序(作为数值动态数组)、变化点检测阈值,以及稳定趋势窗口的最小大小。 每个时序都会转换为所需的 JSON 格式,然后发布到异常检测器服务终结点。 服务响应包含的动态数组中有变化点、其各自的置信度以及检测到的周期性。

这两个函数是使用 invoke 运算符应用的用户定义的表格函数。 可以将其代码嵌入查询,也可以将其定义为数据库中的存储函数。

在何处使用这些新功能?

这两个函数可在 Azure 数据资源管理器网站或 Kusto 资源管理器应用程序中使用。

Screenshot of Azure Data Explorer and Kusto Explorer

创建资源

  1. 在 Azure 门户中创建 Azure 数据资源管理器群集。成功创建资源后,转到资源并创建数据库。
  2. 在 Azure 门户中创建异常检测器资源并检查你稍后需要的密钥和终结点。
  3. 在 Azure 数据资源管理器中启用插件

下载示例数据

本快速入门使用 request-data.csv 文件,可从我们的 GitHub 示例数据下载此文件

还可以通过运行以下命令来下载示例数据:

curl "https://raw.githubusercontent.com/Azure/azure-sdk-for-python/main/sdk/anomalydetector/azure-ai-anomalydetector/samples/sample_data/request-data.csv" --output request-data.csv

然后按照引入指南将示例数据引入到 Azure 数据资源管理器。 将所引入数据的新表命名为“单变量”。

引入后,数据应如下所示:

Screenshot of Kusto query with sample data.

检测整个时序中的异常

在 Azure 数据资源管理器中,运行以下查询以使用载入的数据制作异常情况检测图表。 还可以创建一个函数,以将代码添加到存储函数中供持久使用。

let series_uv_anomalies_fl=(tbl:(*), y_series:string, sensitivity:int=85, tsid:string='_tsid') 
{ 
    let uri = '[Your-Endpoint]anomalydetector/v1.0/timeseries/entire/detect'; 
    let headers=dynamic({'Ocp-Apim-Subscription-Key': h'[Your-key]'}); 
    let kwargs = pack('y_series', y_series, 'sensitivity', sensitivity); 
    let code = ```if 1: 
        import json 
        y_series = kargs["y_series"] 
        sensitivity = kargs["sensitivity"] 
        json_str = [] 
        for i in range(len(df)): 
            row = df.iloc[i, :] 
            ts = [{'value':row[y_series][j]} for j in range(len(row[y_series]))] 
            json_data = {'series': ts, "sensitivity":sensitivity}     # auto-detect period, or we can force 'period': 84. We can also add 'maxAnomalyRatio':0.25 for maximum 25% anomalies 
            json_str = json_str + [json.dumps(json_data)] 
        result = df 
        result['json_str'] = json_str 
    ```; 
    tbl 
    | evaluate python(typeof(*, json_str:string), code, kwargs) 
    | extend _tsid = column_ifexists(tsid, 1) 
    | partition by _tsid ( 
       project json_str 
       | evaluate http_request_post(uri, headers, dynamic(null)) 
       | project period=ResponseBody.period, baseline_ama=ResponseBody.expectedValues, ad_ama=series_add(0, ResponseBody.isAnomaly), pos_ad_ama=series_add(0, ResponseBody.isPositiveAnomaly) 
       , neg_ad_ama=series_add(0, ResponseBody.isNegativeAnomaly), upper_ama=series_add(ResponseBody.expectedValues, ResponseBody.upperMargins), lower_ama=series_subtract(ResponseBody.expectedValues, ResponseBody.lowerMargins) 
       | extend _tsid=toscalar(_tsid) 
      ) 
} 
; 
let stime=datetime(2018-03-01); 
let etime=datetime(2018-04-16); 
let dt=1d; 
let ts = univariate
| make-series value=avg(Column2) on Column1 from stime to etime step dt 
| extend _tsid='TS1'; 
ts 
| invoke series_uv_anomalies_fl('value') 
| lookup ts on _tsid 
| render anomalychart with(xcolumn=Column1, ycolumns=value, anomalycolumns=ad_ama) 

运行代码后,将呈现如下图表:

Screenshot of line chart of anomalies.

后续步骤