Изоляционный лес H2O - более 1 балла - PullRequest
0 голосов
/ 17 июня 2020

Лес изоляции в 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 ^ (- средняя длина / c (n)), c (n) всегда положительно для n> 0, поэтому оценки всегда должны быть меньше 1.

Другие реализации изолированного леса дают оценки меньше 1 для того же набора данных.

Скачать файлы train и test data.

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])

Ответы [ 2 ]

0 голосов
/ 24 июня 2020

Нима указала, что h2o использует минимальную / максимальную длину пути для нормализации, что позволяет получить оценки больше 1.

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

0 голосов
/ 19 июня 2020

Если ваш вопрос заключается в том, почему прогнозируемое значение больше 1 для некоторых строк в тестовом наборе, то это связано с тем, что тестовые значения имеют более короткие mean_lengths. Т.е. для их изолирования по сравнению с данными обучения требуется меньше разбиений, чем среднее. Помните, что в изолированном лесу используется ансамбль деревьев (а не одно). Поэтому, если у вас есть записи, более уникальные, чем обучение (аномалии), тогда ваше прогнозируемое значение может быть больше 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

Кроме того, вы можете видеть, что ваши данные обучения имели среднее значение средней_длины для всех строк, равное 4,42 (что больше, чем из ваших тестовых данных, mean_lengths выше)

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

4.42

Прочтите этот пост , чтобы узнать больше об интерпретации изолированных лесов.

...