我正在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
我想通过R代码获取每个指标(a,b,c,d)的重要性值,就像我在BigML中得到的一样
我认为我缺少一些基本参数。其实我是R的新手,所以无法弄清楚。
我已经想过一些事情,以便在观察级别上获得功能的重要性,但是在实现它时遇到了问题。
这是我正在计划的摘录。
度量标准中的点是单个观察值,而线是根据特定变量拆分的。
我能够跟踪森林中的单个树,但是问题是森林中有500棵树,并且跟踪单个树并访问其重要性值是不切实际的。下面的示例完全基于伪数据。
单个树的输出:
> 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
感谢您提供任何帮助。
答案 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,因为它是基于某些假设的。