偏相关图的交叉验证

Cross validation of the Partial Dependence Plots

在我的一项稳健性测试中,我想对部分依赖图执行交叉验证,但我不知道从哪里开始。我的模型是回归树,我有基于整个数据集的部分依赖图。我的问题是:

  1. 如果我随机将数据集分成10个随机样本,并根据每个随机样本计算变量X对Y的部分依赖性,我如何将10个样本的结果平均得出一个阴谋?我在 python 或 R 中找不到任何内置函数来执行此操作?

  2. 和上面一样的任务,但是,我想绘制2-way交互的部分依赖图,例如变量X1和X2在Y上?

谢谢。

根据我在评论中的回答,如果您想查看冰曲线的变化,您可以 bootstrap 像这样:

library(pdp)
library(randomForest)
library(ICEbox)
data(boston)
X <- as.data.frame(model.matrix(cmedv ~ ., data=boston)[,-1])
y <- model.response(model.frame(cmedv ~ ., data=boston))
boston.rf <- randomForest(x=X, y=y)
bice <- ice(boston.rf, X=X, predictor = "lstat") 

res <- NULL
for(i in 1:1000){
  inds <- sample(1:nrow(bice$ice_curves), 
                 nrow(bice$ice_curves), 
                 replace=TRUE)
  res <- rbind(res, colMeans(bice$ice_curve[inds, ]))
}

out <- data.frame(
  fit = colMeans(bice$ice_curves), 
  lwr = apply(res, 2, quantile, .025),
  upr = apply(res, 2, quantile, .975), 
  x=bice$gridpts
)

library(ggplot2)
ggplot(out, aes(x=x, y=fit, ymin=lwr, ymax=upr)) + 
  geom_ribbon(alpha=.25) + 
  geom_line() + 
  theme_bw() + 
  labs(x="lstat", y="Prediction")

或者,您可以查看每个评估点的冰图的不同分位数。

tmp <- t(apply(bice$ice_curves, 
             2, 
             quantile, c(0, .025, .05, .1, .25, .5, .75, .9, .95, .975, 1)))

head(tmp)
tmp <- as.data.frame(tmp)
names(tmp) <- c("l1", "l2", "l3", "l4", "l5", 
                "med", "u1", "u2", "u3", "u4", "u5")

tmp$x <- bice$gridpts

ggplot(tmp, aes(x=x, y=med)) + 
  geom_ribbon(aes(ymin=l1, ymax=u1), alpha=.2) + 
  geom_ribbon(aes(ymin=l2, ymax=u2), alpha=.2) + 
  geom_ribbon(aes(ymin=l3, ymax=u3), alpha=.2) + 
  geom_ribbon(aes(ymin=l4, ymax=u4), alpha=.2) + 
  geom_ribbon(aes(ymin=l5, ymax=u5), alpha=.2) + 
  geom_line() + 
  theme_bw() + 
  labs(x="lstat", y="Prediction")