【问题标题】:How to map pdp::partial to nested randomForest models?如何将 pdp::partial 映射到嵌套的 randomForest 模型?
【发布时间】:2021-11-21 17:32:08
【问题描述】:

我想将函数 pdp::partial 映射到嵌套的 randomForest 模型。然后,我将使用输出通过 facet_wrap() 为每个组绘制 3d 部分依赖图。将函数映射到模型时,我收到一个错误,即无法在训练数据中找到预测变量 - 但是当我检查 tibble 时它们就在那里,所以我不知道该怎么做。

library(tidyverse)
library(pdp)
library(randomForest)
data(boston)
glimpse(boston)

#Make groups, nest data by groups, apply random forest model to nested data
boston %>%
  mutate(grp=ifelse(age<80, "young", "old"))%>%
  nest(data= -grp)%>%
  mutate(fit = map(data, ~ randomForest(cmedv ~ ., data = boston, importance = TRUE)))%>%
  {.->>GrpModels}

#Map pdp::partial to fitted models for two predictor variables
GrpModels%>%
  mutate(p=map2(fit,data, ~pdp::partial(fit,train=data, pred.var=c("lstat", "rm"))))%>%
  unnest(p)%>%{.->>checkpdp}

错误:mutate()p 有问题。我p = map2(...)。 x lstat, 在训练数据中找不到 rm。

【问题讨论】:

    标签: r tidyr random-forest purrr


    【解决方案1】:

    这似乎可行,尽管我不确定为什么使用geom_tile() 进行绘图并不能完全按照我的想法进行。我改用geom_point()。简而言之,我需要将 pred.var 作为一个列表,然后将三个输入(拟合、数据和预测变量)传递给pmap

    GrpModels %>% 
      mutate(preds = data.table::transpose(as.list(c('lstat','rm')))) %>%
      mutate(p = pmap(list(fit, data, preds), 
                          .f = ~pdp::partial(object=..1, train = ..2, 
                                       pred.var = ..3)))%>%
      select(-data,-fit,-preds)%>%
      unnest_wider(p)%>%
      unnest(c(yhat,lstat,rm))%>%{.->>checkpdp}%>%
      ggplot(.,aes(x=lstat,y=rm,color=yhat))+
      #geom_tile()+
      geom_point(shape=15, size=2)+
      facet_wrap(~grp, scales='free')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-08
      • 1970-01-01
      • 2017-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多