【R机器学习:mlr3verse技术手册】1 基础知识
张敬信老师
2022年11月27日 16:22
收录于文集
共7篇

0 前言

  • 曾经:R中各个机器学习算法,都是单独的包实现,没有统一接口,不方便使用

  • 过去:整合机器学习算法的包:

  • 现在:新一代整合机器学习算法的包,也是上面两个的进化版:

包(首推):面向对象

包:一脉相承

- 模型(工业)部署:包、

是最新、最先进的机器学习框架,它基于面向对象语法和 底层数据流(速度超快),支持并行,支持搭建“图”流学习器,理念非常先进、功能非常强大。

整合了各种机器学习算法包,实现了统一、整洁的机器学习流程化操作,足以媲美机器学习库。

图1 mlr3verse最新生态

加载包:

代码块
R
自动换行
复制代码
library(mlr3verse)
复制成功

几点技术说明:

  • 使用帮助:?对象名字,比如?ResampleResult,或对象的$help()方法,比如 learner$help()

  • 一些对象结果并不是数据框,as.data.table()转化为数据框再使用;

  • 学习器超参数的帮助,需要找到原包算法的函数帮助。

1 基础知识

1.1 R6类:面向对象

类,新一代面向对象语法:真正面向对象,支持继承、引用语法。

将数据、方法绑定到一个对象,例如学习器对象:

图2 学习器对象

  • 访问属性:Learner$param_set

  • 调用方法:Learner$train()

1.2 任务:封装数据

任务是对表格数据的封装,自变量称为特征,因变量称为目标或结果变量。

  • 目标决定了机器学习的“任务”:

- 连续目标,就是回归

- 离散目标,就是分类

- 无目标,无监督学习(聚类、降维)

生态下还有若干特殊任务:生存分析任务、密度估计任务、时空分析任务、有序分析任务、函数分析任务、多标签分类任务、成本敏感分类任务、聚类任务。

代码块
R
自动换行
复制代码
tsks()       # 查看所有自带任务
复制成功

创建任务:

代码块
R
自动换行
复制代码
dat = tsk("german_credit")$data()
task = as_task_classif(dat, target = "credit_risk")
task
复制成功

属性:), , …), (用于模型的特征), ……

方法:(选择行), (选择特征), ……

获取帮助:

示例:

代码块
R
自动换行
复制代码
task$select(cols = setdiff(task$feature_names, "telephone"))
task
复制成功

  • 划分训练集、测试集:

代码块
R
自动换行
复制代码
set.seed(1)
split = partition(task, ratio = 0.7)    # 默认stratify = TRUE, 按目标变量分层
复制成功

得到训练集、测试集的索引(行号),分别在中。

1.3 学习器:封装算法

图3 学习器工作流

机器学习有很多种算法,如决策树、支持向量机等,往往来自不同的包,函数接口各异,不易于统一学习和使用。

将算法封装在学习器中,提供了统一的方便接口,算法实现整合自相应的算法包(需要安装)。

代码块
R
自动换行
复制代码
lrns()    # 查看所有自带的学习器名字
复制成功

获取帮助:

更多的学习器,可安装包。

代码块
R
自动换行
复制代码
# 选择随机森林分类学习器, 需要ranger包

learner = lrn("classif.ranger", num.trees = 100, predict_type = "prob")

learner
复制成功

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

代码块
R
自动换行
复制代码
learner$train(task, row_ids = split$train)
learner$model
复制成功

代码块
R
自动换行
复制代码
prediction = learner$predict(task, row_ids = split$test)
prediction
复制成功

1.4 性能评估

训练集上训练好的模型性能如何,需要这样来检验:

  • 将模型用到测试集(不能与训练集有交集,否则会有数据泄露)得到预测值;

  • 选择一种合适的性能度量指标,来度量预测值与真实值相差多少。

代码块
R
自动换行
复制代码
msrs()       # 查看所有支持的性能度量指标
复制成功

获取帮助:

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

代码块
R
自动换行
复制代码
prediction$score(msr("classif.acc"))      # 准确率
复制成功

代码块
R
自动换行
复制代码
autoplot(prediction, type = "roc")    # 绘制ROC曲线, 需要precrec包
复制成功

代码块
R
自动换行
复制代码
prediction$score(msr("classif.auc"))      # AUC面积
复制成功

1.5 重抽样

重抽样就是对数据集重复抽样,得到数据集的若干副本。

机器学习传统的数据划分:训练集+测试集,就是对数据的一种重抽样:留出法("holdout&#​34;)

留出法最简单,只得到了数据集的一个副本,所以只能做一次“拟合模型+模型预测+评估性能”。

一次考试就决定最终成绩,存在偶然性显然是不够科学的,因此有必要从数据集抽样出多个副本,以做多次“拟合模型+模型预测+评估性能”,取平均性能作为最终成绩。

k 折交叉验证("cv&#​34;),就是这种重抽样的代表:

图4 10折交叉验证示意图

10 折交叉验证是将数据集随机分成 10 份,分别以其中 1 份为测试集,其余 9 份为训练集,组成 10 组数据:训练 10 个模型+做 10 次模型预测+评估 10 次模型性能,取平均作为最终模型性能。

k 折交叉验证,还可以重复做 m 次( m×k 个副本),叫做重复 k 折交叉验证("repeated_cv&#​34;)。

Bootstrap(自助)重抽样(多用于统计学习中计算统计量),是从包含 n 个观测的原数据集随机可重复抽样 n 个观测,得到分析数据是有重复的,未被抽取到的观测作为评估数据,也称为“袋外”(out-of-bag)样本。

代码块
R
自动换行
复制代码
rsmps()         # 查看所有支持的重抽样方法
复制成功

除了上面介绍过的之外,还有:

获取帮助:

代码块
R
自动换行
复制代码
cv10 = rsmp("cv", folds = 10)   # 选择重抽样策略: 10折交叉验证
复制成功

(1) 调试用:查看重抽样的效果

提供任务给重抽样对象的方法,则实例化重抽样对象:

代码块
R
自动换行
复制代码
cv10$instantiate(task)
复制成功

可以查看:

代码块
R
自动换行
复制代码
cv10$iters         # 数据副本数: 10
复制成功

代码块
R
自动换行
复制代码
cv10$train_set(1)   # 第1个数据副本的训练集索引(部分)
复制成功

代码块
R
自动换行
复制代码
cv10$test_set(1)   # 第1个数据副本的测试集索引
复制成功

(2) 使用重抽样

重抽样是创建了若干个数据副本,使用它们就是分别在每个数据副本上:“拟合模型+模型预测+评估性能”,我们关心的是这些评估性能的平均性能。当然若有需要,每个数据副本上的模型和性能结果都可以保存和取用。

函数来实现,需要提供任务、学习器、重抽样方法,若要保存每个数据副本上的模型和性能结果,需设置参数

代码块
R
自动换行
复制代码
rr = resample(task, learner, cv10, store_models = TRUE)
复制成功

返回对象已包含所有结果,有专门方法访问和取用:

代码块
R
自动换行
复制代码
rr$aggregate(msr("classif.acc"))    # 所有重抽样的平均准确率
复制成功

代码块
R
自动换行
复制代码
rr$score(msr("classif.acc"))        # 各个重抽样的准确率
复制成功

代码块
R
自动换行
复制代码
# 查看第1个数据副本(第1折)上的结果
rr$resampling$train_set(1)       # 第1折的训练集索引(略)
rr$learners[[1]]$model           # 第1折学习器的拟合模型
复制成功

代码块
R
自动换行
复制代码
rr$predictions()[[1]]    # 第1折的预测结果
复制成功

代码块
R
自动换行
复制代码
rr$prediction()        # 所有预测合并为一个预测对象(宏平均)
复制成功

1.6 基准测试

机器学习中有一个常见的场景是,比较多个机器学习算法的性能。这在框架下,叫做基准测试

基准测试(),用来比较不同学习器(算法)、在多个任务(数据)和/或不同重抽样策略(多个数据副本)上的平均性能表现。

基准测试时有一个关键问题是,测试的公平性,即每个算法的每次测试必须在相同的重抽样训练集拟合模型,在相同的重抽样测试集评估性能。这些事情 函数会自动帮你做好。

首先,需要用创建一个基准测试的"设计&#​34;,即你想执行的设置表,是多个任务、学习器、重抽样的所有唯一值组合。

举例来看:

  • 选取一个自带的二分类任务

  • 选取多个学习器:决策树、KNN、随机森林、支持向量机(因为要计算AUC值,预测类型需要改为 "prob&#​34;

  • 创建基准测试“设计”(每个学习器不能只凭一次结果,采用5折交叉验证的平均结果)

  • 查看性能指标:准确率、AUC

  • 箱线图展示AUC值的对比结果

代码块
R
自动换行
复制代码
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
复制成功

将上述基准"设计&#​34;交给,即执行基准测试:

代码块
R
自动换行
复制代码
bmr = benchmark(design)            # 执行基准测试
# 汇总基准测试结果
bmr$aggregate(list(msr("classif.acc"), msr("classif.auc")))
复制成功

代码块
R
自动换行
复制代码
# 可视化: 对比性能
autoplot(bmr, type = "roc")                  # ROC曲线
复制成功

代码块
R
自动换行
复制代码
autoplot(bmr, measure = msr("classif.auc"))  # AUC箱线图
复制成功

参考文献

  1. 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