mlr3book :https://mlr3book.mlr-org.com/intro.html
1.介绍和概述
(Machine Learning in R) mlr3 (Lang 等人,2019) 包及其生态系统为 R 语言 (R Core Team,2019) 提供了一个通用、面向对象和可扩展的框架,用于回归(附录 C)、分类(第 2.4 节)和其他机器学习任务(第 8 章)。这个统一的接口提供了功能,可以扩展和组合现有的机器学习算法(学习器(第 2.2 节)),智能地选择和调整适合给定机器学习任务的最合适技术(附录 C),并执行大规模比较,从而实现元学习。这些高级功能的示例包括超参数调整(第 4 章)和特征选择(第 5 章)。许多操作的并行化得到了本地支持(第 9.1 节)。
mlr3 的整体目标类似于 caret、tidymodels、Python 的 scikit-learn1,以及 Julia 的 MLJ2。通常情况下,mlr3 的设计旨在提供比其他机器学习框架更多的灵活性,同时仍然提供使用高级功能的简单方法。特别是,虽然 tidymodels 使执行简单的机器学习任务非常容易,但 mlr3 更适用于高级机器学习。如果想快速了解如何在 mlr3verse 中完成任务,请参阅 mlr3 cheatsheets3。
mlr3 为 R 中现有的学习器提供了统一的接口。除了一些例外,我们不会自己实现任何学习器,尽管我们经常增强底层学习器提供的功能。特别是,这包括为调整定义超参数空间
1.1 目标受众
我们假定 mlr3 的用户已经学习过机器学习入门课程或者具备等同的专业知识,并且有一些 R 基础经验。计算机科学或统计学背景有助于理解本书后面章节描述的高级功能,但不是必需的。对于新手来说,(James et al. 2014) 提供了全面的机器学习入门介绍。
mlr3 提供了一个领域特定语言(DSL),用于在 R 中进行机器学习,它能够从简单的练习到复杂的项目应对一切。我们的目标对象既包括想要快速应用机器学习算法的从业者,也包括想要在结构化环境中实现、评估和比较新方法的研究人员。
1.2 从mlr到mlr3
mlr 包(Bischl et al. 2016)于2013年首次发布到CRAN4,其核心设计和架构远在更早的时期就开始了。随着时间的推移,许多功能的添加使得其设计变得更加复杂,这使得构建、维护和扩展变得更加困难。事后看来,我们意识到 mlr 中的一些设计和架构选择使得支持新功能变得困难,特别是在机器学习流程方面。此外,在 mlr 最初设计之后,R 生态系统和诸如 data.table 等有用的包已经发生了重大变化。因此,我们决定开发一个全新的包,即 mlr3,以满足不断增长的需求,并更好地适应现代 R 生态系统的变化。
在原有的mlr设计中,整合所有这些变化是不可能的。因此,我们决定在2018年开始重新实现,最终在2019年7月推出了mlr3的首个版本。
mlr3的新设计以及进一步整合和新开发的R包(特别是R6、future和data.table)使其比原来的mlr更易于使用、维护和在许多方面更高效。生态系统中的包之间的联系不再那么紧密,使它们更易于维护和开发,特别是非常专业的包。
1.3 设计原则
1.3 设计原则
本节内容可能不是所有读者都感兴趣。
在 mlr3 包和 mlr3verse 生态系统中,我们遵循以下一般设计原则:
计算和表现的分离。mlr3 生态系统的大多数包都专注于数据处理和转换、应用机器学习算法以及计算结果。我们的核心包不提供图形用户界面(GUI),因为它们的依赖关系会使安装变得复杂,特别是在服务器上。出于同样的原因,数据和结果的可视化是在额外的包 mlr3viz 中提供的,该包避免了对 ggplot2 的依赖。mlr3shiny 则提供了使用 shiny 包进行一些基本机器学习任务的界面。
面向对象编程(OOP)。采用 R6 进行干净、面向对象的设计、对象状态更改和引用语义。
表格数据。采用 data.table,它具有一流的计算性能以及可以进一步轻松处理的表格数据作为数据结构。
统一输入和输出数据格式。这大大简化了 API,并允许轻松选择和“拆分-应用-合并”(聚合)操作。我们将 data.table 和 R6 结合起来,将非原子和复合对象的引用放在表中,并大量使用列表列。
防御性编程和类型安全。所有用户输入都经过 checkmate(Lang 2017)检查。我们记录返回类型,并避免在基本 R 中流行的“简化”结果的机制(例如 sapply() 或用于索引数据.frame 的 drop 参数)。此外,我们还拥有广泛的单元测试!
依赖性较少。对于 mlr 来说,主要的维护负担之一是跟踪它所依赖的许多包的学习者接口和行为的变化。我们在 mlr3 中需要较少的包以使安装和维护更容易。我们仍然提供相同的功能,但将其拆分为更多包,每个包都具有较少的依赖性。正如上面提到的,这尤其适用于所有可视化功能,它们包含在一个单独的包中,以避免所有其他包中的不必要依赖性。
1.4 包生态系统
mlr3 依赖于以下流行和经过良好验证的包,这些包不是由 mlr3 核心成员开发的:
R6:在 mlr3 中主要使用的类系统。
data.table:高性能的 R 数据框扩展。
digest:密码哈希函数。 uuid:生成通用唯一标识符。
lgr:高度可配置的日志记录库。
mlbench 和 palmerpenguins:更多的机器学习数据集。
evaluate:用于捕获输出、警告和异常 (第 9.2 节)。
-
future / future.apply:用于并行化 (第 9.1 节)。
mlr3 包本身提供了 mlr3verse 中其余部分所依赖的基础功能和机器学习的基本构建块。图 1.1 显示了 mlr3verse 中的包,这些包扩展了 mlr3 的预处理、流水线、可视化、额外的学习器、额外的任务类型等功能。
我们使用 R6 进行面向对象编程,并使用 data.table 存储和操作表格数据。这两个包都是 mlr3 的核心,我们为初学者简要介绍这两个包。虽然深入了解这些包并不是必需的,但需要基本理解才能有效地使用 mlr3。
1.5 R6入门指南
R6是R中较新的面向对象编程范例之一,它解决了R中早期OO实现(如mlr中使用的S3)的缺点。如果您以前做过面向对象编程,R6应该很熟悉。我们重点介绍您需要了解的R6部分,以便有效地使用mlr3。
对象通过调用R6::R6Class()对象的构造函数来创建,具体来说是初始化方法$new()。例如,foo = Foo$new(bar = 1)创建了一个新的Foo类对象,将构造函数的bar参数设置为值1。
对象具有可变状态,该状态封装在它们的字段中,可以通过美元符号操作符进行访问。我们可以通过foo$bar访问foo变量中的bar值,并通过分配字段来设置其值,例如foo$bar = 2。
除了字段之外,对象还公开了方法,允许检查对象的状态、检索信息或执行更改对象内部状态的操作。例如,一个学习器的$train()方法通过构建和存储模型来改变学习器的内部状态,然后可以用于进行预测。
对象可以有公共和私有字段和方法。公共字段和方法定义了与对象交互的API。私有方法只有在您想要扩展mlr3(例如使用新的学习器)时才相关。
从技术上讲,R6对象是环境,因此具有引用语义。例如,foo2 = foo不会在foo2中创建foo的副本,而是创建另一个引用指向同一实际对象。设置foo$bar = 3也会将foo2$bar更改为3,反之亦然。
要复制对象,请使用$clone()方法和deep = TRUE参数进行嵌套对象的深复制,例如foo2 = foo$clone(deep = TRUE)。
1.6 data.table入门指南
包data.table实现了R中存储表格数据的流行替代方案,即一个对象。我们决定使用data.table,因为它运行速度非???,可以很好地扩展到更大的数据。
注意: 许多mlr3函数返回data.table,可以方便地对其进行子集处理或与其他输出进行组合。如果您不喜欢这种语法或更喜欢其他工具,基本的data.frame或tibble/dplyrs只需要一个as.data.frame()或as_tibble()转换即可。
可以使用data.table()函数(其界面类似于data.frame())构造数据表,也可以通过使用as.data.table()函数将对象转换为数据表。
library("data.table")
dt = data.table(x = 1:6, y = rep(letters[1:3], each = 2))
dt
data.table可以像data.frame一样使用,但它们提供了额外的功能,使得复杂操作更容易。例如,可以使用 [ 运算符按组对数据进行汇总:
dt[, mean(x), by = "y"]
y V1
1: a 1.5
2: b 3.5
3: c 5.5
1.7 重要的mlr3实用工具
Sugar函数 mlr3中的大多数对象都可以通过称为Sugar函数的便捷函数创建。它们提供了常见代码习惯的快捷方式,减少了用户需要编写的代码量。本书中我们大量使用Sugar函数,并给出了完整的“全称”以获得完整的细节。在大多数情况下,Sugar函数将实现您想要执行的操作,只有在编写自定义对象或扩展时才需要考虑使用完整的R6代码。例如,lrn(“regr.rpart”)是LearnerRegrRpart $ new()的Sugar版本。
字典 mlr3使用字典来存储学习器或任务等对象。这些是键值存储,允许将键与值关联起来,值可以是R6对象,就像纸质字典将单词与它们的定义关联起来一样。通常,通过Sugar函数访问字典中的值,这些函数自动使用适用的字典,而无需用户指定;只需要指定要检索的键即可。字典用于分组相关对象,以便可以轻松地列出和检索它们。例如,可以直接从mlr_learners字典中使用键“classif.featureless”检索学习器(mlr_learners $ get(“classif.featureless”)),并且可以使用as.data.table(mlr_learners)获取所有存储的学习器的概述。
mlr3viz mlr3viz是mlr3生态系统中所有绘图功能的包。该包使用常见主题(ggplot2 :: theme_minimal()),使所有生成的图表具有类似的美学。在幕后,mlr3viz使用ggplot2。mlr3viz扩展了fortify和autoplot,用于与Prediction,Learner和Benchmark对象一起使用的常见mlr3输出(这些对象将在下一章中介绍和涵盖)。 mlr3viz的最常见用法是autoplot()函数,其中传递的对象类型决定了绘图类型?;嫱祭嘈图锹荚诳赏ü??autoplot.X访问的各自手册页面中。例如,可以通过运行?autoplot.TaskRegr找到回归任务的图表文档。