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

Important

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

介绍

借助 异常检测器 API,无需了解机器学习,即可检查和检测时序数据中的异常。 无论行业、方案或数据量如何,异常检测器 API算法都会自动查找和应用最适合数据的模型来适应。 使用时序数据,此 API 可以确定异常检测的边界、预期的值,以及哪些数据点异常。

Azure 数据资源管理器是一个完全托管的高性能大数据分析平台,可便于近实时分析大量数据。 Azure 数据资源管理器工具箱提供用于数据引入、查询、可视化和管理的端到端解决方案。

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

函数 1:series_uv_anomalies_fl()

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

函数 2:series_uv_change_points_fl()

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

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

在何处使用这些新功能?

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

 Azure 数据资源管理器 和 Kusto Explorer 的Screenshot

创建资源

  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 数据资源管理器。 将所引入数据的新表命名为“单变量”。

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

屏幕截图显示包含示例数据的 Kusto 查询。

检测整个时序中的异常

在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) 

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

异常情况折线图的屏幕截图。

后续步骤