有没有一种方法可以在隔离林的观察级别上计算特征重要性?

时间:2019-03-11 13:33:27

标签: r anomaly-detection

我正在R中使用Isolation Forest对多变量数据执行异常检测。

我尝试计算异常分数以及各个指标在计算分数中的贡献。我能够获得异常分数,但是在计算指标的重要性时遇到了问题。

我能够通过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

我想通过R代码获取每个指标(a,b,c,d)的重要性值,就像我在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 个答案:

答案 0 :(得分:1)

可以使用石灰包来估算局部特征的重要性。

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函数告诉石灰我们拥有哪种模型。预言模型功能使石灰能够通过孤独对象进行预测。

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,因为它是基于某些假设的。