1 重采样
在前两篇推文里,我们都将原始数据随机划分为训练集和测试集,其中训练集用于模型训练,测试集用于模型评估。划分训练集和测试集的操作叫重采样(resampling)。
1.1 重采样方法
重采样有许多方法,如留出法(holdout)、k折交叉验证(k-fold cross-validation)、子采样法(subsampling)、自举法(bootstrap)等。已经介绍的partition()
函数使用的就是留出法。
mlr3
内置的重采样方法可在mlr_resamplings
中查看:
library(mlr3)
mlr_resamplings
## <DictionaryResampling> with 9 stored values
## Keys: bootstrap, custom, custom_cv, cv, holdout, insample, loo,
## repeated_cv, subsampling
将其转换成表格可查看重采样方法的参数:
as.data.table(mlr_resamplings)
## key label params iters
## 1: bootstrap Bootstrap ratio,repeats 30
## 2: custom Custom Splits NA
## 3: custom_cv Custom Split Cross-Validation NA
## 4: cv Cross-Validation folds 10
## 5: holdout Holdout ratio 1
## 6: insample Insample Resampling 1
## 7: loo Leave-One-Out NA
## 8: repeated_cv Repeated Cross-Validation folds,repeats 100
## 9: subsampling Subsampling ratio,repeats 30
下面简述几种重采样方法及其差异:
- 留出法是将样本按一定比例随机分为测试集和训练集(默认2:1);
- k折交叉验证是将样本等分为𝑘份(默认10份),每次使用𝑘−1份作为测试集,剩余1份作为训练集,因此会训练出𝑘个中间模型;
- 留一法交叉验证是交叉验证的特例,它的𝑘等于样本量𝑛,因此每次测试集只有1个样本;
- 子采样法相当于将留出法重复多次(默认30次),因此也会训练出多个中间模型;它与k折交叉验证的区别是,不同测试集会有重叠;
- 自举法与子采样法的区别是,在抽取训练集样本时使用的是有放回抽样,因此一个样本可能会在训练集中多次出现;自举法的抽样也可以重复多次(默认30次),因此也会训练出多个中间模型。
每种重采样方法的官方帮助文档都可在mlr
包的mlr_resamplings_*
条目查看,其中*
为重采样方法的名称,如mlr_resamplings_holdout
。
关于交叉验证方法还可参考如下推文:
1.2 执行重采样
对学习任务执行重采样分为两个步骤,涉及两个函数。第一步是构建重采样方法,使用rsmp()
函数;第二步是将重采样方