H2O 隔离林 -- 分数大于 1

H2O isolation forest -- scores greater than 1

H2O 中的隔离森林(3.30.0.1,R 3.6.1)在将模型应用于测试集时计算出的分数大于 1。这是重现大于 1 的分数的代码。看起来 h2o 没有使用原始论文 [https://cs.nju.edu.cn/zhouzh/zhouzh.files/publication/icdm08b.pdf?q 中使用的归一化=isolation-forest] 即 score=2^(-mean length/c(n)),当 n>0 时 c(n) 始终为正,因此分数应始终小于 1.

隔离林的其他实现对同一数据集产生的分数小于 1。

下载 train and test 个数据文件。

library(data.table)
library(h2o)
h2o.init()
#import data
train<-h2o.importFile('train.csv')
test<-h2o.importFile('test.csv')
#Train model
model <- h2o.isolationForest(training_frame = train)
# Calculate score
scores <- h2o.predict(model,test)
max(scores[,1])

如果您的问题是为什么测试集中某些行的预测值大于 1,那么这是因为测试值较短 mean_lengths。 IE。与训练数据相比,隔离它们所需的分割少于平均水平。请记住,隔离林使用的是一组树(不仅仅是一棵)。所以如果你有比训练更独特的记录(异常),那么你的预测值可以大于 1(或者 mean_length 比正常值短)。

您可以通过查看测试数据中 predict 大于 1 的行来了解这一点:

scores[scores[,1] > 1, ]

   predict mean_length
1 1.232558        3.82
2 1.023256        4.36
3 1.069767        4.24
4 1.286822        3.68

此外,您还可以看到您的训练数据的所有行的 mean_length 平均值为 4.42(大于测试数据 mean_lengths 以上)

scores_train <- h2o.predict(model,train) mean(scores_train[,'mean_length'])

4.42

查看 this post 了解更多关于解释隔离森林的信息。

Neema 指出 h2o 使用 min/max 路径长度进行归一化,这使得分数可能大于 1。

[https://support.h2o.ai/support/tickets/97280]