我有以下代码,其中我对不同的 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) 我正在努力对大型推文数据集进行文本分类,如果有人能给我指出正确的方向,我将不胜感激。
\n总体而言,我需要训练一个分类器来区分庞大数据集(最多 600 万个文本)上的两个类。我一直在食谱框架中执行此操作,然后通过tidymodels运行 glmnet lasso 。具体问题是我在计算 tf-idf 时内存不足。
\n我应该朝哪个方向努力来解决这个问题?我基本上可以批量手动获取所有 tf-idf 值,然后再次手动将它们组合成稀疏矩阵对象。这听起来很肛门,肯定有人以前遇到过这个问题并解决了它?另一种选择是 Spark,但它远远超出了我目前的能力范围,并且对于一次性任务来说可能有些过大了。或者也许我遗漏了一些东西,而现有的工具能够做到这一点?
\n具体来说,我在运行以下命令时遇到两种问题(变量应该是不言自明的,但我稍后将提供完整的可重现代码):
\nrecipe <-\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()\nRun Code Online (Sandbox Code Playgroud)\n如果corpus太大或者m太大,Rstudio就会崩溃。如果它们相当大,它会发出警告:
In asMethod(object) :\n sparse->dense coercion: allocating vector of size 1.2 GiB\nRun Code Online (Sandbox Code Playgroud)\n我在网上没有找到相关内容,我也不太明白。为什么它试图强迫某些东西从稀疏变成密集?这对于任何大型数据集来说肯定会带来麻烦。难道我做错了什么?如果这是可以预防的,也许我的完整数据集会有更好的运气?
\n或者是否没有希望step_tfidf应对 600 万个观测值并且对最大令牌没有限制?
我想知道为什么当我在 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) 这与使用 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) 我正在使用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) 通过 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() 文档中也找不到变量重要性的依据。
根据文档,tidymodels 中有三种用于拟合 MLP 模型的引擎,但它们(据我所知)都只能定义一个隐藏层。我是否缺少一些纳入 tidymodels 生态系统的引擎,该引擎可以提供多层(隐藏)层前馈网络?以sklearn.neural_network方式。
我真的很喜欢 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) 我正在尝试使用 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) 我有一个来自 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包,但这不适用于游侠对象。如何从该对象中提取特征重要性?