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

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

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


属性:(), (, …), (用于模型的特征), ……
方法:(选择行), (选择特征), ……
获取帮助:
示例:
task$select(cols = setdiff(task$feature_names, "telephone"))
task

划分训练集、测试集:
set.seed(1)
split = partition(task, ratio = 0.7) # 默认stratify = TRUE, 按目标变量分层 得到训练集、测试集的索引(行号),分别在中。

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

获取帮助:
更多的学习器,可安装包。
# 选择随机森林分类学习器, 需要ranger包
learner = lrn("classif.ranger", num.trees = 100, predict_type = "prob")
learner

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

prediction = learner$predict(task, row_ids = split$test)
prediction

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

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

autoplot(prediction, type = "roc") # 绘制ROC曲线, 需要precrec包

prediction$score(msr("classif.auc")) # AUC面积

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

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

除了上面介绍过的之外,还有:
留一交叉验证("loo")
子抽样("subsampling")
样本内抽样("insample")
自定义抽样("custom")
自定义交叉验证抽样("custom_cv")
获取帮助:
cv10 = rsmp("cv", folds = 10) # 选择重抽样策略: 10折交叉验证 (1) 调试用:查看重抽样的效果
提供任务给重抽样对象的方法,则实例化重抽样对象:
cv10$instantiate(task) 可以查看:
cv10$iters # 数据副本数: 10

cv10$train_set(1) # 第1个数据副本的训练集索引(部分)

cv10$test_set(1) # 第1个数据副本的测试集索引

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

rr$score(msr("classif.acc")) # 各个重抽样的准确率

# 查看第1个数据副本(第1折)上的结果
rr$resampling$train_set(1) # 第1折的训练集索引(略)
rr$learners[[1]]$model # 第1折学习器的拟合模型

rr$predictions()[[1]] # 第1折的预测结果

rr$prediction() # 所有预测合并为一个预测对象(宏平均)

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

将上述基准"设计"交给,即执行基准测试:
bmr = benchmark(design) # 执行基准测试
# 汇总基准测试结果
bmr$aggregate(list(msr("classif.acc"), msr("classif.auc")))

# 可视化: 对比性能
autoplot(bmr, type = "roc") # ROC曲线

autoplot(bmr, measure = msr("classif.auc")) # AUC箱线图

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