【R机器学习:mlr3verse技术手册】1 基础知识
0 前言
曾经:
R
中各个机器学习算法,都是单独的包实现,没有统一接口,不方便使用过去:整合机器学习算法的包:
- mlr
包
- caret
包
现在:新一代整合机器学习算法的包,也是上面两个的进化版:
- mlr3verse
包(首推):面向对象
- tidymodels
包:tidyverse
一脉相承
- 模型(工业)部署:vetiver
包、plumber
包
mlr3verse
是最新、最先进的R
机器学习框架,它基于面向对象R6
语法和 data.table
底层数据流(速度超快),支持future
并行,支持搭建“图”流学习器,理念非常先进、功能非常强大。
mlr3verse
整合了各种机器学习算法包,实现了统一、整洁的机器学习流程化操作,足以媲美Python
的scikit-learn
机器学习库。

加载包:
几点技术说明:
使用帮助:
?对象名字
,比如?ResampleResult
,或对象的$help()
方法,比如learner$help()
一些对象结果并不是数据框,
as.data.table()
转化为数据框再使用;学习器超参数的帮助,需要找到原包算法的函数帮助。
1 基础知识
1.1 R6类:面向对象
R6
类,R
新一代面向对象语法:真正面向对象,支持继承、引用语法。
将数据、方法绑定到一个对象,例如学习器对象:

访问属性:
Learner$param_set
调用方法:
Learner$train()
1.2 任务:封装数据
任务是对表格数据的封装,自变量称为特征,因变量称为目标或结果变量。
目标决定了机器学习的“任务”:
- 连续目标,就是回归;
- 离散目标,就是分类;
- 无目标,无监督学习(聚类、降维)
mlr3
生态下还有若干特殊任务:生存分析任务、密度估计任务、时空分析任务、有序分析任务、函数分析任务、多标签分类任务、成本敏感分类任务、聚类任务。
创建任务:


属性:$nrow, $ncol, $row_roles
($use, $holdout, $early_stopping
), $col_roles
($feature, $target
, …), $feature_names
(用于模型的特征), ……
方法:$data(), $set_row_roles(), $set_col_roles(), $filter()
(选择行), $select()
(选择特征), ……
获取帮助:?Task
示例:

划分训练集、测试集:
得到训练集、测试集的索引(行号),分别在split$train、split$test
中。
1.3 学习器:封装算法

机器学习有很多种算法,如决策树、支持向量机等,往往来自不同的包,函数接口各异,不易于统一学习和使用。
mlr3
将算法封装在学习器中,提供了统一的方便接口,算法实现整合自相应的算法包(需要安装)。

获取帮助:?Learner
更多的学习器,可安装mlr3extralearners
包。

学习器$model
属性为NULL
,用$train()
方法在训练数据上训练模型,模型结果将存入$model
(可取用,一般与原包函数返回值一致),再用$predict()
方法在测试数据上做预测,得到结果是Prediction
对象。


1.4 性能评估
训练集上训练好的模型性能如何,需要这样来检验:
将模型用到测试集(不能与训练集有交集,否则会有数据泄露)得到预测值;
选择一种合适的性能度量指标,来度量预测值与真实值相差多少。

获取帮助:?Measure
有二/多分类度量、回归度量、聚类度量等,选择一种性能度量指标,比如准确率,用预测对象的$score()
方法,计算该度量指标的得分:



1.5 重抽样
重抽样就是对数据集重复抽样,得到数据集的若干副本。
机器学习传统的数据划分:训练集+测试集,就是对数据的一种重抽样:留出法("holdout")。
留出法最简单,只得到了数据集的一个副本,所以只能做一次“拟合模型+模型预测+评估性能”。
一次考试就决定最终成绩,存在偶然性显然是不够科学的,因此有必要从数据集抽样出多个副本,以做多次“拟合模型+模型预测+评估性能”,取平均性能作为最终成绩。
k 折交叉验证("cv"),就是这种重抽样的代表:

10 折交叉验证是将数据集随机分成 10 份,分别以其中 1 份为测试集,其余 9 份为训练集,组成 10 组数据:训练 10 个模型+做 10 次模型预测+评估 10 次模型性能,取平均作为最终模型性能。
k 折交叉验证,还可以重复做 m 次( m×k 个副本),叫做重复 k 折交叉验证("repeated_cv")。
Bootstrap(自助)重抽样(多用于统计学习中计算统计量),是从包含 n 个观测的原数据集随机可重复抽样 n 个观测,得到分析数据是有重复的,未被抽取到的观测作为评估数据,也称为“袋外”(out-of-bag)样本。

除了上面介绍过的之外,还有:
留一交叉验证("loo")
子抽样("subsampling")
样本内抽样("insample")
自定义抽样("custom")
自定义交叉验证抽样("custom_cv")
获取帮助:?Resampling
(1) 调试用:查看重抽样的效果
提供任务给重抽样对象的$instantiate()
方法,则实例化重抽样对象:
可以查看:



(2) 使用重抽样
重抽样是创建了若干个数据副本,使用它们就是分别在每个数据副本上:“拟合模型+模型预测+评估性能”,我们关心的是这些评估性能的平均性能。当然若有需要,每个数据副本上的模型和性能结果都可以保存和取用。
用resample()
函数来实现,需要提供任务、学习器、重抽样方法,若要保存每个数据副本上的模型和性能结果,需设置参数store_models = TRUE
:
返回ResampleResult
对象已包含所有结果,有专门方法访问和取用:





1.6 基准测试
机器学习中有一个常见的场景是,比较多个机器学习算法的性能。这在mlr3verse
框架下,叫做基准测试。
基准测试(benchmark
),用来比较不同学习器(算法)、在多个任务(数据)和/或不同重抽样策略(多个数据副本)上的平均性能表现。
基准测试时有一个关键问题是,测试的公平性,即每个算法的每次测试必须在相同的重抽样训练集拟合模型,在相同的重抽样测试集评估性能。这些事情benchmark()
函数会自动帮你做好。
首先,需要用benchmark_grid()
创建一个基准测试的"设计",即你想执行的设置表,是多个任务、学习器、重抽样的所有唯一值组合。
举例来看:
选取一个自带的二分类任务
选取多个学习器:决策树、
KNN
、随机森林、支持向量机(因为要计算AUC
值,预测类型需要改为"prob"
)创建基准测试“设计”(每个学习器不能只凭一次结果,采用5折交叉验证的平均结果)
查看性能指标:准确率、
AUC
值箱线图展示
AUC
值的对比结果

将上述基准"设计"交给benchmark()
,即执行基准测试:



参考文献
Marc Becker et al. mlr3book. 2022.

我正在写一本《R机器学习:基于mlr3verse》的书,其中的mlr3verse
技术篇草稿,欢迎您的阅读品鉴和转发扩散(但禁止用于任何出版)!
想提前学习本书内容,也可以关注我的 2023年寒假“R机器学习(基于mlr3verse)”培训班,邀请函链接:提取码:xxul
https://pan.baidu.com/s/1_SaYPebqhnXoxDT8W9tjJA?pwd=xxul
另外,我在第15届中国R会上做的报告,相当于是 mlr3verse
技术手册 的整体略讲:
张敬信 第15届R会报告-R机器学习:mlr3verse核心工作流https://www.zhihu.com/zvideo/1579758441576534016
讲座 PPT 以及 R机器学习:mlr3verse技术手册,可到我的 Gitee/Github下载:
https://gitee.com/zhjx19/rconf15
https://github.com/zhjx19/RConf15