Tribuo - 一个 Java 预测库 (v4.3)
Tribuo 是一个 Java 的机器学习库,提供多类分类、回归、聚类、异常检测和多标签分类功能。Tribuo 提供了流行的机器学习算法的实现,并且还包装了其他库以提供统一的接口。Tribuo 包含加载、特征化和转换数据的所有代码。此外,它还包括所有支持的预测类型的评估类。开发由 Oracle Labs 的机器学习研究组领导;我们欢迎社区贡献。
所有训练器都可以使用 OLCUT 配置系统进行配置。这允许用户在 xml 或 json 文件中定义训练器,并重复构建模型。每个提供的训练器的示例配置可以在每个包的 config 文件夹中找到。这些配置文件也可以使用适当的 OLCUT 配置依赖项编写成 json 或 edn。模型和数据集可以使用 Java 序列化进行序列化。
所有模型和评估都包含一个可序列化的来源对象,记录模型或评估的创建时间、数据的身份及其所使用的任何转换,以及训练器的超参数。在评估的情况下,此来源信息还包括所使用的具体模型。来源信息可以提取为 JSON,或直接使用 Java 序列化序列化。对于生产部署,可以编辑来源信息并用哈希值替代,以通过外部系统进行模型跟踪。许多 Tribuo 模型可以导出为 ONNX 格式,以便在其他语言、平台或云服务中部署。
Tribuo 在 Java 8+ 上运行,我们在 LTS 版本的 Java 以及最新发布版上进行测试。Tribuo 本身是一个纯 Java 库,支持所有 Java 平台;然而,我们的一些接口需要本地代码,因此仅在支持本地库的地方支持。我们在 Windows 10、macOS 和 Linux (RHEL/OL/CentOS 7+) 的 x86_64 架构上进行测试,因为这些是我们接口的本地库支持的平台。如果您对使用其他平台感兴趣并希望使用本地库接口(ONNX Runtime、TensorFlow 和 XGBoost),我们建议与这些库的开发人员联系。请注意,模型卡和可重复性包需要 Java 17,因此不包含在 tribuo-all
Maven 中心部署中。
文档
教程
教程笔记本,包括分类、聚类、回归、异常检测、TensorFlow、文档分类、列数据加载、与外部训练模型的工作和配置系统示例,可以在 tutorials 中找到。它们使用 IJava Jupyter 笔记本内核,适用于 Java 10+,除模型卡和可重复性教程需要 Java 17 外。要将教程代码转换回 Java 8,在大多数情况下,只需将 var
关键字替换为适当的类型。
算法
通用预测器
Tribuo 包括适用于广泛预测任务的几种算法的实现:
算法 | 实现 | 备注 |
---|---|---|
Bagging | Tribuo | 可以将任何 Tribuo 训练器作为基础学习器 |
随机森林 | Tribuo | 用于分类和回归 |
额外树 | Tribuo | 用于分类和回归 |
K-NN | Tribuo | 包括多种并行后端选项,以及单线程后端 |
神经网络 | TensorFlow | 通过 Tribuo 包装器在 TensorFlow 中训练神经网络。模型可以使用 ONNX 接口或 TF 接口部署 |
集成方法和 K-NN 使用组合函数来生成输出。组合器是预测任务特定的,但集成方法和 K-NN 实现是不依赖任务的。我们提供多类分类、多标签分类和回归任务的投票和平均组合器。
分类
Tribuo 有以下算法的实现或接口:
算法 | 实现 | 备注 |
---|---|---|
线性模型 | Tribuo | 使用 SGD 并允许任何梯度优化器 |
因子分解机 | Tribuo | 使用 SGD 并允许任何梯度优化器 |
CART | Tribuo | |
SVM-SGD | Tribuo | Pegasos 算法的实现 |
Adaboost.SAMME | Tribuo | 可以将任何 Tribuo 分类训练器作为基础学习器 |
多项式朴素贝叶斯 | Tribuo | |
正则化线性模型 | LibLinear | |
SVM | LibSVM 或 LibLinear | LibLinear 仅支持线性 SVM |
梯度提升决策树 | XGBoost |
Tribuo 还提供线性链 CRF 用于序列分类任务。该 CRF 使用 Tribuo 的任意梯度优化器通过 SGD 训练。
Tribuo 有一套信息论特征选择算法,可以应用于分类任务。特征输入自动离散化为等宽的桶。目前包括互信息最大化 (MIM)、条件互信息最大化 (CMIM)、最小冗余最大相关性 (mRMR) 和联合互信息 (JMI) 的实现。
为了解释分类器的预测,有一个 LIME 算法的实现。Tribuo 的实现允许混合使用文本和表格数据,并且可以使用任何稀疏模型作为解释器(例如回归树、lasso 等),但不支持图像。
回归
Tribuo 的回归算法默认是多维的。单维实现被包装以生成多维输出。
算法 | 实现 | 备注 |
---|---|---|
线性模型 | Tribuo | 使用 SGD 并允许任何梯度优化器 |
因子分解机 | Tribuo | 使用 SGD 并允许任何梯度优化器 |
CART | Tribuo | |
套索回归 | Tribuo | 使用 LARS 算法 |
弹性网络 | Tribuo | 使用坐标下降算法 |
正则化线性模型 | LibLinear | |
SVM | LibSVM 或 LibLinear | LibLinear 仅支持线性 SVM |
梯度提升决策树 | XGBoost |
聚类
Tribuo 包含聚类的基础设施,还提供两种聚类算法实现。我们预计随着时间的推移会实现更多的算法。
算法 | 实现 | 备注 |
---|---|---|
HDBSCAN* | Tribuo | 一种基于密度的算法,发现集群和异常点 |
K-Means | Tribuo | 包括顺序和并行后端,以及 K-Means++ 初始化算法 |
异常检测
Tribuo 提供异常检测任务的基础设施。我们预计随着时间的推移会增加新的实现。
算法 | 实现 | 备注 |
---|---|---|
单类 SVM | LibSVM | |
单类线性 SVM | LibLinear |
多标签分类
Tribuo 提供多标签分类的基础设施,以及一个将任何 Tribuo 的多类分类算法转换为多标签分类算法的包装器。我们预计随着时间的推移会增加更多专门的多标签实现。
算法 | 实现 | 备注 |
---|---|---|
独立包装器 | Tribuo | 通过为每个标签生成一个单独的分类器,将多类分类算法转换为多标签算法 |
分类器链 | Tribuo | 使用 Tribuo 的任何多类分类算法提供分类器链和随机分类器链集成 |
线性模型 | Tribuo | 使用 SGD 并允许任何梯度优化器 |
因子分解机 | Tribuo | 使用 SGD 并允许任何梯度优化器 |
接口
除了我们自己的机器学习算法实现,Tribuo 还提供了 JVM 上流行的机器学习工具的通用接口。如果你有兴趣贡献一个新接口,请打开 GitHub Issue,我们可以讨论它如何融入 Tribuo。
目前我们有以下接口:
- LibLinear - 通过 LibLinear-java 端口的原始 LibLinear (v2.44)。
- LibSVM - 使用原始 C++ 实现的纯 Java 转换版本 (v3.25)。
- ONNX Runtime - 通过我们团队贡献的 Java API (v1.12.1)。
- TensorFlow - 使用 TensorFlow Java v0.4.2 (基于 TensorFlow v2.7.4)。这允许完全在 Java 中训练和部署 TensorFlow 模型。
- XGBoost - 通过内置的 XGBoost4J API (v1.6.2)。
二进制文件
在 Maven Central 上可以找到二进制文件,使用 groupId org.tribuo
。要拉取所有与 Java 8 兼容的 Tribuo 组件,包括 TensorFlow、ONNX Runtime 和 XGBoost 的绑定(它们是本地库),使用:
Maven:
<dependency>
<groupId>org.tribuo</groupId>
<artifactId>tribuo-all</artifactId>
<version>4.3.1</version>
<type>pom</type>
</dependency>
或 Gradle:
implementation ("org.tribuo:tribuo-all:4.3.1@pom") {
transitive = true // for build.gradle (i.e., Groovy)
// isTransitive = true // for build.gradle.kts (i.e., Kotlin)
}
tribuo-all
依赖项是一个 pom,依赖于所有 Tribuo 子项目,除了需要 Java 17 的模型卡和可重复性项目。
大部分的Tribuo是纯Java编写的,因此具备跨平台特性,但有些接口链接到了使用本地代码的库。这些接口(TensorFlow、ONNX Runtime和XGBoost)仅在各自发布的二进制文件所支持的平台上运行,Tribuo无法控制提供哪些二进制文件。如果您需要支持特定平台,请联系这些项目的维护者。截至4.1版本,这些本地包均提供了适用于Windows、macOS和Linux的x86_64二进制文件。也可以为macOS ARM64(即Apple Silicon)编译每个包,但Maven Central上没有针对该平台的TensorFlow或XGBoost的二进制文件。截至4.3版本,Tribuo现在依赖于一个包含对macOS ARM64和Linux aarch64平台支持的ONNX Runtime版本。在ARM平台上开发时,您可以在Tribuo的pom.xml
中选择arm
配置文件来禁用本地库测试。
每个Tribuo模块的各个jar文件都会发布。最好仅依赖于特定项目所需的模块,这样可以防止您的代码不必要地引入像TensorFlow这样的大型依赖项。
从源码编译
Tribuo使用Apache Maven v3.5或更高版本进行构建。Tribuo兼容Java 8+,我们会在LTS版本的Java以及最新发布版本上进行测试。要进行构建,只需运行mvn clean package
。Tribuo的所有依赖项应该都可以在Maven Central上找到。如果遇到构建问题,请提交问题报告(不过请首先检查是否缺少Maven的代理设置,因为这是导致构建失败的常见原因,并且不在我们的控制范围内)。注意,如果您使用Java 16或以下版本进行构建,模型卡和可重复性包将被禁用。
仓库布局
开发是在main
分支上进行的,它的版本号后带有"-SNAPSHOT"的附加标记。Tribuo的重大和次要版本将在main
分支上标记,然后从该标记的版本提交中分支出一个名为vA.B.X-release-branch
(对于vA.B.0
发布)的分支,用于后续的点版本发布(即vA.B.1
、vA.B.2
等)。这些点版本将在特定的发布分支上标记,例如,v4.0.2
就在v4.0.X-release-branch
上标记。
贡献
我们欢迎贡献!请参阅我们的贡献指南。
我们有一个讨论邮件列表tribuo-devel@oss.oracle.com,档案在这里。我们正在调查实时聊天的不同选项,请以后再查看。对于错误报告、功能请求或其他问题,请提交Github问题。
安全
请参阅我们的安全指南以了解我们的负责任的安全漏洞披露流程。
许可证
Tribuo是在Apache 2.0许可证下授权的。
发行说明:
- v4.3.1 - 一些小的错误修复,特别是对CART树和Example.densify的修复,依赖项升级到更安全的版本。
- v4.3.0 - 支持模型卡、分类的特征选择、protobuf序列化格式、用于距离计算的kd树、稀疏线性模型的速度提升。大多数依赖项的版本升级,以及各种其他小的修复和改进。
- v4.2.2 - 小错误修复,TF-Java升级到0.4.2,jackson到2.13.4,protobuf-java到3.19.6,OpenCSV到5.7.1。
- v4.2.1 - 修复KMeans的多线程问题、影响ONNX导出和K-Means初始化的不确定迭代顺序问题,并升级TF-Java到0.4.1。
- v4.2.0 - 添加了因子分解机、分类器链、HDBSCAN。增加了ONNX导出和OCI Data Science集成。添加了可重复性框架。包括v4.1.1的回归修复在内的各种其他小的修复和改进。补充了剩余的javadoc,增加了4个新教程(onnx导出、多标签分类、可重复性、hdbscan),扩展了现有的教程。
- v4.1.1 - 修复了多输出回归、多标签评估、KMeans和使用SecurityManager的KNN的错误,并更新了TF-Java 0.4.0。
- v4.1.0 - 添加了TensorFlow训练支持、BERT特征提取器、ExtraTrees、K-Means++,许多线性模型和CRF性能改进,新的TF和文档分类教程。许多错误修复和文档改进。
- v4.0.2 - 许多错误修复(CSVDataSource、JsonDataSource、RowProcessor、LibSVMTrainer、Evaluations、Regressor序列化)。改进了javadoc和文档。增加了两个新教程(列数据和外部模型)。
- v4.0.1 - 修复了CSVReader以应对空行的错误,添加了IDXDataSource以允许加载原生MNIST格式的数据。
- v4.0.0 - 初始公开发布。
- v3 - 添加了源系统、外部模型支持和onnx集成。
- v2 - 从分类系统扩展,支持回归、聚类和多标签分类。
- v1 - 初始内部发布。该版本仅支持多类分类。