1. 背景介绍
1.1简介
Julia新推出了一个超高纯度的机器学习框架MLJ,团队希望把MLJ打造成一个灵活的、用于组合和调整机器学习模型、具备高性能、快速开发的框架。Julia团队之所以推出MLJ,部分原因也是受到MLR的影响。
1.2开源地址
2. MLJ特性
2.1 MLJ特性:
Learning networks:超越传统Pipeline的灵活模型组合
- 自动调参。自动调整超参数,包括复合模型。调整实现为与其他元算法组合的模型包装器
- 同质模型集成
- 模型元数据的注册表。无需加载模型代码元数据即可用。“任务”界面的基础并促进模型组合
- 任务界面。自动将模型与指定的学习任务相匹配,以简化基准测试和模型选择
- 清爽的概率接口。改进了对贝叶斯统计和概率图形模型的支持
- 数据容器不可知。以用户自己喜欢的Tables.jl格式显示和操作数据
- 普遍采用分类数据类型。使模型实现能够正确地考虑训练中看到的类而不是评估中的类
注:团队还计划在不久的将来继续增强特性,包括Flux.jl深度学习模型的集成,以及使用自动微分的连续超参数的梯度下降调整。
2.2 MLJ优势,对比ScikitLearn.jl
scikit-learn是一个非常强大的机器学习Python库,基本包含了所有机器学习的方式,涵盖了数据预处理到训练模型的各个方面,可以极大的节省代码量。Julia已经有了一个很棒的机器学习工具箱ScitkitLearn.jl,为Julia用户提供了对成熟且庞大的机器学习模型库的访问,那为什么我要抛弃ScitkitLearn.jl用MLJ呢?
1. MLJ纯
ScitkitLearn.jl最初是用作流行的python库scikit-learn的Julia包装器,对要求性能的例程又封装了C代码元算法仍然是python代码,纯度太低,而MLJ则完全用Julia实现,速度可以与C媲美。
同时,这种单一语言的设计提供了卓越的互操作性。例如,可以使用自动微分库(例如Flux.jl)实现:(i)超参数的梯度下降调整; (ii)使用CuArrays.jl,GPU性能提升而无需重大代码重构。
2. 模型元数据的注册表
在ScikitLearn.jl中,必须从文档中收集可用模型的列表,以及模型元数据(模型是否处理分类输入,是否可以进行概率预测等)。在MLJ中,这些信息更加结构化,MLJ可通过外部模型注册表访问(无需加载模型)。这形成了“任务”界面的基础,并促进了模型组合。
3. 任务界面
一旦MLJ用户指定“任务”(例如,“基于特征x,y,z进行房屋价值的概率预测”),MLJ就可以自动搜索、匹配该任务的模型,从而协助系统基准测试和模型选择。
4. 灵活的API
scikit-learn中的Pipeline更像是一种亡羊补牢的做法。相比之下,MLJ的用户交互API基于灵活的“learning network”API的要求,该API允许模型以基本上任意的方式连接(包括目标变换和逆变换)。在作为独立模型导出之前,可以分阶段构建和测试网络。
网络具有“智能”训练,即在参数更改后仅重新训练必要的组件;并且最终将使用DAG调度程序进行训练。在Julia的元编程功能的帮助下,构建通用架构(如线性pipeline和堆栈)将是单线操作。
5. 清爽的概率API
scikit-learn API没有为概率预测的形式指定通用标准。通过沿着skpro项目的路线修复概率API,MLJ旨在改进对贝叶斯统计和概率图形模型的支持。
6. 普遍采用分类数据类型
Python的科学数组库NumPy没有用于表示分类数据的专用数据类型,即没有跟踪所有可能类的池的类型。scikit-learn模型的解决之道是将数据重新标记为整数。
Julia团队宣称当用户在重新标记的分类数据上训练模型之后,由于分类特征出现了在训练中未观察到的值,导致代码崩溃。而MLJ则通过坚持使用分类数据类型,并坚持MLJ模型实现保留类池来缓解此类问题。例如,如果训练目标包含池中实际上不出现在训练集中的类,则概率预测将预测其支持包括缺失类但但是以概率零适当加权的分布。
3. MLJ资源
- Github地址:https://github.com/alan-turing-institute/MLJ.jl
- 视频介绍:https://www.youtube.com/watch?v=CfHkjNmj1eE
- Demo-构建一个自动调参的随机森林:https://github.com/alan-turing-institute/MLJ.jl/blob/master/examples/random_forest.ipynb
- dacker镜像:https://github.com/ysimillides/mlj-docker
- MLJ界面示例:https://alan-turing-institute.github.io/MLJ.jl/dev/adding_models_for_general_use/