本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
RANDOM_CUT_FOREST
检测数据流中的异常。 如果某个记录与其他记录相距较远,则表明该记录是异常的。 要检测各个记录列中的异常情况,请参阅RANDOM_CUT_FOREST_WITH_EXPLANATION。
注意
该RANDOM_CUT_FOREST
函数检测异常的能力取决于应用程序。 要解决您的业务问题以便使用此功能来解决,需要领域的专业知识。例如,确定要将输入流中的哪个列组合传递给函数并可能对数据进行标准化。有关更多信息,请参阅输入流:
流记录可以包含非数字列,但该函数仅使用数字列来分配异常分数。一条记录可以有一个或多个数字列。该算法使用所有数字数据来计算异常分数。 如果一个记录有 n 个数字列,底层算法将假定每个记录都是 n 维空间中的一个点。n 维空间中与其他点相距较远的点将获得较高的异常分数。
当您启动应用程序时,该算法开始使用流中的当前记录开发机器学习模型。该算法不使用流中较旧的记录进行机器学习,也不使用来自应用程序的之前执行的统计数据。
该算法接受DOUBLE
INTEGER
、FLOAT
、TINYINT
、SMALLINT
、REAL
、和BIGINT
数据类型。
注意
不支持十进制类型。改用 DOUBLE。
以下是异常检测的示例。 该图显示了三个集群和随机插入的一些异常。 红色方块显示根据RANDOM_CUT_FOREST
函数获得最高异常分数的记录。 蓝钻代表剩余的记录。 请注意分数最高的记录如何倾向于位于集群外面。
step-by-step 有关带有说明的示例应用程序,请参阅检测异常。
语法
RANDOM_CUT_FOREST (inputStream, numberOfTrees, subSampleSize, timeDecay, shingleSize)
参数
以下章节介绍参数。
输入流
指向您的输入流的指针。您可以使用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
函数的唯一必需参数。该函数假设对其他参数使用默认值:
numberOfTrees = 100
subSampleSize = 256
时间衰退 = 100,000
SingleSize = 1
使用此函数时,您的输入流最多可以有 30 个数字列。
numberOfTrees
使用此参数,您可以指定森林中随机砍伐的树木的数量。
注意
默认情况下,该算法构造了许多树,每棵树都是使用输入流中给定数量的样本记录(参见本列表subSampleSize
后面的内容)构造的。该算法使用每棵树来分配异常分数。所有这些分数的平均值是最终的异常分数。
的默认值numberOfTrees
为 100。您可以将此值设置在 1 到 1,000(含)之间。通过增加森林中的树木数量,你可以更好地估计异常分数,但这也会增加运行时间。
subSampleSize
使用此参数,您可以指定在构造每棵树时希望算法使用的随机样本的大小。 森林中每棵树都是使用记录的一个(不同的)随机样本构建的。 该算法使用每棵树来分配异常分数。当样本达到 subSampleSize
条记录时,会随机删除记录,较旧记录的删除概率高于较新记录。
的默认值subSampleSize
为 256。 您可以将此值设置为介于 10 和 1,000 之间(含 10 和 1,000)。
请注意,subSampleSize
必须小于timeDecay
参数(默认情况下设置为 100,000)。 增大样本大小将为每棵树提供更大的数据视图,但也会延长运行时间。
注意
在训练机器学习模型时,算法为首批 subSampleSize
个记录返回零。
时间衰变
该timeDecay
参数允许您指定在计算异常分数时要考虑最近的过去的多少。 这是因为数据流会随着时间的推移而自然演变。例如,电子eCommerce 网站的收入可能会持续增加,或者全球温度可能会随着时间的推移而升高。 在这些情况下,我们希望对照较早的数据对最近的数据中的异常进行标记。
默认值为 100,000 条记录(如果使用分组,则为 100,000 条带状物,如下节所述)。 您可以在 1 和最大整数(即 2147483647)之间设置此值。该算法以指数方式降低了旧数据的重要性。
如果您选择timeDecay
默认值 100,000,则异常检测算法会执行以下操作:
-
在计算中仅使用最近的 100,000 条记录(并忽略较早的记录)。
-
在最近的 100,000 条记录中,为最近的记录分配的权重呈指数级增加,而在异常检测计算中为较早的记录分配的权重则更少。
如果不想使用默认值,则可以计算要在算法中使用的记录数。为此,请将每天的预期记录数乘以您希望算法考虑的天数。例如,如果您预计每天有 1,000 条记录,并且您希望分析 7 天的记录,请将此参数设置为 7,000 (1,000 * 7)。
该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
得太大,则检测异常记录可能需要更长时间,因为堆叠中会有更多非异常记录。 确定异常情况已结束也可能需要更长时间。 -
确定正确的瓦片尺寸取决于应用。 请试验不同的瓦形大小以确定影响。
以下示例说明了在监控异常分数最高的记录时如何catch 异常。在这个特殊的例子中,两个最高的异常分数也表示人为注入的异常的开始和结束。
考虑一下这种以正弦波表示的风格化的一维流,旨在捕捉生理节奏。 此曲线显示了某个电子商务网站每小时收到的订单的典型数量、已登录服务器的用户的数量、每小时收到的广告点击量等。 图的中部人为插入了 20 个连续记录的急剧下降。
我们使用四条记录的大小来运行该RANDOM_CUT_FOREST
函数。结果如下所示。 红线显示异常分数。 请注意,异常的开头和结尾获得高分数。
当您使用此函数时,我们建议您将最高分作为潜在异常进行调查。
注意
在 Kinesis Data Analytics 服务进行服务维护时,机器学习函数用来确定分析分数的趋势很少会被重置。发生服务维护后,您可能意外地看到分析分数为 0。我们建议您设置筛选条件或其他机制,以便在这些值出现时适当地处理它们。
有关更多信息,请参阅 Journal of Machine Learning Research 网站上的针对随机砍伐的森林在流上进行可靠的异常情况检测