为什么我要在R中使用iml包测量噪声变量之间的相互作用?

为什么我要在R中使用iml包测量噪声变量之间的相互作用?,r,interaction,mlr3,iml,R,Interaction,Mlr3,Iml,因此,在我的模型中,我模拟了弗里德曼基准1问题的数据,即: Xn在哪里∼U(0,1)和e∼N(0,1) 在我的模型中,我添加了额外的噪声变量,这些变量应该没有交互作用(模型中唯一的交互作用是x1和x2之间)。然后我使用iml包来测量交互强度。iml软件包使用弗里德曼的H统计量来测量相互作用(弗里德曼的论文发现) 问题是,当我得到结果时,我一直在测量噪声变量之间的相互作用。增加观测次数并不能消除这些虚假的相互作用 例如,在下面的代码中,我对8个变量(X1到X8)进行了300次观察,其中y作为响应

因此,在我的模型中,我模拟了弗里德曼基准1问题的数据,即:

Xn在哪里∼U(0,1)和e∼N(0,1)

在我的模型中,我添加了额外的噪声变量,这些变量应该没有交互作用(模型中唯一的交互作用是x1和x2之间)。然后我使用
iml
包来测量交互强度。
iml
软件包使用弗里德曼的H统计量来测量相互作用(弗里德曼的论文发现)

问题是,当我得到结果时,我一直在测量噪声变量之间的相互作用。增加观测次数并不能消除这些虚假的相互作用

例如,在下面的代码中,我对8个变量(X1到X8)进行了300次观察,其中y作为响应。唯一的交互作用是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, 0, 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
库(mlr3)
图书馆(MLR3学习者)
图书馆(iml)
图书馆(游侠)
#函数使用单变量版本的Friedman模拟某些数据
sim_friedman=函数(n,p=0,刻度误差=1){
#y=10sin(πx1x2)+20(x3−0.5)^2+10x4+5x5+ε
X=基质(NA,nrow=n,ncol=p)
对于(1:ncol(X))X[,i]=runif(n,0,1)
种子集(123)
PAR=c(10,20,10,5)
y=平均值=rep(NA,长度=n)
err=rnorm(n,sd=scale\U err)
平均数=帕斯[1]*sin(pi*X[,1]*X[,2])+帕斯[2]*(X[,3]-0.5)^2+帕斯[3]*X[,4]+帕斯[4]*X[,5]
y=平均值+误差
返回(列表(y=y,X=X))
}
dat=sim_friedman(n=300,p=8)#300个观测值,8个变量
datDF