当我有 4 个预测变量时如何计算部分依赖?

机器算法验证 随机森林 部分效应
2022-03-29 20:40:47

我正在阅读 Freidman 的书“统计学习的要素 - 第 2 版”。第 365 页,它谈到了部分依赖图。我不太明白他实际上是如何计算 f(X) 对 Xs 的部分依赖。比如说,我建立了一个基于 4 个预测变量的模型;我将模型本身用作 f(Xs,Xc)。我想知道我的第一个预测变量 V1 的部分依赖性。如果数据看起来像:

V1 V2 V3 V4 预测_p

1 1 0 1 0.2

1 2 0 0 0.24

2 1 1 1 0.6

2 2 0 1 0.4

V1 的部分依赖是否有两个值,一个为 V1=1,另一个为 V1=2?对于V1=1的情况,PD=(0.2+0.24)/2=0.22;对于 V1=2 的情况,PD=(0.6+0.4)/2=0.5

我理解对了吗?谢谢你。

此外,每个预测变量的部分依赖的平均值是否相等?

1个回答

假设我们有一个数据集其中是我们想知道其部分依赖关系的变量矩阵,是剩余变量的矩阵预测器。为响应向量(即回归问题)。假设并且我们估计一些拟合X=[xsxc]Rn×pxsxcyRy=f(x)+ϵf^

那么处的部分依赖(这里位于同一空间),定义为:f^s(x)f^ xxxs

f^s(x)=1ni=1nf^(x,xci)

这就是说:对感兴趣的变量因此,我们需要选择感兴趣的变量,并选择所在空间中我们感兴趣的区域。注意:小心将的边际均值外推到该区域之外。xxsf(x)

这是 R 中的一个示例实现。我们首先创建一个示例数据集:

library(tidyverse)
library(ranger)
library(broom)

mt2 <- mtcars %>%
  as_tibble() %>%
  select(hp, mpg, disp, wt, qsec)

然后我们使用随机森林估计f

fit <- ranger(hp ~ ., mt2)

接下来我们选择我们对估计部分依赖关系感兴趣的特性:

var <- quo(disp)

现在我们可以将数据集拆分为这个预测器和其他预测器:

x_s <- select(mt2, !!var)   # grid where we want partial dependencies
x_c <- select(mt2, -!!var)  # other predictors

然后我们创建这些数据集的所有组合的数据框:

# if the training dataset is large, use a subsample of x_c instead
grid <- crossing(x_s, x_c)

我们想知道在这个网格上每个点的预测。我为此定义了一个助手f^broom::augment()

augment.ranger <- function(x, newdata) {
  newdata <- as_tibble(newdata)
  mutate(newdata, .fitted = predict(x, newdata)$predictions)
}

au <- augment(fit, grid)

现在我们有了预测,我们通过取中每个点的平均值来边缘化:xs

pd <- au %>%
  group_by(!!var) %>%
  summarize(yhat = mean(.fitted))

我们也可以将其可视化:

pd %>%
  ggplot(aes(!!var, yhat)) +
  geom_line(size = 1) +
  labs(title = "Partial dependence plot for displacement",
       y = "Average prediction across all other predictors",
       x = "Engine displacement") +
  theme_bw()

最后,我们可以根据包检查这个实现pdp以确保它是正确的:

pd2 <- pdp::partial(
  fit,
  pred.var = quo_name(var),
  pred.grid = distinct(mtcars, !!var),
  train = mt2
)

testthat::expect_equivalent(pd, pd2)  # silent, so we're good

对于分类问题,您可以重复类似的过程,除了预测单个类的类概率。