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

问题描述

所以在我的模型中,我正在模拟Friedman基准测试1问题中的数据,即:

y = 10sin(\pi x_{1}x_{2}) + 20(x_{3}-0.5)^{2} +10x_{4} +5x_{5}+\epsilon

其中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

结果如下:

all 2-way interactions

所以,尽管它告诉我X1和X2之间存在很强的交互作用……也告诉我噪声变量之间也存在很强的交互作用。

另一种可视化方法是:

interaction heatmap

热图图来自不同的运行,因此得出不同的结果...但是主要要点是我正在检测噪声变量之间的相互作用。

关于为什么会这样的任何建议?我以为这可能是随机森林的影响,所以我改用SVM进行了尝试...但是我仍在检测虚假交互。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...