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门户中创建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)
运行代码后,将呈现如下图表: