1

我想用 DALEX 查看主成分的复合特征重要性,model_parts但我也很感兴趣,结果在多大程度上是由该主成分中特定变量的变化驱动的。我可以在使用时非常巧妙地查看单个特征的影响,model_profile但在这种情况下,我无法研究 PCA 变量的特征重要性。model_profile在使用如下所示的各个因素的部分依赖图时,是否可以两全其美并查看主成分的复合特征重要性?

数据:

library(tidymodels)
library(parsnip)
library(DALEXtra)

set.seed(1)
x1 <- rbinom(1000, 5, .1)
x2 <- rbinom(1000, 5, .4)
x3 <- rbinom(1000, 5, .9)
x4 <- rbinom(1000, 5, .6)
# id <- c(1:1000)
y <- as.factor(rbinom(1000, 5, .5))
df <- tibble(y, x1, x2, x3, x4, id)
df[, c("x1", "x2", "x3", "x4", "id")] <- sapply(df[, c("x1", "x2", "x3", "x4", "id")], as.numeric)

模型

# create training and test set
set.seed(20)
split_dat <- initial_split(df, prop = 0.8)
train <- training(split_dat)
test <- testing(split_dat)
# use cross-validation
kfolds <- vfold_cv(df)

# recipe
rec_pca <- recipe(y ~ ., data = train) %>%
  update_role(id, new_role = "id variable") %>%
  step_center(all_predictors()) %>%
  step_scale(all_predictors()) %>%
  step_pca(x1, x2, x3, threshold = 0.9, num_comp = turn_off_pca)

# parsnip engine
boost_model <- boost_tree() %>% 
  set_mode("classification") %>% 
  set_engine("xgboost")

# create wf
boosted_wf <- 
  workflow() %>% 
  add_model(boost_model) %>% 
  add_recipe(rec_pca)

final_boosted <- generics::fit(boosted_wf, df) 

# create an explanation object
explainer_xgb <- DALEXtra::explain_tidymodels(final_boosted, 
                                              data = df[,-1], 
                                              y = df$y) 

# feature importance
model_parts(explainer_xgb) %>% plot()

这给了我下面的情节,尽管我已经减少了x1,x2x3变成了上面的一个组件step_pca

在此处输入图像描述

我知道我可以手动减小尺寸并将其绑定到 df,然后查看特征重要性。

rec_pca_2 <- df %>% 
  select(x1, x2, x3) %>% 
  recipe() %>%
  step_pca(all_numeric(), num_comp = 1)


df <- bind_cols(df, prep(rec_pca_2) %>% juice())
df

> df
# A tibble: 1,000 × 6
   y        x1    x2    x3    x4   PC1
   <fct> <int> <int> <int> <int> <dbl>
 1 2         0     2     4     2 -4.45
 2 3         0     3     3     3 -3.95
 3 0         0     2     4     4 -4.45
 4 2         1     4     5     3 -6.27
 5 4         0     1     5     2 -4.94
 6 2         1     0     5     1 -4.63
 7 3         2     2     5     4 -5.56
 8 3         1     2     5     3 -5.45
 9 2         1     3     5     2 -5.86
10 2         0     2     5     1 -5.35
# … with 990 more rows

然后我可以估计一个以 PC1 作为协变量的模型。然而,在这种情况下,很难解释使用时 PC1 次统计的变化意味着什么,model_profile因为所有内容都会被折叠成一个组件。

model_profile(explainer_xgb) %>% plot()

在此处输入图像描述

因此,我的关键问题是:如何在不影响部分依赖图的可解释性的情况下查看组件的特征重要性?

4

0 回答 0