欢迎光临散文网 会员登陆 & 注册

【R机器学习:mlr3verse技术手册】1 基础知识

2022-11-27 16:22 作者:张敬信老师  | 我要投稿

0 前言

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

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

mlr

caret

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

mlr3verse包(首推):面向对象

tidymodels包:tidyverse一脉相承

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

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

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

图片
图1 mlr3verse最新生态

加载包:

几点技术说明:

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

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

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

1 基础知识

1.1 R6类:面向对象

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

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

图片
图2 学习器对象
  • 访问属性: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 学习器:封装算法

图片
图3 学习器工作流

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

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

图片

获取帮助:?Learner

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

图片

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

图片

图片

1.4 性能评估

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

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

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

图片

获取帮助:?Measure

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

图片
图片
图片

1.5 重抽样

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

机器学习传统的数据划分:训练集+测试集,就是对数据的一种重抽样:留出法("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)样本。

图片

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

  • 留一交叉验证("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(),即执行基准测试:

参考文献

  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


【R机器学习:mlr3verse技术手册】1 基础知识的评论 (共 条)

分享到微博请遵守国家法律