Elasticsearch:Elastic Maps 现在支持机器学习异常层
2022年6月11日 | by mebius
现在可以在 Elastic Maps 中查看使用 geographical functions 的机器学习 (ML) 异常检测作业的结果。 Elastic Maps 8.1.0 版本可以按位置生成异常地图,帮助你探索数据中的新趋势。
Elastic Maps 在 Elastic Cloud 上可用。 你还可以下载 Elastic Stack 和我们的云编排产品 Elastic Cloud Enterprise (ECE) 和 Elastic Cloud for Kubernetes (ECK),以获得自我管理的体验。
在此示例中,我们将使用通用运输饲料规范 (GTFS) 数据。 GTFS 定义了公共交通时刻表和相关地理信息的通用格式。
在下面的展示中,我将使用 Elastic Stack 8.2 来进行展示。
Geographical functions
地理功能检测输入数据的地理位置异常。lat_long 函数检测输入数据的地理位置异常。
注意:你不能为包含地理函数的异常检测作业创建预测。 你也不能将带有条件的规则添加到使用地理函数的检测器中。
该函数支持以下属性:
-
field_name
(required) -
by_field_name
(optional) -
over_field_name
(optional) -
partition_field_name
(optional)
比如,我们在如下的例子中,使用 lat_long 函数来分析信用卡交易的异常tgcode:
PUT _ml/anomaly_detectors/example1
{
"analysis_config": {
"detectors": [{
"function" : "lat_long",
"field_name" : "transaction_coordinates",
"by_field_name" : "credit_card_number"
}]
},
"data_description": {
"time_field":"timestamp",
"time_format": "epoch_ms"
}
}
我们知道,在通常的情况下,你的信用卡不可能在一个很小的时间范围里,在美国和中国同时耍卡,除非飞机飞的真的很快很快。如果你在异常检测作业的检测器中使用此 lat_long 函数,它会检测到信用卡交易的地理位置对于特定客户的信用卡而言的异常。 异常可能表明存在欺诈。
重要:你提供的 field_name 必须是一个字符串,其中包含两个逗号分隔的数字,格式为纬度、经度、geo_point 字段、包含点值的 geo_shape 字段或 geo_centroid 聚合。 纬度和经度必须在 -180 到 180 的范围内,并且代表地球表面上的一个点。
比如,JSON 数据可能包含以下交易坐标:
{
"time": 1460464275,
"transaction_coordinates": "40.7,-74.0",
"credit_card_number": "1234123412341234"
}
在 Elasticsearch 中,位置数据很可能存储在 geo_point 字段中。 有关详细信息,请参阅 geo_point 数据类型。 机器学习功能原生支持此数据类型。 具体来说,当从 geo_point 字段中提取数据时,datafeed 将在发送到异常检测作业之前将数据转换为适当的纬度、经度字符串格式。
关于数据
接下来,我们使用的数据是从德克萨斯州圣安东尼奥市流式传输的大约 2 个月的 gtfs 实时数据的集合。 该数据仅包含车辆位置更新,每个公交车位置大约每 5 分钟更新一次。 每天下班时间(00:00-05:00 之间)数据很少。 每辆巴士都遵循确定性的日常模式。 对于某些公共汽车,这些模式遵循可能每天变化的确定性季节性。 该数据包含从 2019 年 4 月 24 日到 2019 年 6 月 13 日的 2,882,527 个独特事件。其中的一个文档格式是这样的:
{
"_index" : "gtfsbeat-8.0.0-2019",
"_id" : "v-Z8P3ABrx33ESnfjDtr",
"_score" : 1.0,
"_source" : {
"@timestamp" : "2019-05-25T01:48:20.000Z",
"trip" : {
"route_id" : "503",
"state" : "SCHEDULED",
"id" : "3611945"
},
"pos" : "29.635910,-98.495659",
"occupancy" : "EMPTY",
"congestion" : "UNKNOWN_CONGESTION_LEVEL",
"stop_status" : "IN_TRANSIT_TO",
"vehicle" : {
"id" : "4297",
"label" : "718"
}
}
VIA Metropolitan Transit 提供的数据。在上面,我需要注意的是有一个叫做 pos 的位tgcode置字段。这个是公交车的位置信息。另外一个字段 vehicle.id 是汽车的 id,用来标识每个公共汽车。
启动试用功能
由于机器学习是 Elastic 的白金版或者企业版功能,在我们的本地部署中,我们需要启动试用功能。
这样,我们的试用功能就启动起来了。
创建异常检测任务
要在 Kibana 中创建异常检测作业,请单击 Machine Learning> Anomaly Learning 页面上的 Create job,然后选择 Advanced job 向导。 或者,使用create anomaly detection jobs API.。
在 pos 字段(地理点字段)的异常检测作业中使用检测器中的 lat_long 函数,并将 by 字段设置为 vehicle.id。
这会检测到车辆(在本例中为公共汽车)的地理位置 (pos) 对于该特定公共汽车 (vehicle.id) 不寻常的异常情况。 异常可能表明存在问题或无法预料的延迟。
然后,你还应该选择 vehicle.id 作为此任务的的 influencers。 有关 influencers 的更多信息,请参阅文档。
创建任务并产生一些结果后,你可以导航到 Elastic Maps 以查看它们。
在 Elastic Maps 中按位置映射异常
导航到 Elastic Maps 并选择 Create Map,然后选择 Add Layer。 你应该看到现在可以选择的 ML Anomalies 层卡选项。
你现在可以从任务列表中进行选择 – 只有结果中包含地理位置数据的任务才会出现在此列表中。
选择任务后,请注意 – 在上面面的屏幕截图中 – 你可以在几个图层选项之间进行选择:“actual”、“typical” 和 “Actual to typical”。 默认情况下会显示 “actual” 图层。 该图层显示地图上关联实体的实际地理位置。
如下面屏幕截图中展开的图例所示,这些点根据异常的严重tgcode程度进行着色 – 这是由异常的记录分数(record score)决定的。 每个点的工具提示将提供有关异常的更多相关信息,包括典型位置和实际位置的坐标、记录分数以及拆分字段名称和值(如果有)。
在下面,你可以看到 “typical” 和 “typical to actual” 层的运行情况。
“Typical to actual” 层将通过分析建模找到的典型位置与实际位置连接起来,并用一条线突出这些位置之间的差异。
一次查看所有三个图层可能很有用,这样你就可以在 typical 位置旁边查看车辆的 actual 位置。 当你有大量数据要在地图上可视化时,这可能会有点让人不知所措。
你可能只对特定时间范围内的异常感兴趣 – 在上面的屏幕截图中,我们将时间范围限制在数据集的所有数据- 或具有高记录分数 – 表明它们特别异常。 在下面的屏幕截图中,所有图层都显示在地图中,我们可以过滤记录分数高于 95 的异常。
这样可以更仔细地查看在当天和时间离 typical 位置最远的公共汽车。
将鼠标悬停在其中一个点上,如下图所示,你可以在工具提示中看到特定巴士的车辆 ID – 在本例中为 4291。
你可以进一步缩小地图上的结果,仅查看该车辆 ID 的异常情况。
现在你可以清楚地看到这辆公共汽车的实际和预期位置,并可以从那里进一步调查。
链接到来自 Elastic Machine Learning 的地图
或者,你现在也可以从 Elastic Machine Learning 中的 Anomaly Explorer 视图直接导航到 Elastic Maps。 当你在 ML 应用程序中查看作业结果并希望直接跳转到已为你创建的相关任务和过滤器的地图时,这很有用。
在下面的屏幕截图中,车辆 ID 4291 的泳道单元已被选中 – 你现在可以选择嵌入地图上方的“在地图中打开” 链接。
这将带你直接进入 Elastic Maps,其中已经为该特定车辆 ID 设置了过滤器。