使用 C# 开始使用 Microsoft Azure 认知服务异常检测器
介绍
当我还是个孩子的时候,《芝麻街》很受欢迎。其中一个短剧涉及一群孩子。除了一个孩子穿着条纹衬衫外,其他孩子都穿着纯色衬衫。短剧的名字是“这些中哪一个与其他的不一样?”
异常检测的作用类似,但规模要大得多。它分析数据集并寻找不一致、异常值和其他与其他数据点有很大差异的数据点。例如,电梯需要不断监控以确保安全运行。如果安装了定期记录数据的传感器,异常检测器算法可以通过在数据点偏离常态时通知维护人员来预测潜在问题。需要注意的是,数据点应该是有规律的——换句话说,数据集是一个时间序列。
Microsoft Azure 认知服务提供异常检测器服务,该服务在 REST API 后面带有预训练的异常检测机器学习模型。您无需了解任何有关异常检测的知识即可使用它。您所要做的就是将 API 指向您的数据集,然后它会完成其余的工作。它是 Azure 认知服务中比较简单的产品之一。本指南将演示如何使用 C# 编程语言开始使用。
访问 API
有两种方法可以访问异常检测器服务。第一种是使用特定语言的客户端库,例如 C#、JavaScript 或 Python。这是您将在本指南中看到的方法。但是,您也可以利用与语言无关的 REST API 端点。客户端库使它变得更加简单。无论哪种情况,您都需要一个 API 密钥。
要获取 API 密钥,请在 Azure 门户中创建异常检测器资源实例。在 Azure 市场中搜索“异常检测器”。单击蓝色的“创建”按钮并填写以下表单。异常检测器唯一特定的项目是定价层。对于实验,免费 F0层就足够了,但对于生产应用程序,您需要使用标准层。它是付费的,但具有更高的配额和更好的 SLA。
单击资源中的密钥和端点链接,并记下其中一个 API 密钥以及 Web 服务的端点。
客户端库
使用客户端库与其他 Azure 认知服务产品类似。异常检测器客户端库位于Microsoft.Azure.CognitiveServices.AnomalyDetector NuGet 包中。这是针对 C# 项目的。对于 Python,有一个pip包,对于 node.js,有一个 npm 注册表中的包。
创建一个新的ApiKeyServiceClientCredentials并从 Azure 门户向其传递 API 密钥。
using Microsoft.Azure.CognitiveServices.AnomalyDetector;
// ...
var credentials = new ApiKeyServiceClientCredentials(API_KEY);
并使用凭证创建AnomalyDetectorClient。
var client = new AnomalyDetectorClient(credentials);
最后,将客户端的端点设置为来自 Azure 门户的 URL。
client.Endpoint = SERVICE_ENDPOINT;
直接使用 REST API 时,API 密钥将随请求在 HTTP 标头中发送。
数据集
异常检测器服务要求数据集采用特定格式。客户端库包含一个名为 Point 的类,该类表示单个数据点。Point类包含两个属性:Timestamp和浮点Value。(请注意不要意外导入System.Drawing命名空间,因为它也有一个名为相同的类。)同样,数据集点是时间序列数据。该服务接受长度在 12 到 8640 个数据点(含)之间的数据集。此处的示例从 JSON 文件中提取时间戳和值。
var points = new List<Point>();
foreach (var item in data) {
var p = new Point {
TimeStamp = new DateTime(item.year, item.month, item.year),
Value = item.temperature
};
points.Add(p);
}
Point类包含在发送到服务的请求中。Point和Request类都可以在Microsoft.Azure.CognitiveServices.AnomalyDetector.Models命名空间中找到。数据点中的时间戳应以固定的间隔出现,例如每天、每小时或每分钟,并且必须按升序排列。Request的Granularity属性是一个设置间隔的枚举。如果时间戳是其中一个间隔的倍数,则可以使用CustomInterval属性进行设置。如果时间戳与Granularity和/或CustomInterval属性不匹配,应用程序将引发异常。
var rq = new Request {
Series = points,
Granularity = Granularity.Daily,
CustomInterval = 2 // every other day
};
另一个经常使用的属性是 Sensitivity 。这是一个介于 0 到 99 之间的整数,指定服务将数据点归类为异常的严格程度。值越高,服务越宽松,而 Sensitivity越低,服务越严格。
rq.Sensitivity = 40;
重担
要使用库检测异常,请在客户端对象上调用两种方法之一。第一个EntireDetectAsync用于批量检测。该方法接受请求并返回EntireDetectResponse ,其中包含IsAnomaly属性中检测到的所有异常,该属性是bool值列表。列表中的每个元素对应于请求中的一个点。值为true表示预测为异常的点。
var entireResponse = await client.EntireDetectAsync(rq);
Console.WriteLine($"Azure found {entireResponse.IsAnomaly.Count(item => item == true)} anomaly/anomalies");
第二种方法是LastDetectAsync。它也接受请求,但返回LastDetectResponse对象。LastDetectAsync方法检查数据集中的最后一个数据点并预测它是否是异常。这用于流数据中的实时异常检测。响应对象有一个IsAnomaly属性,但这次它是一个单个bool值,并且再次为true表示预测异常。
var lastResponse = await client.LastDetectAsync(rq);
Console.WriteLine($"The most recent data point is {(lastResponse.IsAnomaly ? "" : "not ")}an anomaly");
给定非常简单的数据集:
List<int> data = new List<int>()
{
0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1
};
如您所见,值 0 的数量大于值 1。因此, 1 会被视为不合适。EntireDetectAsync方法的结果将检测到四到五个异常。此外,数据集末尾还有一个 1。LastDetectAsync方法会将最后一个数据点检测为异常。现实世界的数据集会复杂得多,但此示例使异常显而易见。
结论
Azure 认知服务异常检测器可预测数据集中的值是否为异常值或与其他数据点不同。它以 REST API 的形式实现,因此您无需了解有关异常检测的任何知识。无论您使用本指南中描述的客户端库还是 API 端点,您都能够批量或从流数据中检测异常。并且您可以调整算法的敏感度以允许适合您的应用程序的异常范围。当然,如何解释异常超出了服务范围。Azure 非常强大,但它无法读懂您的想法。
感谢阅读!
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~