首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >tidymodels:带交叉验证的游侠

tidymodels:带交叉验证的游侠
EN

Stack Overflow用户
提问于 2020-02-23 23:57:19
回答 1查看 2.7K关注 0票数 7

可以在这里找到数据集:https://www.kaggle.com/mlg-ulb/creditcardfraud

我试图使用时间模型运行护林员与5倍交叉验证在这个数据集。

我有两个代码块。第一个代码块是包含完整数据的原始代码。第二个代码块几乎与第一个代码块相同,只是我有一部分数据,因此代码运行得更快。第二个代码块只是为了确保我的代码在原始数据集中运行之前工作正常。

这里是第一个包含完整数据的代码块:

代码语言:javascript
复制
#load packages
library(tidyverse)
library(tidymodels)
library(tune)
library(workflows)

#load data
df <- read.csv("~creditcard.csv")

#check for NAs and convert Class to factor
anyNA(df)
df$Class <- as.factor(df$Class)

#set seed and split data into training and testing
set.seed(123)
df_split <- initial_split(df)
df_train <- training(df_split)
df_test <- testing(df_split)

#in the training and testing datasets, how many are fraudulent transactions?
df_train %>% count(Class)
df_test %>% count(Class)

#ranger model with 5-fold cross validation
rf_spec <- 
  rand_forest() %>% 
  set_engine("ranger", importance = "impurity") %>% 
  set_mode("classification")

all_wf <- 
  workflow() %>% 
  add_formula(Class ~ .) %>% 
  add_model(rf_spec)

cv_folds <- vfold_cv(df_train, v = 5)
cv_folds

rf_results <-
  all_wf %>% 
  fit_resamples(resamples = cv_folds)

rf_results %>% 
  collect_metrics()

这里是包含1,000行的第二个代码块:

代码语言:javascript
复制
#load packages
library(tidyverse)
library(tidymodels)
library(tune)
library(workflows)

#load data
df <- read.csv("~creditcard.csv")

###################################################################################
#Testing area#
df <- df %>% arrange(-Class) %>% head(1000)

###################################################################################

#check for NAs and convert Class to factor
anyNA(df)
df$Class <- as.factor(df$Class)

#set seed and split data into training and testing
set.seed(123)
df_split <- initial_split(df)
df_train <- training(df_split)
df_test <- testing(df_split)

#in the training and testing datasets, how many are fraudulent transactions?
df_train %>% count(Class)
df_test %>% count(Class)

#ranger model with 5-fold cross validation
rf_spec <- 
  rand_forest() %>% 
  set_engine("ranger", importance = "impurity") %>% 
  set_mode("classification")

all_wf <- 
  workflow() %>% 
  add_formula(Class ~ .) %>% 
  add_model(rf_spec)

cv_folds <- vfold_cv(df_train, v = 5)
cv_folds

rf_results <-
  all_wf %>% 
  fit_resamples(resamples = cv_folds)

rf_results %>% 
  collect_metrics()

1.)使用第一个代码块,我可以在控制台中分配和打印cv折叠。全球环境数据显示,cv_folds有5个obs。其中2个变量。当我查看(Cv_folds)时,我有标记为splits和id的列,但是没有行,也没有数据。当我使用str(cv_folds)时,我得到了R是"thinking“的空白加载线,但是没有红色的停止图标。我唯一能做的就是强迫退出RStudio。也许我只需要再等一会儿?我不确定。当我对较小的第二个代码块执行同样的操作时,str()可以正常工作。

2)本项目的总体目标是将数据集划分为训练集和测试集。然后用5倍交叉验证方法对训练数据进行划分,并在此基础上建立护林员模型。接下来,我想检查我的模型对培训数据的度量。然后,我想在测试集上测试我的模型并查看度量。最后,我想把护林员换成像xgboost这样的东西。请给我建议,我的代码的哪些部分,我可以添加/修改以改进。我仍然缺少在测试集上测试我的模型的部分。

代码语言:javascript
复制
I think the Predictions portion of this article might be what I'm aiming for.
https://rviews.rstudio.com/2019/06/19/a-gentle-intro-to-tidymodels/

3)当我使用rf_results %>% collect_metrics()时,它只显示了准确性和roc_auc。如何获得敏感性、特异性、精确性和回忆性?

4)我是如何规划重要性的?我会用这样的东西吗?

代码语言:javascript
复制
rf_fit <- get_tree_fit(all_wf)
vip::vip(rf_fit, geom = "point")

5)我怎样才能大幅度减少模型训练的时间?上次我使用插入符号在这个数据集上运行了5次交叉验证的游侠,它花费了8+小时(6核心,4.0GHz,16 ghz,SSD,gtx 1060)。我对任何事情都持开放态度.重构代码、AWS计算、并行化等)

编辑:这是我尝试过的另一种设置方法

代码语言:javascript
复制
#ranger model with 5-fold cross validation
rf_recipe <- recipe(Class ~ ., data = df_train)

rf_engine <- 
  rand_forest(mtry = tune(), trees = tune(), min_n = tune()) %>% 
  set_engine("ranger", importance = "impurity") %>% 
  set_mode("classification")

rf_grid <- grid_random(
  mtry() %>% range_set(c(1, 20)),
  trees() %>% range_set(c(500, 1000)), 
  min_n() %>% range_set(c(2, 10)),
  size = 30)

all_wf <- 
  workflow() %>% 
  add_recipe(rf_recipe) %>% 
  add_model(rf_engine)

cv_folds <- vfold_cv(df_train, v = 5)
cv_folds

#####
rf_fit <- tune_grid(
  all_wf,
  resamples = cv_folds,
  grid = rf_grid,
  metrics = metric_set(roc_auc),
  control = control_grid(save_pred = TRUE)
)

collect_metrics(rf_fit)

rf_fit_best <- select_best(rf_fit)
(wf_rf_best <- finalize_workflow(all_wf, rf_fit_best))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-05 15:31:09

我从您的最后一段代码开始,并进行了一些编辑,以获得一个功能工作流。我按照密码回答了你的问题。我冒昧地给您一些建议,并重新格式化您的代码。

代码语言:javascript
复制
## Packages, seed and data
library(tidyverse)
library(tidymodels)

set.seed(123)

df <- read_csv("creditcard.csv")

df <- 
  df %>% 
  arrange(-Class) %>% 
  head(1000) %>% 
  mutate(Class = as_factor(Class))


## Modelisation

# Initial split
df_split <- initial_split(df)
df_train <- training(df_split)
df_test <- testing(df_split)

您可以看到df_split返回<750/250/1000> (见下文)。

2)调优xgboost模型,您有非常小的事情要更改。

代码语言:javascript
复制
# Models

model_rf <- 
  rand_forest(mtry = tune(), trees = tune(), min_n = tune()) %>% 
  set_engine("ranger", importance = "impurity") %>% 
  set_mode("classification")

model_xgboost <- 
  boost_tree(mtry = tune(), trees = tune(), min_n = tune()) %>% 
  set_engine("xgboost", importance = "impurity") %>% 
  set_mode("classification")

在这里,您选择您的超参数网格。我建议您使用非随机网格以最佳方式访问超级参数的空间。

代码语言:javascript
复制
# Grid of hyperparameters

grid_rf <- 
  grid_max_entropy(        
    mtry(range = c(1, 20)), 
    trees(range = c(500, 1000)),
    min_n(range = c(2, 10)),
    size = 30) 

正如您所看到的,这些是您的工作流程,几乎没有什么可更改的。

代码语言:javascript
复制
# Workflow

wkfl_rf <- 
  workflow() %>% 
  add_formula(Class ~ .) %>% 
  add_model(model_rf)

wkfl_wgboost <- 
  workflow() %>% 
  add_formula(Class ~ .) %>% 
  add_model(model_xgboost)

1) <600/150/750>意味着您的培训集中有600个观测,验证集中有150个,原始数据集中总共有750个观察。请注意,在这里,600 + 150 = 750,但情况并不总是如此(例如,带重采样的引导方法)。

代码语言:javascript
复制
# Cross validation method

cv_folds <- vfold_cv(df_train, v = 5)
cv_folds

3)在这里,您可以通过yardstik包选择您想要在调优期间收集的度量。

代码语言:javascript
复制
# Choose metrics

my_metrics <- metric_set(roc_auc, accuracy, sens, spec, precision, recall)

然后你可以根据网格计算不同的模型。对于控制参数,不要保存预测和打印进度(imho)。

代码语言:javascript
复制
# Tuning

rf_fit <- tune_grid(
  wkfl_rf,
  resamples = cv_folds,
  grid = grid_rf,
  metrics = my_metrics,
  control = control_grid(verbose = TRUE) # don't save prediction (imho)
)

这些是处理rf_fit对象的一些有用函数。

代码语言:javascript
复制
# Inspect tuning 

rf_fit
collect_metrics(rf_fit)
autoplot(rf_fit, metric = "accuracy")
show_best(rf_fit, metric = "accuracy", maximize = TRUE)
select_best(rf_fit, metric = "accuracy", maximize = TRUE)

最后,您可以根据最佳参数来拟合您的模型。

代码语言:javascript
复制
# Fit best model 

tuned_model <-
  wkfl_rf %>% 
  finalize_workflow(select_best(rf_fit, metric = "accuracy", maximize = TRUE)) %>% 
  fit(data = df_train)

predict(tuned_model, df_train)
predict(tuned_model, df_test)

4)不幸的是,处理randomForest对象的方法通常不能用于parnsnip输出

5) --您可以查看有关并行化的格列奈特

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60368047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档