0

这个问题如果是 tidymodels 用户,如果你很懒,跳过整个文本直接跳到下面的粗体问题

我正在寻找从拟合的重采样(tune::fit_resample())中提取我的欧洲防风草模型对象的最有效方法。

当我想用交叉验证训练模型时,我可以选择tune::tune_grid()oder fit_resamples()

假设我知道我的算法的最佳参数,所以我不需要任何参数 tunig,这意味着我决定使用fit_resamples(). 如果我决定继续,tune_grid()我通常会设置一个工作流程,因为我在 tune_grid 运行后评估不同的模型:我会去探索tune::show_best()tune::select_best()提取模型的最佳参数。然后我去tune::finalize_workflow()workflows::pull_wokrflow_fit()提取我的模型对象。此外,当我想查看预测时,我会tune::last_fit()选择tune::collect_predictions()

当我使用 时,所有这些步骤似乎都是多余的fit_resamples(),因为我基本上只有一个具有稳定参数的模型。所以上述所有这些步骤都不是必需的,但我必须通过它们。我吗?

执行后fit_resamples(),我得到一个包含有关 .splits、.metrics、.notes 等信息的小标题。所以我的问题真的归结为:

  • 从输出 tibblefit_resamples()到我的最终欧洲防风模型对象的最快方法是什么?
4

1 回答 1

1

重要的是要意识到fit_resamples()它的目的是衡量绩效。您训练的模型fit_resamples()不会保留或以后使用。

假设您知道要用于 SVM 模型的参数。

library(tidymodels)
#> ── Attaching packages ─────────────────────────── tidymodels 0.1.1 ──
#> ✓ broom     0.7.0      ✓ recipes   0.1.13
#> ✓ dials     0.0.8      ✓ rsample   0.0.7 
#> ✓ dplyr     1.0.0      ✓ tibble    3.0.3 
#> ✓ ggplot2   3.3.2      ✓ tidyr     1.1.0 
#> ✓ infer     0.5.3      ✓ tune      0.1.1 
#> ✓ modeldata 0.0.2      ✓ workflows 0.1.2 
#> ✓ parsnip   0.1.2      ✓ yardstick 0.0.7 
#> ✓ purrr     0.3.4
#> ── Conflicts ────────────────────────────── tidymodels_conflicts() ──
#> x purrr::discard() masks scales::discard()
#> x dplyr::filter()  masks stats::filter()
#> x dplyr::lag()     masks stats::lag()
#> x recipes::step()  masks stats::step()

## pretend this is your training data
data("hpc_data")

svm_spec <- svm_poly(degree = 1, cost = 1/4) %>%
  set_engine("kernlab") %>%
  set_mode("regression")

svm_wf <- workflow() %>%
  add_model(svm_spec) %>%
  add_formula(compounds ~ .)

hpc_folds <- vfold_cv(hpc_data)

svm_rs <- svm_wf %>%
  fit_resamples(
    resamples = hpc_folds
  )

svm_rs
#> # Resampling results
#> # 10-fold cross-validation 
#> # A tibble: 10 x 4
#>    splits             id     .metrics         .notes          
#>    <list>             <chr>  <list>           <list>          
#>  1 <split [3.9K/434]> Fold01 <tibble [2 × 3]> <tibble [0 × 1]>
#>  2 <split [3.9K/433]> Fold02 <tibble [2 × 3]> <tibble [0 × 1]>
#>  3 <split [3.9K/433]> Fold03 <tibble [2 × 3]> <tibble [0 × 1]>
#>  4 <split [3.9K/433]> Fold04 <tibble [2 × 3]> <tibble [0 × 1]>
#>  5 <split [3.9K/433]> Fold05 <tibble [2 × 3]> <tibble [0 × 1]>
#>  6 <split [3.9K/433]> Fold06 <tibble [2 × 3]> <tibble [0 × 1]>
#>  7 <split [3.9K/433]> Fold07 <tibble [2 × 3]> <tibble [0 × 1]>
#>  8 <split [3.9K/433]> Fold08 <tibble [2 × 3]> <tibble [0 × 1]>
#>  9 <split [3.9K/433]> Fold09 <tibble [2 × 3]> <tibble [0 × 1]>
#> 10 <split [3.9K/433]> Fold10 <tibble [2 × 3]> <tibble [0 × 1]>

此输出中没有拟合模型。模型适合每个重采样,但您不想将它们用于任何事情;它们被丢弃是因为它们的唯一目的是计算.metrics估计性能。

如果您希望使用模型来预测新数据,则需要返回整个训练集并再次使用整个训练集拟合您的模型。

svm_fit <- svm_wf %>%
  fit(hpc_data)

svm_fit
#> ══ Workflow [trained] ═══════════════════════════════════════════════
#> Preprocessor: Formula
#> Model: svm_poly()
#> 
#> ── Preprocessor ─────────────────────────────────────────────────────
#> compounds ~ .
#> 
#> ── Model ────────────────────────────────────────────────────────────
#> Support Vector Machine object of class "ksvm" 
#> 
#> SV type: eps-svr  (regression) 
#>  parameter : epsilon = 0.1  cost C = 0.25 
#> 
#> Polynomial kernel function. 
#>  Hyperparameters : degree =  1  scale =  1  offset =  1 
#> 
#> Number of Support Vectors : 2827 
#> 
#> Objective Function Value : -284.7255 
#> Training error : 0.835421

reprex 包于 2020-07-17 创建(v0.3.0)

这个最终对象是您可以pull_workflow_fit()用于可变重要性或类似的对象。

于 2020-07-17T23:14:34.247 回答