标签: tidymodels

Tidymodels:如何从训练数据中提取重要性

我有以下代码,其中我对不同的 mtry 和 min_n 进行一些网格搜索。我知道如何提取提供最高准确度的参数(请参阅第二个代码框)。如何提取训练数据集中每个特征的重要性?我在网上找到的指南显示了如何使用“last_fit”仅在测试数据集中执行此操作。例如指南:https: //www.tidymodels.org/start/case-study/#data-split

set.seed(seed_number)
    data_split <- initial_split(node_strength,prop = 0.8,strata = Group)
    
    train <- training(data_split)
    test <- testing(data_split)
    train_folds <- vfold_cv(train,v = 10)
    
    
    rfc <- rand_forest(mode = "classification", mtry = tune(),
                       min_n = tune(), trees = 1500) %>%
        set_engine("ranger", num.threads = 48, importance = "impurity")
    
    rfc_recipe <- recipe(data = train, Group~.)
    
    rfc_workflow <- workflow() %>% add_model(rfc) %>%
        add_recipe(rfc_recipe)
    
    rfc_result <- rfc_workflow %>%
        tune_grid(train_folds, grid = 40, control = control_grid(save_pred = TRUE),
                  metrics = metric_set(accuracy))
Run Code Online (Sandbox Code Playgroud)

best <- 
        rfc_result …
Run Code Online (Sandbox Code Playgroud)

r machine-learning random-forest tidymodels

3
推荐指数
1
解决办法
879
查看次数

获取 TF-IDF 数据时的内存问题

介绍

\n

我正在努力对大型推文数据集进行文本分类,如果有人能给我指出正确的方向,我将不胜感激。

\n

总体而言,我需要训练一个分类器来区分庞大数据集(最多 600 万个文本)上的两个类。我一直在食谱框架中执行此操作,然后通过tidymodels运行 glmnet lasso 。具体问题是我在计算 tf-idf 时内存不足。

\n

问题

\n

我应该朝哪个方向努力来解决这个问题?我基本上可以批量手动获取所有 tf​​-idf 值,然后再次手动将它们组合成稀疏矩阵对象。这听起来很肛门,肯定有人以前遇到过这个问题并解决了它?另一种选择是 Spark,但它远远超出了我目前的能力范围,并且对于一次性任务来说可能有些过大了。或者也许我遗漏了一些东西,而现有的工具能够做到这一点?

\n

具体来说,我在运行以下命令时遇到两种问题(变量应该是不言自明的,但我稍后将提供完整的可重现代码):

\n
recipe <-\n  recipe(Class ~ text, data = corpus) %>% \n  step_tokenize(text) %>%\n  step_stopwords(text) %>% \n  step_tokenfilter(text, max_tokens = m) %>% \n  step_tfidf(text) %>% \n  prep()\n
Run Code Online (Sandbox Code Playgroud)\n

如果corpus太大或者m太大,Rstudio就会崩溃。如果它们相当大,它会发出警告

\n
In asMethod(object) :\n  sparse->dense coercion: allocating vector of size 1.2 GiB\n
Run Code Online (Sandbox Code Playgroud)\n

我在网上没有找到相关内容,我也不太明白。为什么它试图强迫某些东西从稀疏变成密集?这对于任何大型数据集来说肯定会带来麻烦。难道我做错了什么?如果这是可以预防的,也许我的完整数据集会有更好的运气?

\n

或者是否没有希望step_tfidf应对 600 万个观测值并且对最大令牌没有限制?

\n …

r classification tf-idf tidytext tidymodels

3
推荐指数
1
解决办法
139
查看次数

为什么 tidymodels 中的 ranger 提供了不同的模型来直接调用 ranger?

我想知道为什么当我在 tidymodels 中使用 ranger直接使用 ranger 时没有得到相同的模型?

这是一个可重现的示例:

library(tidymodels)
library(ranger)

# load data
data("iris")
train <- iris |> slice_sample(prop = 0.7)
test <- iris |> anti_join(train)

# rf model specs
rf_mod <- 
  rand_forest(trees = 10)  |>  
  set_engine("ranger", respect.unordered.factors = TRUE, probability = FALSE) |> 
  set_mode("classification")

# fit model using tidymodels
set.seed(100)
rf_mod |> fit(Species ~ ., data = train) # OOB=4.81%

# fit model using ranger directly
set.seed(100)
ranger(Species ~ ., data = train, 
       num.trees=10, respect.unordered.factors = TRUE, probability …
Run Code Online (Sandbox Code Playgroud)

r random-forest tidymodels

3
推荐指数
1
解决办法
43
查看次数

为什么 tidymodels/recipes 中的“id 变量”会起到预测作用?

与使用 step_naomit 进行预测并使用 tidymodels 保留 ID是相同的问题,但即使有一个可接受的答案,OP 的最后一条评论指出了“id 变量”被用作预测器的问题,正如在查看时所看到的model$fit$variable.importance.

我有一个我想保留的带有“id 变量”的数据集。我以为我可以通过 recipe() 规范来实现这一点。

library(tidymodels)

# label is an identifier variable I want to keep even though it's not
# a predictor
df <- tibble(label = 1:50, 
             x = rnorm(50, 0, 5), 
             f = factor(sample(c('a', 'b', 'c'), 50, replace = TRUE)),
             y = factor(sample(c('Y', 'N'), 50, replace = TRUE)) )

df_split <- initial_split(df, prop = 0.70)

# Make up any recipe: just note I specify 'label' as "id …
Run Code Online (Sandbox Code Playgroud)

r r-recipes tidymodels

2
推荐指数
1
解决办法
784
查看次数

如何使用 tidymodels 设置结果变量中的“事件”级别?

我正在使用进行机器学习,我想预测二元响应/结果。如何指定哪个级别的结果是“事件”或积极案例?

这种情况发生在食谱中还是其他地方?


##split the data
anxiety_split <- initial_split(anxiety_df, strata = anxiety)


anxiety_train <- training(anxiety_split)
anxiety_test <- testing(anxiety_split)


set.seed(1222) 
anxiety_cv <- vfold_cv(anxiety_train, strata = anxiety)

anxiety_rec <- recipe(anxiety ~ ., data = anxiety_train, positive = 'pos') %>%
  step_corr(all_numeric()) %>%
  step_dummy(all_nominal(), -all_outcomes()) %>%
  step_zv(all_numeric()) %>%
  step_normalize(all_numeric())
Run Code Online (Sandbox Code Playgroud)

r tidymodels

2
推荐指数
1
解决办法
1108
查看次数

R tidymodels / VIP变量重要性确定

通过 tidymodels 和 R 中的 vip 包,我计算了变量重要性。就代码而言,它看起来像这样:

rf_vi_fit %>%
pull_workflow_fit() %>%
vip(geom = "point") + 
labs(title = "Random forest variable importance") 
Run Code Online (Sandbox Code Playgroud)

从视觉上看,它看起来像这样:

随机森林变量重要性

然而,变量重要性实际上意味着什么?变量重要性可以基于多个指标,例如 R 平方增益或基尼损失,但我不确定 vip 的变量重要性是基于哪里。我的其他预测具有 3 到 4 左右的可变重要性值,而不是像本模型中的 0.005。

我在 vip() 文档中也找不到变量重要性的依据。

r random-forest tidymodels vip

2
推荐指数
1
解决办法
6004
查看次数

是否可以使用 tidymodels 框架构建 MLP 模型?

根据文档,tidymodels 中有三种用于拟合 MLP 模型的引擎,但它们(据我所知)都只能定义一个隐藏层。我是否缺少一些纳入 tidymodels 生态系统的引擎,该引擎可以提供多层(隐藏)层前馈网络?以sklearn.neural_network方式。

tidymodels mlp

2
推荐指数
1
解决办法
569
查看次数

将 Tidymodels 进程映射到列表/分组依据或嵌套

我真的很喜欢 tidymodels,但我不清楚如何在嵌套 group by 之类的东西上适应该模型工作流程。例如,tidyr 在类似 mtcars 的圆柱体上勾勒出一个简单的嵌套,然后为每个圆柱体拟合一个独特的线性 reg 模型。我正在尝试基于圆柱体之类的东西拟合数百个独特的模型(可能是随机森林),但使用 tidymodels 工作流程(数据拆分、配方、预测)。

以下是 tidyr 页面上概述的简单嵌套/拟合线性 reg:

mtcars_nested <- mtcars %>%
  group_by(cyl) %>%
  nest()

mtcars_nested <- mtcars_nested %>%
  mutate(model = map(data, function(df) lm(mpg ~ wt, data = df)))
mtcars_nested
Run Code Online (Sandbox Code Playgroud)

有没有办法做类似下面的事情,但基于列中的 group_by 或 nest 属性?如果可能的话,然后需要将每个预测和/或准确性组合起来并存储在一个数据帧中。我尝试将数据拆分为嵌套的数据帧,但没有奏效。我觉得这是一个 purrr 地图问题,但不清楚它是否是 tidymodels 已经支持的东西:

library(tidymodels)
library(tidyverse)

#add dataset
mtcars <- mtcars

#create data splits
split <- initial_split(mtcars)
mtcars_train <- training(split)
mtcars_test <- testing(split)

#create recipe
mtcars_recipe <-
  recipe(mpg ~., data = mtcars_train) %>%
  step_normalize(all_predictors())

#define model
lm_mod …
Run Code Online (Sandbox Code Playgroud)

r purrr tidymodels

1
推荐指数
1
解决办法
903
查看次数

Tidymodels - 如何在 control = control_grid 中正确使用 verbose = TRUE

我正在尝试使用 verbose = TRUE 来查看调整网格的进度。它似乎对我不起作用,是我把它放在错误的位置还是我使用不当?底部是我想要的屏幕截图,下面是没有所需输出的可重现代码。

library(tidyverse)
library(tidymodels)
options(tidymodels.dark = TRUE)

parks <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-06-22/parks.csv')

modeling_df <- parks %>% 
  select(pct_near_park_data, spend_per_resident_data, med_park_size_data) %>% 
  rename(nearness = "pct_near_park_data",
         spending = "spend_per_resident_data",
         acres = "med_park_size_data") %>% 
  mutate(nearness = (parse_number(nearness)/100)) %>% 
  mutate(spending = parse_number(spending))

set.seed(123)
park_split <- initial_split(modeling_df)
park_train <- training(park_split)
park_test <- testing(park_split)

tree_rec <- recipe(nearness ~., data = park_train)
tree_prep <- prep(tree_rec)
juiced <- juice(tree_prep)

tune_spec <- rand_forest(
  mtry = tune(),
  trees = 1000,
  min_n = tune()
) %>% 
  set_mode("regression") %>% 
  set_engine("ranger")

tune_wf <- …
Run Code Online (Sandbox Code Playgroud)

r tidymodels

1
推荐指数
1
解决办法
1761
查看次数

如何从 Tidymodels ranger 对象获取变量/特征重要性?

我有一个来自 tidymodels rand_forest 函数的 Ranger 对象:

rf <- rand_forest(mode = "regression", trees = 1000) %>% fit(pay_rate ~ age+profession)
Run Code Online (Sandbox Code Playgroud)

我想获得每个变量的特征重要性(我有比这个例子更多的特征)。我尝试过诸如rf$variable.importance, 或 之类的东西importance(rf),但前者返回NULL而后者函数不存在。我尝试使用该vip包,但这不适用于游侠对象。如何从该对象中提取特征重要性?

r dataframe feature-selection tidyverse tidymodels

1
推荐指数
1
解决办法
2089
查看次数