用交叉验证评估模型表现

在 R 中使用 tidymodels 建模

David Svancer

Data Scientist

训练集与测试集

 

创建训练集与测试集是建模的第一步

  • 防止过拟合
    • 训练集用于拟合模型
    • 测试集用于评估模型

 

缺点

  • 只有一次模型表现估计

 

将数据划分为训练集与测试集的示意图

在 R 中使用 tidymodels 建模

K 折交叉验证

用于探索模型表现的重采样技术

  • 在拟合过程中提供 K 次模型表现估计

 

将数据划分为训练集与测试集

在 R 中使用 tidymodels 建模

K 折交叉验证

用于探索模型表现的重采样技术

  • 在拟合过程中提供 K 次模型表现估计
  • 将训练数据随机划分为 K 个大小相近的集合
  • 使用这些折执行 K 次拟合与评估

 

将训练数据划分为交叉验证折

在 R 中使用 tidymodels 建模

使用交叉验证进行机器学习

执行 5 折交叉验证

  • 进行五次模型训练与评估

 

五折交叉验证的第 1 次迭代

在 R 中使用 tidymodels 建模

使用交叉验证进行机器学习

执行 5 折交叉验证

  • 进行五次模型训练与评估
  • 第 1 次迭代
    • 第 1 折用于评估,第 2–5 折用于训练

 

五折交叉验证的第 1 次迭代

在 R 中使用 tidymodels 建模

使用交叉验证进行机器学习

执行 5 折交叉验证

  • 进行五次模型训练与评估
  • 第 1 次迭代
    • 第 1 折用于评估,第 2–5 折用于训练
  • 第 2 次迭代
    • 第 2 折用于评估

 

五折交叉验证的第 2 次迭代

在 R 中使用 tidymodels 建模

使用交叉验证进行机器学习

执行 5 折交叉验证

  • 进行五次模型训练与评估
  • 第 1 次迭代
    • 第 1 折用于评估,第 2–5 折用于训练
  • 第 2 次迭代
    • 第 2 折用于评估

 

共得到五个模型表现估计

 

五折交叉验证的第 5 次迭代

在 R 中使用 tidymodels 建模

创建交叉验证折

vfold_cv() 函数

  • 训练数据
  • 折数 v
  • 分层变量 strata
  • 为可复现性在 vfold_cv() 前执行 set.seed()
  • splits
    • 列表列,包含用于创建折的数据拆分对象
set.seed(214)
leads_folds <- vfold_cv(leads_training,

v = 10,
strata = purchased)
leads_folds
#  10-fold cross-validation using stratification 
# A tibble: 10 x 2
   splits            id    
   <list>            <chr> 
 1 <split [896/100]> Fold01
 2 <split [896/100]> Fold02
 3 <split [896/100]> Fold03
 . ................  ......
 9 <split [897/99]>  Fold09
10 <split [897/99]>  Fold10
在 R 中使用 tidymodels 建模

用交叉验证训练模型

fit_resamples() 函数

  • 训练 parsnip 模型或 workflow 对象
  • 提供交叉验证折,resamples
  • 可选自定义度量函数 metrics
    • 默认包含准确率与 ROC AUC

 

每个度量估计 10 次

  • 每折一次估计
  • 平均值在 mean
leads_rs_fit <- leads_wkfl %>%

fit_resamples(resamples = leads_folds,
metrics = leads_metrics)
leads_rs_fit %>% collect_metrics()
# A tibble: 3 x 5
  .metric .estimator  mean     n std_err
  <chr>   <chr>      <dbl> <int>   <dbl>
1 roc_auc binary     0.823    10  0.0147
2 sens    binary     0.786    10  0.0203
3 spec    binary     0.855    10  0.0159
在 R 中使用 tidymodels 建模

交叉验证结果明细

collect_metrics() 函数

  • 传入 summarize = FALSE 可返回每个折的全部度量估计
  • 共 30 个组合(3 个度量 × 10 折)
    • .metric 列标识度量
    • .estimate 列给出每折的估计值
rs_metrics <- leads_rs_fit %>% 
  collect_metrics(summarize = FALSE)

rs_metrics
# A tibble: 30 x 4
   id     .metric .estimator .estimate
   <chr>  <chr>   <chr>          <dbl>
 1 Fold01 sens    binary         0.861
 2 Fold01 spec    binary         0.891
 3 Fold01 roc_auc binary         0.885
 4 Fold02 sens    binary         0.778
 5 Fold02 spec    binary         0.969
 6 Fold02 roc_auc binary         0.885
# ... with 24 more rows
在 R 中使用 tidymodels 建模

汇总交叉验证结果

collect_metrics() 返回 tibble

  • 可用 dplyr 汇总结果
    • rs_metrics 开始
    • .metric 分组
    • summarize() 计算统计量
rs_metrics %>%

group_by(.metric) %>%
summarize(min = min(.estimate), median = median(.estimate), max = max(.estimate), mean = mean(.estimate), sd = sd(.estimate))
# A tibble: 3 x 6
 .metric   min  median   max   mean     sd
  <chr>   <dbl>  <dbl>  <dbl>  <dbl>   <dbl>
1 roc_auc 0.758  0.806  0.885  0.823   0.0466
2 sens    0.667  0.792  0.861  0.786   0.0642
3 spec    0.810  0.843  0.969  0.855   0.0502
在 R 中使用 tidymodels 建模

交叉验证方法论

fit_resamples() 训练的模型无法对新数据给出预测

  • predict() 不接受重采样结果对象

fit_resample() 的用途

  • 探索并比较不同模型类型的表现
  • 选出表现更优的模型类型并集中进行拟合
predict(leads_rs_fit,
        new_data = leads_test)

Error in UseMethod("predict") : 
  no applicable method for 'predict' applied to 
  an object of class 
  "c('resample_results', 
      'tune_results',  
      'tbl_df', 
      'tbl', 'data.frame')"
在 R 中使用 tidymodels 建模

让我们做交叉验证吧!

在 R 中使用 tidymodels 建模

Preparing Video For Download...