Elastic:如何使用 Elastic 机器学习来侦测异常(一)

2021年12月14日   |   by mebius

在今天的文章中,我将讲述时序系列的异常侦测分析。我将讲述:

  • 针对 IT,机器学习到底意味着什么?
  • 为什么我们需要机器学习?
  • 在 Elastic Stack 中,机器学习已经完全内置,非常易于使用
  • 能够正确诠释 Elastic 的机器学习的结果对发挥它的重要性至关重要

更多关于机器学习的文章,请参阅 “Elastic:机器学习的原理及实践 – single metric jtgcodeob”。

针对 IT,机器学习到底意味着什么?

针对 IT 来说,有许许多多的话题及使用案例:

%title插图%num

但是针对 Elastic 所提供的机器学习来说,Elastic 专注于如下的两个方面的内容:

%title插图%num

  1. 针对 Time-series(时序) 数据的分析。它包括异常侦测及预测。这也就是我们常说的非监督机器学习。在这种模式下,用户不用训练机器学习什么是异常,期望得到的是什么,什么是对的,什么是错误的。Elastic ML 通过对数据的观察进行学习。
  2. Data frame analytics。tgcode这是一种监督的途径。Classification 及 Regression 被用来解决非常复杂的问题。在这种方式下,Elastic ML 需要一定的数据来进行训练,然后我们可以运用训练的模型来对未来的数据进行分类或预测。

为什么我们需要机器学习?

为什么需要机器学习呢?这其中主要的原因是因为我们人类的分析能力有限。我们的时间非常有限,精力有限,但是我们往往要面对非常庞大的数据,而其中可能超过70%及以上的数据并不是有用的数据。如果我们使用人力来手动进行分析,这将是天量的工作。在这种情况下,我们可以使用机器自动化来帮助我们针对海量的数据来进行分析。

Time Series Analysis

异常 – 什么是异常?

我们首先看看如下的一个时序数据:

%title插图%num

从上面的数据中,我们可以使用肉眼来看看什么是异常。显然上面的这个数据和它的历史数据有着显著的不同。这个很容易看出来。我们再看看下面的这个数据:

%title插图%num

最上面的那组数据和自己的历史数据比较而言没有多大的区别,但是它和其它的 entity 来比较一下,我们看出来它非常地突出。它比其它的数据高出很多。

我们再看一下如下的一个图:

%title插图%num

我们可以使用肉眼看出来上面图中的海豹和其它的企鹅是那么的地格格不入。那么地耀眼 :)

那么异常(anomalourness)到底是什么呢?我们用简单的话可以这么来描述:

  • 一个实体的行为发生突然的或剧烈的变化

%title插图%num

  • 一个实体在一个群体里和其它的实体完全不一样

%title插图%num

依据上面的定义,我们再回到之前的一个图,我们可以重新认识之前的数据:

%title插图%num

在上面的图中,最上面的 entity 明显表现和其它的 entity 是不同的。这个显然是异常,而对于中间部分的那个黄色部分的数据,我们可以称它们为有写异常。在下面的数据,我们可以称它们为正常。

我们再看看如下的数据:

%title插图%num

这是一个时序的数据。我们使用肉眼也可以看出来,在中间的部分出现一个异常,而在两边的数据则表现正常。这种异常是和它的历史数据进行比较得出来的。

显然如果我们在现实的数据是这么容易判断就好了。在上面,我们很容易想到一个问题:判断一个异常的标准是什么?比较一个阈值吗?这个阈值是多大?我们数据的变化的 pattern 是什么?我们需要精确的阈值吗?当数据异常时,有多异常?更多的时候,我们面临的是海量的数据。这个给数据科学家来说,带来很多的挑战。幸运的是,Elastic ML 的解决方案给我提供了方便。它会按照数据的变化学习数据的 pattern,并自动计算出数据的合理范围。如果超出这个范围,数据就会被视为异常。

%title插图%num

更重要的是,Elastic ML 可以和 Alerting 结合在一起。当异常发生时,按照我们的需求来发送通知信息。这样我们不会漏掉一些关键的事件。

截止目前位置,Elastic ML 已经深深地集成到 Kibana 的各个应用之中了:

%title插图%num

我们可以非常方便地启动机器学习对各个应用中的数据进行分析。Elastic 已经为各中应用场景预置了任务。我们需要做的就是在应用中启动它们。

动手实践

安装 Elastic Stack

我们首先需要安装 Elasticsearch 及 Kibana。当然最容易的方法是启动 Elastic Cloud。你只需要花几分钟的实践就可以启动一个 Elasticsearch 的集群。你可以有14天的试用期,而不用提供任何的信用卡之类的付费信息。对于国内的开发者来说,你可以在阿里巴巴及腾讯云上启动 Elasticsearch 集群,并试用。具体文章可以参阅:

如果你想自己部署 Elasticsearch,请参阅我之前的文章:

对于喜欢 docker 部署的开发者来说,请参阅我的文章

启动白金试用

Elastic 机器学习是一个白金版的功能。如果你想了解更多关于定义的信息,请参阅订阅。你需要付费才可以进行使用。针对没有付费的用户来说,我们可以在自己搭建的集群里启动30天的试用。具体的步骤如下:

%title插图%num

%title插图%num

%title插图%num

%title插图%num

这样,我们就启动了白金版的试用。

加载 Sample data

在实际的使用中,我们会使用 Beats,Logstash 或 client APIs 的方法把数据写入 Elasticsearch。在今天的练习中,我将使用 Kibana 中自带的数据来进行展示。打开 Kibana:

%title插图%num

%title插图%num

%title插图%num

这样我们在 Elasticsearch 中创建了一个叫做kibana_sample_data_logs 索引。这个索引是一个网络服务器访问的数据集。我们将使用这个数据集来对它进行分析。我们可以打开它的 dashboard 开查看数据的可视化图:

%title插图%num

%title插图%num

Dashboard 这个可视化图给我们提供了许多有益的 insight,但是我们只用肉眼我们很难看出来哪里是出现异常,比如:在什么时候它的访问超出平常很多,在什么时候访问量突然减少,在什么时候网络服务器访问错误出现许多?那个国家访问的数据比其它国家要突出很多。那些地区下载文件比较多?这些对于 IT 运维人员来说,是非常重要的信息。在实际的数据集中,这种数据可能是海量的。使用 Dashboard 人工分析这些数据几乎是不可能的。对于运维人员来说,我们也许只对那些异常的事件感兴趣,比如什么时候出现大量的访问错误,原因是什么?哪些访问数据是黑客攻击造成服务器瘫痪,这些攻击来自哪里?

创建机器学习任务

我们接下来创建机器学习任务来自动化这个异常检测的流程。当然在创建机器学习任务之前,我们心中必须要有一个需要检测的 KPI,比如,我们想知道访问量的异常,我们也可能想知道下载数据的异常,或者出现 404 错误的异常。

下面,我们来通过 Kibana 来手动创建机器学习的任务:

%title插图%num

%title插图%num

%title插图%num%title插图%num

由于我们使用的是 Sample data,在摄入数据时,系统也自动帮我们创建了一个异常检测的任务。在实际的使用中,我们的索引应该没有这个。在我们接下来的练习中,我们选择 Single metric,也就是针对一个指标来进行检测。如果你有多个指标同时需要检测,你可以选择 Multi-metric。当然我们可以使用 Adanced 选项来创建在上面显示的任何一个类型的机器学习。我们甚至可以使用 API 的方法来创建机器学习任务。在本练习中,我们就简单地使用 Single metric,因为这个是目前最为简单的操作流程:

%title插图%num

%title插图%num

针对我们的练习,我们选择 Count(Event rate):

%title插图%num

%title插图%num

%title插图%num%title插图%num

当我们点击上面的 Create job 后,Elastic ML 开始让 Elasticsearch 按照时序来播放这些数据,并对数据进行分析学习建立模型,另外一方面它同时对后面的数据进行评估。

%title插图%num

%title插图%num

等任务完成后,它也会把数据保存于一个系统索引 .ml-anomalies-shared中,以方便查询。点击上面的 View results:

%title插图%num

%title插图%num

如果我们的数据超出上面的阴影部分,将被视为异常。点击上面的红点,我们可以看出来 anomaly score 为98。通常这个 score 是介于 0-100 之间的。数值越大则表示数据越异常。因为我们选择的是Count(Event rate),那么意味着它含有 upper bounds 及 lower bounds。也就是说它会同时侦测超过一定的阈值和低于一定的阈值都会被视为异常。用大白话就是,访问量超过一定的值会被视为异常,如果访问量低于一个正常的范围,也会被视为异常。

点击上面的 January 15th 2022:

%title插图%num

我们tgcode可以看到这个异常的详细信息:在通常的情况下访问量应该在 7.07,但是它的实际访问量在 63,这是一个远超过正常范围的访问量。在机器学习的算法中,这种事件出现的可能性为 1.72e-8,也就是非常不可能。这个非常小的概率值对很多人来说非常不容易理解。机器学习通过归一化,把它转换为一个我们非常通俗易懂的异常分数 anomaly score。这个事件的异常值为 98。在满分为100的情况下,这个值非常高。

我们也可以看一下另外一个 multi-bucket 异常,就是上面的那个黄色的异常:

%title插图%num

虽然上面的数据没有超阴影的限定范围,但是数据跨几个 bucket span 显示为异常。这种异常被称之为 multi-bucket 异常。它的标识为 + 符号,而不是之前的红色的 o

从上面的展示中,我们可以看出来创建一个机器学习的任务非常之简单。这也是最简单的机器学习任务。希望大家学到东西!

文章来源于互联网:Elastic:如何使用 Elastic 机器学习来侦测异常(一)

相关推荐: Elasticsearch:从 Spring Boot 应用中连接 Elasticsearch

在之前的文章 “Elasticsearch:通过 Spring Boot 创建 REST APIs 来访问 Elasticsearch”,我详细描述了如何在 Spring Boot 应用中使用elasticsearch-rest-high-level-clie…

Tags: , , ,