问题描述
所以在我的模型中,我正在模拟Friedman基准测试1问题中的数据,即:
其中Xn〜U(0,1)和e〜N(0,1)。
在我的模型中,我添加了额外的噪声变量,这些变量应该没有相互作用(模型中唯一的相互作用是在x1和x2之间)。然后,我使用iml
包来测量交互强度。 iml
软件包使用弗里德曼(Friedman)的H统计量来测量相互作用(弗里德曼的论文here)。
问题是,当我得到结果时,我一直在测量噪声变量之间的相互作用。观察数量的增加并不能消除这些虚假的相互作用。
例如,在下面的代码中,我对y为响应的8个变量(X1至X8)进行了300次观察。唯一的相互作用是X1和X2之间,噪声变量是X6到X8。
library(mlr3)
library(mlr3learners)
library(iml)
library(ranger)
# function to simulate some data using a univariate version of Friedman
sim_friedman = function(n,p = 0,scale_err = 1) {
# y = 10sin(πx1x2)+20(x3−0.5)^2+10x4+5x5+ε
X = matrix(NA,nrow = n,ncol = p)
for(i in 1:ncol(X)) X[,i] = runif(n,1)
set.seed(123)
pars = c(10,20,10,5)
y = mean = rep(NA,length = n)
err = rnorm(n,sd = scale_err)
mean = pars[1]*sin(pi*X[,1]*X[,2]) + pars[2] * (X[,3]-0.5)^2 + pars[3] * X[,4] + pars[4] * X[,5]
y= mean + err
return(list(y = y,X = X))
}
dat = sim_friedman(n = 300,p = 8) # 300 observations,8 variables
datDF <- data.frame(dat)
# Create mlr3 task
fr_T = TaskRegr$new(id = "Fried",backend = datDF,target = "y")
# learner
lrn = lrn("regr.ranger",importance = "permutation")
# model
fr_M <- lrn$train(fr_T)
# iml
mod <- Predictor$new(fr_M,data = datDF)
# Loop through and display all 2-way interactions
res <- NULL
ovars <- names(datDF)
for (i in 1:length(ovars))
res <- rbind(res,Interaction$new(mod,feature=ovars[i])$results)
res[[".feature"]]<- reorder(res[[".feature"]],res[[".interaction"]])
# plot results
p<- ggplot(data=res,aes(x=.feature,y=.interaction)) +
geom_linerange(ymin=0,aes(ymax=.interaction)) + geom_point()+
coord_flip()
p
所以,尽管它告诉我X1和X2之间存在很强的交互作用……也告诉我噪声变量之间也存在很强的交互作用。
另一种可视化方法是:
热图图来自不同的运行,因此得出不同的结果...但是主要要点是我正在检测噪声变量之间的相互作用。
关于为什么会这样的任何建议?我以为这可能是随机森林的影响,所以我改用SVM进行了尝试...但是我仍在检测虚假交互。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)