本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
RANDOM_CUT_FOREST_WITH_EXPLANATION
计算异常分数并针对数据流中的每条记录解释此分数。记录的异常分数指示它与最近针对流观察到的趋势有多大的不同。该函数还根据记录中每一列的数据的异常程度,返回对应列的归因分数。对于每条记录,所有列的归因分数总和等于异常分数。
您还可以选择获取有关给定列为异常的方向的信息(相对于对流中给定列最近观察到的数据趋势,该分数是高还是低)。
例如,在电子商务应用中,您可能想知道最近观察到的交易模式何时发生变化。您可能还想知道有多少变化是由于每小时购买次数的变化造成的,有多少是由于每小时放弃的购物车数量的变化造成的,这些信息由归因分数表示。您可能还需要查看方向性,以了解是否会由于上述每个值的增加或减少而收到有关更改的通知。
注意
该RANDOM_CUT_FOREST_WITH_EXPLANATION
函数检测异常的能力取决于应用程序。 提出您的业务问题以使其能够通过此功能得到解决需要领域的专业知识。例如,您可能需要确定输入流中的哪些列组合传递给此函数,并且您可能因对数据规范化而受益。有关更多信息,请参阅输入流:
流记录可以包含非数字列,但该函数仅使用数字列来分配异常分数。一条记录可以有一个或多个数字列。算法使用所有数值数据来计算异常分数。
当您启动应用程序时,该算法开始使用流中的当前记录开发机器学习模型。该算法不使用流中较旧的记录进行机器学习,也不使用来自应用程序的之前执行的统计数据。
该算法接受DOUBLE
INTEGER
、FLOAT
、TINYINT
、SMALLINT
、REAL
、和BIGINT
数据类型。
注意
DECIMAL
不是受支持的类型。请改用 DOUBLE
。
以下是在二维空间中使用不同归因分数进行异常检测的简单视觉示例。 该图显示了一组蓝色数据点和显示为红点的四个异常值。 红点具有相似的异常分数,但由于不同的原因,这四个点是异常的。对于点 A1 和 A2,异常在极大程度上归因于它们的离心 y 值。对于 A3 和 A4,您可以在极大程度上将异常归因于它们的离心 x 值。方向性为:A1 的 y 值为 LOW(低),A2 的 y 值为 HIGH(高),A3 的 x 值为 HIGH(高),A4 的 x 值为 LOW(低)。
语法
RANDOM_CUT_FOREST_WITH_EXPLANATION (inputStream, numberOfTrees, subSampleSize, timeDecay, shingleSize, withDirectionality )
参数
以下部分介绍 RANDOM_CUT_FOREST_WITH_EXPLANATION
函数的参数。
输入流
指向您的输入流的指针。您可以使用CURSOR
函数设置指针。例如,以下语句将设置指向 InputStream
的指针。
CURSOR(SELECT STREAM * FROM InputStream) CURSOR(SELECT STREAM IntegerColumnX, IntegerColumnY FROM InputStream) -– Perhaps normalize the column X value. CURSOR(SELECT STREAM IntegerColumnX / 100, IntegerColumnY FROM InputStream) –- Combine columns before passing to the function. CURSOR(SELECT STREAM IntegerColumnX - IntegerColumnY FROM InputStream)
该CURSOR
函数是该RANDOM_CUT_FOREST_WITH_EXPLANATION
函数的唯一必需参数。此函数假设其他参数使用默认值:
numberOfTrees
= 100
subSampleSize
= 256
timeDecay
= 100,000
shingleSize
= 1
withDirectionality
= FALSE
使用此函数时,输入流最多可以有 30 个数值列。
numberOfTrees
使用此参数,您可以指定森林中随机砍伐的树木的数量。
注意
默认情况下,该算法构造了许多树,每棵树都是使用输入流中给定数量的样本记录(参见本列表subSampleSize
后面的内容)构造的。该算法使用每棵树来分配异常分数。所有这些分数的平均值是最终的异常分数。
的默认值numberOfTrees
为 100。您可以将此值设置在 1 到 1,000(含)之间。通过增加森林中树的数量,您可以获得异常分数和归因分数的更准确估算,但这也会延长运行时间。
subSampleSize
使用此参数,您可以指定在构造每棵树时希望算法使用的随机样本的大小。森林中每棵树都是使用记录的一个(不同的)随机样本构建的。该算法使用每棵树来分配异常分数。当样本达到 subSampleSize
条记录时,会随机删除记录,较旧记录的删除概率高于较新记录。
的默认值subSampleSize
为 256。您可以将此值设置为介于 10 和 1,000 之间(含 10 和 1,000)。
subSampleSize
必须小于 timeDecay
参数(默认情况下设置为 100,000)。增大样本大小将为每棵树提供更大的数据视图,但它也会延长运行时间。
注意
在训练机器学习模型时,算法为首批 subSampleSize
个记录返回零。
时间衰变
您可以使用timeDecay
参数指定在计算异常分数时要考虑最近的过去的多少。 数据流会随着时间的推移而自然演变。例如,电子商务网站的收入可能会持续增加,或者全球温度可能会随着时间的推移而升高。 在这种情况下,您希望将异常标记为相对于最近的数据,而不是与遥远的过去的数据相关的异常。
默认值为 100,000 条记录(如果使用分组,则为 100,000 条带状物,如下一节所述)。 您可以在 1 和最大整数(即 2147483647)之间设置此值。该算法以指数方式降低了旧数据的重要性。
如果您选择timeDecay
默认值 100,000,则异常检测算法会执行以下操作:
-
在计算中仅使用最近的 100,000 条记录(并忽略较早的记录)。
-
在最近的 100,000 条记录中,为最近的记录分配的权重呈指数级增加,而在异常检测计算中为较早的记录分配的权重则更少。
该timeDecay
参数确定在异常检测算法的工作集合中保留的最近记录的最大数量。 如果数据变化很快,则需要较小的timeDecay
值。 最佳timeDecay
价值取决于应用程序。
石斑尺寸
此处给出的说明适用于一维流(即,只有一个数值列的流),但瓦形也可用于多维流。
瓦片是最新记录的连续序列。例如,在时间 tshingleSize
处为 10 的 a 对应于在时间 t 之前收到的最近 10 条记录的向量。 该算法将此序列视为最后记录shingleSize
数的向量。
如果数据在时间内均匀到达,则时间 t 处大小为 10 的方块对应于在时间 t-9、t-8、...、t 处收到的数据。 在时间 t+1 时,方块滑过一个单位,由时间 t-8、t-7、...、t、t+1 的数据组成。 随着时间的推移收集的这些堆叠记录对应于运行异常检测算法的 10 维向量的集合。
直觉是,瓦片捕捉了最近过去的形状。 您的数据可能具有典型形状。 例如,如果您的数据是每小时收集一次的,那么大小为 24 的方块可能会捕捉数据的每日节奏。
默认 shingleSize
是一个记录(因为瓦形大小取决于数据)。您可以将此值设置在 1 到 30(含)之间。
请注意有关设置的以下内容shingleSize
:
-
如果将
shingleSize
设置得过小,算法更容易受数据的细微波动的影响,从而导致并非异常的记录获得高异常分数。 -
如果设置
shingleSize
得太大,则检测异常记录可能需要更长时间,因为堆叠中存在更多非异常记录。 还可能需要更多时间才能确定异常已经结束。 -
确定正确的瓦片尺寸取决于应用。 用不同的瓦片大小进行实验以确定效果。
withDirectionality
默认为 false
的布尔参数。设置为 true
时,它会告诉您每个维度对异常分数的贡献方向。它还提供了针对该方向性的推荐强度。
结果
该函数返回 0 或更高的异常分数,并返回 JSON 格式的解释。
当算法进入学习阶段时,流中所有记录的异常分数从 0 开始。然后,您开始看到异常分数的正值。并非所有正的异常分数都是重要的;只有最高的分数才是重要的。为了更好地理解结果,请查看解释。
该解释为记录中的每个列提供了以下值:
-
归因分数:指示此列对记录的异常分数的贡献程度的非负数。换句话说,它表示此列的值与基于最近观察到的趋势的预期值有多大的不同。记录的所有列的归因分数总和等于异常分数。
-
强度:表示方向推荐强度的非负数。强度值高,表示对函数返回的方向性具有高的置信度。在学习阶段,强度为 0。
-
方向性:如果列的值高于最近观察到的趋势,则为 HIGH(高);如果低于趋势,则为 LOW(低)。在学习阶段,此值默认为 LOW(低)。
注意
在 Kinesis Data Analytics 服务进行服务维护时,机器学习函数用来确定分析分数的趋势很少会被重置。发生服务维护后,您可能意外地看到分析分数为 0。我们建议您设置筛选条件或其他机制,以便在这些值出现时适当地处理它们。
示例
股票代码数据示例
此示例基于样本股票数据集,该数据集是 Amazon Kinesis Analytics 开发人员指南中入门练习的一部分。要运行该示例,您需要一个包含样本股票行情输入流的 Kinesis Data Analytics 应用程序。要了解如何创建 Kinesis Data Analytics 应用程序和配置示例股票行情输入流,请参阅 Amazon Kinesis Analytics 开发者指南中的入门指南。
示例股票数据集具有以下架构:
(ticker_symbol VARCHAR(4), sector VARCHAR(16), change REAL, price REAL)
在此示例中,应用程序为记录计算异常分数,并为 PRICE
和 CHANGE
列计算归因分数,这些是输入流中仅有的数值列。
CREATE OR REPLACE STREAM "DESTINATION_SQL_STREAM" (anomaly REAL, ANOMALY_EXPLANATION VARCHAR(20480)); CREATE OR REPLACE PUMP "STREAM_PUMP" AS INSERT INTO "DESTINATION_SQL_STREAM" SELECT "ANOMALY_SCORE", "ANOMALY_EXPLANATION" FROM TABLE (RANDOM_CUT_FOREST_WITH_EXPLANATION(CURSOR(SELECT STREAM * FROM "SOURCE_SQL_STREAM_001"), 100, 256, 100000, 1, true)) WHERE ANOMALY_SCORE > 0
上一示例输出的流与以下内容类似。
网络和 CPU 利用率示例
本理论示例显示了两组遵循振荡模式的数据。在下图中,它们由顶部的红色曲线和蓝色曲线表示。红色曲线显示随时间推移的网络利用率,蓝色曲线显示同一计算机系统随时间推移的闲置 CPU。这两个彼此有相位差的信号在大多数时间是有规律的。但它们都显示偶尔的异常,这些异常在图表中显示为不规则。下面解释图形中的曲线所表示的内容(按从顶部曲线到底部曲线的顺序)。
顶部曲线为红色,表示随时间推移的网络利用率。它遵循循环模式,大部分时间是有规律的,除了两个异常期间(每个期间都表示利用率下降)之外。第一个异常期间发生在时间值 500 到 1,000 之间。第二个异常期间发生在时间值 1,500 到 2,000 之间。
顶部的第二条曲线(蓝色)是随着时间推移的空闲 CPU。它遵循循环模式,大部分时间是有规律的,除了两个异常期间之外。第一个异常期间发生在时间值 1,000 到 1,500 之间,并显示空闲 CPU 时间下降。第二个异常期间发生在时间值 1,500到 2,000 之间,并显示空闲 CPU 时间增加。
顶部的第三条曲线显示异常分数。在开始时,有一个学习阶段,此时异常分数为 0。在学习阶段之后,曲线上有稳定的噪声,但异常很突出。
第一个异常在黑色异常分数曲线上以红色标记,它更多地归因于网络利用率数据。第二个异常标记为蓝色,它更多地归因于 CPU 数据。此图中提供红色和蓝色标记以更好地显示效果。它们不是由
RANDOM_CUT_FOREST_WITH_EXPLANATION
函数生成的。以下是获得这些红色和蓝色标记的方法:运行函数后,我们选择了前 20 个异常分数值。
从这个前 20 个异常分数值的集合中,我们选择其网络利用率归因大于或等于 CPU 归因的 1.5 倍的那些值。我们在图中使用红色标记来给此新值集中的点着色。
-
我们使用蓝色标记对其 CPU 归因分数大于或等于网络利用率归因分数的 1.5 倍的点进行着色。
底部的第二条曲线是网络利用率信号方向性的图形表示。我们通过以下方法获得此曲线:运行此函数,将强度乘以 -1 以表示 LOW(低)方向性,乘以 +1 以表示 HIGH(高)方向性,并根据时间绘制结果。
当网络利用率的周期性模式下降时,方向性会出现相应的负峰值。当网络利用率显示回升到常规模式时,方向性显示与该升高幅度相对应的正峰值。后来,出现了另一个负峰值,紧接着是另一个正峰值。它们共同表示网络利用率曲线中出现的第二个异常。
底部曲线是 CPU 信号方向性的图形表示。我们通过以下方法获得此曲线:将强度乘以 -1 以表示 LOW(低)方向性,乘以 +1 以表示 HIGH(高)方向性,并根据时间绘制结果。
对于空闲 CPU 曲线中的第一个异常,此方向性曲线会显示一个负峰值,随后立即出现一个较小的正峰值。空闲 CPU 曲线中的第二个异常产生正峰值,然后产生一个方向性负峰值。
血压示例
有关更详细的示例以及检测和解释血压读数异常的代码,请参阅示例:检测数据异常并获取解释。