Есть ли способ рассчитать важность функции на уровне наблюдения в изолированном лесу? - PullRequest
1 голос
/ 11 марта 2019

Я использую Isolation Forest в R. Для выполнения обнаружения аномалий на многомерных данных.

Я пытался рассчитать баллы аномалий вместе с вкладом отдельных метрик в вычисление этого балла.Я могу получить оценку аномалии, но сталкиваюсь с проблемой при расчете важности метрик.

Я могу получить желаемый результат через BigML (онлайн-платформа), но не через код R.

R:

> library(solitude) # tried 'IsolationForest' and 'h2o' but not getting desired result
> mo = isolation_forest(data)
> final_scores <- predict(mo,data)
> summary(mo)
     Length Class  Mode
forest 14     ranger list

> head(final_scores,5)
[1] 0.4156554 0.3923926 0.4262782 0.4595296 0.4174865

Вывод из BigMl: enter image description here

Я хочу получить значения важности для каждой метрики (a, b, c, d) через Rкод, как и то, что я получаю в BigML

Я думаю, что я пропускаю некоторые основные параметры.На самом деле я новичок в R, поэтому не могу понять.

Я подумал о чем-то, чтобы получить важность функции на уровне наблюдения, но я столкнулся с проблемой при ее реализации.

Вот фрагмент того, что я планирую.

Точки в метрике - это отдельные наблюдения, в то время как линии разбиты на основе определенных переменных.

Я могу отследить отдельные деревьялес, но проблема в том, что в лесу 500 деревьев, и отследить отдельные деревья и получить доступ к их значениям важности нецелесообразно.Приведенный ниже пример основан исключительно на фиктивных данных.

enter image description here

Вывод отдельного дерева:

> x = treeInfo(mo$forest,tree=3)
> x
   nodeID leftChild rightChild splitvarID splitvarName  splitval terminal prediction
1       0         1          2          2            c 0.6975663    FALSE         NA
2       1         3          4          1            b 0.3455875    FALSE         NA
3       2         5          6          0            a 0.2620023    FALSE         NA
4       3         7          8          0            a 0.1425075    FALSE         NA
5       4         9         10          0            a 0.6611566    FALSE         NA
6       5        NA         NA         NA         <NA>        NA     TRUE         10
7       6        NA         NA         NA         <NA>        NA     TRUE          2
8       7        NA         NA         NA         <NA>        NA     TRUE          6
9       8        NA         NA         NA         <NA>        NA     TRUE          1
10      9        NA         NA         NA         <NA>        NA     TRUE          3
11     10        NA         NA         NA         <NA>        NA     TRUE          5

Любая помощьоценили.

1 Ответ

1 голос
/ 11 марта 2019

Важность локальных характеристик можно оценить с помощью пакета lime.

library(solitude)
library(lime)

Сначала приведем некоторые данные об игрушках:

set.seed(1234)
data<-data.frame(rnorm(20,0,1),rnorm(20,0,0.5))
colnames(data)<-c("x","y")
row.names(data)<-seq(1,nrow(data),1)

Посмотрите на данные об игрушках:

plot(data)
text(data-0.05,row.names(data))

Эти случаи выглядят как выбросы:

outliers<-c(4,20) 

Расширение леса изоляции:

model<-isolation_forest(data, importance="impurity")

Поскольку одиночество не поддерживается в извести, нам нужно построить две функции, чтобыЛайм может обращаться с объектами одиночества.Функция model_type сообщает lime, какая у нас модель.Функция Предсказание_модели позволяет извести прогнозировать с объектами уединения.

model_type.solitude <- function(x, ...) {
  return("regression")
}

predict_model.solitude <- function(x, newdata, ...) {
  pred <- predict(x, newdata)
  return(as.data.frame(pred))
}

Затем мы можем сгенерировать объект извести и оценить важность функции уровня наблюдения (и число перестановок может быть установлено выше для более надежных результатов):

lime1 <- lime(data, model)
importance <- data.frame(explain(data, lime1,
                             n_features = 2,n_permutations = 500 ))

Важность функции важна $ feature_weight.Случайная проверка результатов:

importance[importance$case %in% outliers,c("case","feature","feature_weight")]

Сюжет:

plot_features(importance[importance$case %in% outliers,] , ncol = 2)

Надеюсь, что это полезно!

Конечно, прочитайте lime как этоосновывается на определенных предположениях.

...