教程:在 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 资源管理器应用程序中使用。
创建资源
- 在 Azure 门户中创建 Azure 数据资源管理器群集。成功创建资源后,转到资源并创建数据库。
- 在 Azure 门户中创建异常检测器资源并检查你稍后需要的密钥和终结点。
- 在 Azure 数据资源管理器中启用插件
- 这些新函数具有内联 Python,要求在群集上启用 python() 插件。
- 这些新函数调用异常情况检测服务终结点,并需要:
- 在群集上启用 http_request 插件/http_request_post 插件。
- 修改
webapi
类型的标注策略以允许访问服务终结点。
下载示例数据
本快速入门使用 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 数据资源管理器。 将所引入数据的新表命名为“单变量”。
引入后,数据应如下所示:
检测整个时序中的异常
在 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)
运行代码后,将呈现如下图表: