APPLY_IFOREST
将隔离森林 (iForest) 模型应用于输入关系。对于每个输入行,该函数返回包含两个字段的输出行:
anomaly_score
:浮点值,表示模型中所有树的平均路径长度,按训练样本大小标准化。is_anomaly
:布尔值,指示输入行是否异常。当anomaly_score
等于或大于给定阈值时,此值为 true;否则,此值为 false。
语法
APPLY_IFOREST( input‑columns USING PARAMETERS param=value[,...] )
参数
- input‑columns
- 输入关系中要使用的列的逗号分隔列表,或者使用星号 (*) 选择所有列。 列类型必须与
model_name
中的预测变量类型匹配。
参数
model_name
模型的名称(不区分大小写)。
threshold
- 可选。(0.0, 1.0) 范围内的浮点数,指定确定数据点是否为异常的阈值。如果一个数据点的
anomaly_score
等于或大于threshold
的值,则该数据点被标记为异常值。或者,您可以指定一个
contamination
值,该值设置一个阈值,其中标记为异常值的训练数据点的百分比约等于contamination
的值。您不能在同一个函数调用中同时设置contamination
和threshold
。默认值: 0.7
match_by_pos
- 可选。指定输入列如何与模型列匹配的布尔值:
-
false
:按名称匹配。 -
true
:按输入列列表中列的位置匹配。
默认值:false
-
contamination
- 可选。(0.0, 1.0) 范围内的浮点数,训练数据中被标记为异常值的数据点的近似比率。该函数根据此
contamination
值计算阈值。如果不设置此参数,该函数将使用指定或默认的threshold
值标记异常值。您不能在同一个函数调用中同时设置
contamination
和threshold
。
特权
非超级用户:
-
模型上的 USAGE 权限
-
对输入关系的 SELECT 权限
示例
以下示例演示了不同的 threshold
值如何影响对输入关系的异常值检测:
=> SELECT * FROM (SELECT first_name, last_name, APPLY_IFOREST(team, hr, hits, avg, salary USING PARAMETERS model_name='baseball_anomalies',
threshold=0.75) AS predictions FROM baseball) AS outliers WHERE predictions.is_anomaly IS true;
first_name | last_name | predictions
------------+-----------+-------------------------------------------------------
Jacqueline | Richards | {"anomaly_score":0.777757463074347,"is_anomaly":true}
(1 row)
=> SELECT * FROM (SELECT first_name, last_name, APPLY_IFOREST(team, hr, hits, avg, salary USING PARAMETERS model_name='baseball_anomalies',
threshold=0.55) AS predictions FROM baseball) AS outliers WHERE predictions.is_anomaly IS true;
first_name | last_name | predictions
------------+-----------+--------------------------------------------------------
Jacqueline | Richards | {"anomaly_score":0.777757463074347,"is_anomaly":true}
Debra | Hall | {"anomaly_score":0.5714649698133808,"is_anomaly":true}
Gerald | Fuller | {"anomaly_score":0.5980549926114661,"is_anomaly":true}
(3 rows)
您还可以使用不同的 contamination
值来更改异常值阈值:
=> SELECT * FROM (SELECT first_name, last_name, APPLY_IFOREST(team, hr, hits, avg, salary USING PARAMETERS model_name='baseball_anomalies',
contamination = 0.1) AS predictions FROM baseball) AS outliers WHERE predictions.is_anomaly IS true;
first_name | last_name | predictions
------------+-----------+--------------------------------------------------------
Marie | Fields | {"anomaly_score":0.5307715717521868,"is_anomaly":true}
Jacqueline | Richards | {"anomaly_score":0.777757463074347,"is_anomaly":true}
Debra | Hall | {"anomaly_score":0.5714649698133808,"is_anomaly":true}
Gerald | Fuller | {"anomaly_score":0.5980549926114661,"is_anomaly":true}
(4 rows)
=> SELECT * FROM (SELECT first_name, last_name, APPLY_IFOREST(team, hr, hits, avg, salary USING PARAMETERS model_name='baseball_anomalies',
contamination = 0.01) AS predictions FROM baseball) AS outliers WHERE predictions.is_anomaly IS true;
first_name | last_name | predictions
------------+-----------+--------------------------------------------------------
Jacqueline | Richards | {"anomaly_score":0.777757463074347,"is_anomaly":true}
Debra | Hall | {"anomaly_score":0.5714649698133808,"is_anomaly":true}
Gerald | Fuller | {"anomaly_score":0.5980549926114661,"is_anomaly":true}
(3 rows)