前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java 开发玩转机器学习的利器:Tribuo

Java 开发玩转机器学习的利器:Tribuo

作者头像
程序猿DD
发布于 2025-06-09 13:30:47
发布于 2025-06-09 13:30:47
4200
代码可运行
举报
文章被收录于专栏:程序猿DD程序猿DD
运行总次数:0
代码可运行

1. 引言

机器学习(ML)和人工智能(AI)正在推动软件开发的变革!

作为一名Java开发者,如果要训练自己的预测模型,是不是第一想到的还是把Python拿起来?其实不一定非要拿起Python,在Java领域也有自己的生产级机器学习工具,它支持分类、回归、聚类等常见任务,还能无缝对接 TensorFlow 等框架,用 Java 就能直接训模型、做预测!它就是:Tribuo

Tribuo 是 Oracle 推出的面向生产环境的开源机器学习库,极大简化了健壮 ML 模型的构建与部署。与 Weka 和 Deeplearning4j 类似,Tribuo 支持多种机器学习任务,并能轻松集成到 Java 应用中。

本文我们将了解 Tribuo 支持的多种机器学习算法,并以 UCI 红葡萄酒质量数据集为例,构建一个用于预测葡萄酒质量的回归模型。

2. 什么是 Tribuo?

Tribuo 是一个以 Java 为核心的机器学习库,支持:

  • • 监督学习:如回归、分类等
  • • 无监督学习:如聚类

此外,Tribuo 拥有强类型特性,能够强制输入输出类型一致,有效防止运行时错误,确保模型开发过程的规范性。

它支持以 ONNX(开放神经网络交换)格式导入和导出模型,便于与 TensorFlow、PyTorch 等主流 ML 框架集成。

另一个亮点是 provenance(溯源)追踪功能,可记录数据集、模型参数和训练配置等元数据,提升透明度和可复现性。

随着 AI 在企业级 Java 应用中的普及,Tribuo 为在 Java 系统中直接嵌入智能行为提供了实用工具包。

3. 支持的机器学习算法

Tribuo 支持多种机器学习任务,包括:

  • • 分类:预测离散类别或标签。例如,预测一支足球队是否会获胜,或根据质量阈值将葡萄酒分为好或坏。
  • • 回归:预测连续值,如葡萄酒质量分数或患者胆固醇水平。
  • • 聚类:在无标签数据中识别分组。例如,可以根据酸度、酒精含量等化学属性对葡萄酒进行分组,而无需知道其质量分数。

4. 搭建 Tribuo 项目

我们将通过构建一个葡萄酒质量回归预测模型,体验 Tribuo 的实际应用。

首先,在 pom.xml 中添加Tribuo 依赖:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>org.tribuo</groupId>
    <artifactId>tribuo-all</artifactId>
    <version>4.3.2</version>
</dependency>

tribuo-all 依赖提供了加载和训练数据集所需的相关类。

下载UCI 红葡萄酒质量数据集:

https://archive.ics.uci.edu/dataset/186/wine+quality

放置到 src/main/resources/dataset 目录下。该数据集包含 11 个理化特征,如酸度和酒精含量:

quality 列是一个适合回归任务的连续数值。

最后,创建一个名为 WineQualityRegression 的类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class WineQualityRegression {
}

后续章节将在该类中实现训练和保存模型的相关逻辑。

5. 类级变量

接下来,定义如下类级变量:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public staticfinalStringDATASET_PATH="src/main/resources/dataset/winequality-red.csv";
publicstaticfinalStringMODEL_PATH="src/main/resources/model/winequality-red-regressor.ser";
public Model<Regressor> model;
public Trainer<Regressor> trainer;
public Dataset<Regressor> trainSet;
public Dataset<Regressor> testSet;

上述代码中,我们定义了数据集路径和训练模型保存/加载路径。

随后,定义了四个变量,分别代表:

  • • Model —— 存储预测模型的类
  • • Trainer —— 可训练预测模型的接口
  • • Dataset —— 用于训练的数据集类

此外,我们显式指定了模型输出类型为 Regressor

6. 加载与划分数据集

定义一个方法用于加载并划分数据集:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void createDatasets()throws Exception {
    RegressionFactoryregressionFactory=newRegressionFactory();
    CSVLoader<Regressor> csvLoader = newCSVLoader<>(';', CSVIterator.QUOTE, regressionFactory);
    DataSource<Regressor> dataSource = csvLoader.loadDataSource(Paths.get(DATASET_PATH), "quality");

    TrainTestSplitter<Regressor> dataSplitter = newTrainTestSplitter<>(dataSource, 0.7, 1L);
    trainSet = newMutableDataset<>(dataSplitter.getTrain());
    testSet = newMutableDataset<>(dataSplitter.getTest());
}

这里,我们用 CSVLoader 解析分号分隔的 CSV 文件并为回归任务做准备。RegressionFactory 用于创建回归输出,指定目标变量 quality 为连续变量。DataSource<Regressor> 保存解析后的数据。

随后,为了评估模型的泛化能力和表现,使用 TrainTestSplitter 将数据集按 7:3 划分为训练集和测试集。

7. 训练回归模型

由于葡萄酒质量分数为数值型,我们采用分类与回归树(CART)作为基学习器进行训练:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void createTrainer() {
    CARTRegressionTrainersubsamplingTree=newCARTRegressionTrainer(
      Integer.MAX_VALUE,
      AbstractCARTTrainer.MIN_EXAMPLES,
      0.001f,
      0.7f,
      newMeanSquaredError(),
      Trainer.DEFAULT_SEED
    );

    trainer = newRandomForestTrainer<>(subsamplingTree, newAveragingCombiner(), );
    model = trainer.train(trainSet); 
}

上述方法中,CARTRegressionTrainer 配置了无最大深度、每次分裂最少 6 个样本、以均方误差为分裂标准。随后,RandomForestTrainer 结合 10 棵 CART 决策树,并用 AveragingCombiner 平均预测结果。

train() 方法在 trainSet 数据集上训练模型,生成用于预测葡萄酒质量分数的 Model<Regressor>

8. 评估

接下来,使用 RegressionEvaluator 评估模型在数据集上的表现,计算相关指标:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void evaluate(Model<Regressor> model, String datasetName, Dataset<Regressor> dataset) {
    RegressionEvaluatorevaluator=newRegressionEvaluator();
    RegressionEvaluationevaluation= evaluator.evaluate(model, dataset);
    Regressordimension0=newRegressor("DIM-0", Double.NaN);

    log.info("MAE: " + evaluation.mae(dimension0));
    log.info("RMSE: " + evaluation.rmse(dimension0));
    log.info("R^2: " + evaluation.r2(dimension0));
}

RegressionEvaluator 用于评估模型在数据集上的表现。我们将 MAE(平均绝对误差)、RMSE(均方根误差)和 R^2(决定系数)输出到控制台。

随后,调用 evaluate() 方法评估模型和数据集:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void evaluateModels() throws Exception {
    log.info("Training model");
    evaluate(model, "trainSet", trainSet);

    log.info("Testing model");
    evaluate(model, "testSet", testSet);
}

执行程序后,训练集和测试集的评估结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
07:10:14.405 [main] INFO  tribuo.WineQualityRegression - Training model
07:10:14.406 [main] INFO  tribuo.WineQualityRegression - Results for trainSet---------------------
07:10:14.537 [main] INFO  tribuo.WineQualityRegression - MAE: 0.25025410332970005
07:10:14.537 [main] INFO  tribuo.WineQualityRegression - RMSE: 0.3422557198486092
07:10:14.538 [main] INFO  tribuo.WineQualityRegression - R^2: 0.8190947891297661
07:10:14.538 [main] INFO  tribuo.WineQualityRegression - Testing model
07:10:14.540 [main] INFO  tribuo.WineQualityRegression - Results for testSet---------------------
07:10:14.565 [main] INFO  tribuo.WineQualityRegression - MAE: 0.48711029366796743
07:10:14.565 [main] INFO  tribuo.WineQualityRegression - RMSE: 0.6584973595553575
07:10:14.565 [main] INFO  tribuo.WineQualityRegression - R^2: 0.3444460580874339

MAE 表示预测值与实际值的绝对差异,RMSE 表示预测值与实际值的平方差均值的平方根,R^2 表示模型对训练和测试数据方差的解释能力。

更低的 MAE 和 RMSE,以及更高的 R^2,意味着模型预测性能更优。

9. 保存模型

最后,将模型保存为文件以便后续复用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void saveModel()throws Exception {
    FilemodelFile=newFile(MODEL_PATH);
    try (ObjectOutputStreamobjectOutputStream=newObjectOutputStream(newFileOutputStream(modelFile))) {
        objectOutputStream.writeObject(model);
    }
}

上述代码通过 ObjectOutputStream 类将训练好的模型序列化保存到文件。这样,我们可以在后续预测中直接复用模型,无需重新训练

10. 方法调用

现在,在 main() 方法中调用前面创建的方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void main(String[] args) throws Exception {
    WineQualityRegression wineQualityRegression = new WineQualityRegression();

    wineQualityRegression.createDatasets();
    wineQualityRegression.createTrainer();
    wineQualityRegression.evaluateModels();
    wineQualityRegression.saveModel();
}

编译代码后,模型会被保存到指定目录。

11. 使用模型

新建一个 WinePredictor 类,在 main() 方法中加载已保存的模型:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class WineQualityPredictor {
    privatestaticfinalLoggerlog= LoggerFactory.getLogger(WineQualityPredictor.class);

    publicstaticvoidmain(String[] args)throws IOException, ClassNotFoundException {
        FilemodelFile=newFile("src/main/resources/model/winequality-red-regressor.ser");
        Model<Regressor> loadedModel = null;

        try (ObjectInputStreamobjectInputStream=newObjectInputStream(newFileInputStream(modelFile))) {
            loadedModel = (Model<Regressor>) objectInputStream.readObject();
        }
}

如前所述,Tribuo 对类型敏感,因此我们指定模型类型为 Regressor

通过创建 ObjectInputStream 并传入模型路径来加载模型。

然后,创建一个 ArrayExample 对象,表示单个葡萄酒样本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ArrayExample<Regressor> wineAttribute = new ArrayExample<Regressor>(new Regressor("quality", Double.NaN));
wineAttribute.add("fixed acidity", 7.4f);
wineAttribute.add("volatile acidity", 0.7f);
wineAttribute.add("citric acid", 0.47f);
wineAttribute.add("residual sugar", 1.9f);
wineAttribute.add("chlorides", 0.076f);
wineAttribute.add("free sulfur dioxide", 11.0f);
wineAttribute.add("total sulfur dioxide", 34.0f);
wineAttribute.add("density", 0.9978f);
wineAttribute.add("pH", 3.51f);
wineAttribute.add("sulphates", 0.56f);
wineAttribute.add("alcohol", 9.4f);

最后,使用 Prediction 类进行预测:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Prediction<Regressor> prediction = loadedModel.predict(wineAttribute);
double predictQuality = prediction.getOutput().getValues()[];
log.info("Predicted wine quality: " + predictQuality);

预测结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
07:31:05.772 [main] INFO  tribuo.WineQualityPredictor - Predicted wine quality: 5.028163673540464

12. 总结

在本文中,我们学习了 Tribuo 及其特性,了解了其支持的部分机器学习算法,并通过回归算法训练了葡萄酒质量预测模型。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-06-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序猿DD 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Soft PLC(软PLC)会成为未来的主流PLC吗?
Soft PLC(软PLC),这个概念提出也有一段时间了,早在2020年,我们开始做CODESYS相关课程的时候,就已经在使用软PLC了,到了现如今的工控领域,软PLC+EtherCAT主站能替换掉国内绝大部分的应用场景了。
Hello工控
2025/06/13
890
Soft PLC(软PLC)会成为未来的主流PLC吗?
CANopen转EtherCAT:倍福CX5140 PLC与CANopen从站的实时通信
在汽车制造行业,随着自动化程度的不断提高,生产线上的设备种类日益繁多,不同设备所采用的通信协议也各不相同。其中,EtherCAT协议凭借其高速、高精度的同步特性,在运动控制领域得到了广泛应用,如汽车组装线上的机械臂控制、高精度的伺服电机驱动等场景。而CANopen协议则以其成本低、可靠性高、通信距离适中的优势,在各类传感器、小型控制器等设备中大量使用,用于采集生产线上的各种状态信息,如温度、压力、位置等。
用户4307506
2025/06/11
980
CANopen转EtherCAT:倍福CX5140 PLC与CANopen从站的实时通信
(一)Modbus的前世今生:一个工业通信协议的传奇之旅
在工业自动化领域,有一个协议如同普通话般通用——它就是Modbus。诞生于1979年的Modbus,如今已走过40余年的历程,却依然活跃在工厂车间、楼宇自动化、能源管理等各个领域。今天,就让我们一起探寻这个经典工业通信协议的前世今生。
清风徐来春暖花开
2025/06/12
1460
(一)Modbus的前世今生:一个工业通信协议的传奇之旅
工业自动化网关在饮料行业中的应用:DeviceNet转Modbus RTU协议转换网关案例
工业自动化网关在饮料行业中的应用:DeviceNet转Modbus RTU协议转换网关案例
疆鸿智能
2025/06/11
470
工业自动化网关在饮料行业中的应用:DeviceNet转Modbus RTU协议转换网关案例
PROFINET至CANopen网关应用:基于西门子S7-1200和贝加莱X20的跨协议通信
某新能源电池制造企业,致力于锂电池的生产制造。其生产线规模庞大且复杂,涵盖了原材料搅拌、涂布、辊压、分切、卷绕、焊接、注液、检测等多个关键环节。在这条生产线上,不同的设备由不同的供应商提供,导致所采用的通信协议各不相同。其中,部分核心设备采用ROFINET协议进行通信,而一些执行机构和传感器则采用CANopen协议。这种协议的差异,使得设备之间无法直接进行高效的数据交互,严重制约了生产线的整体运行效率。
捷米特研发一部
2025/06/13
1030
PROFINET至CANopen网关应用:基于西门子S7-1200和贝加莱X20的跨协议通信
西门子PLC常用以太网通讯协议解析
"以太网通讯作为现在作为流行的通讯方式,广泛的应用在各行各业中,对于工业网络,以太网通讯也具有实时性高、抗干扰能力强、服务种类多等等的特点,西门子PLC 具有强大的以太网通讯功能,针对不同的应用也支持种类繁多的通讯协议,对于实际工程应用如何选择合适的通讯协议呢?本次视频会针对开放的以太网通讯协议TCP、UDP、iso-on-tcp 的协议特点帮助大家分析协议的利弊,方便工程师合理选择通讯协议。
科控物联
2022/03/29
2.6K0
西门子PLC常用以太网通讯协议解析
最全的PLC通讯协议解析之EtherCAT篇(1)
根据各位朋友的投票,《您最想了解的PLC通讯协议有哪些?》投票排名第一的依然是EtherCAT总线通讯协议。之所以能排第一,我想通过下面的一些列文章介绍,答案自然不言而喻。《您最想了解的PLC通讯协议有哪些?》投票结果和最全的PLC通讯协议解析及例程分享计划
Hello工控
2024/06/25
4530
最全的PLC通讯协议解析之EtherCAT篇(1)
当西门子PLC遇到了python
随着工业自动化和信息化的不断发展,PLC(可编程逻辑控制器)已经成为工业自动化领域中不可或缺的关键设备。而在与 PLC 进行通讯时,Python 作为一种功能强大的编程语言,也越来越受到工程师们的青睐。因为 Python 在科技计算、数据处理、可视化等方面有着优秀的表现,并且通过 Python 与 PLC 进行通讯也是一种高效、灵活的手段。本次我们将介绍如何使用 Python 与西门子 PLC 进行通讯的方法和注意事项,掌握这种技能将有助于在工业控制及信息化方面有所应用,具有广泛的应用前景。
剑指工控
2023/08/31
9780
当西门子PLC遇到了python
最全的PLC通讯协议解析之EtherCAT篇(2)
我们上期讨论了EtherCAT定义、市场节点及具体计划。 最全的PLC通讯协议解析之EtherCAT篇(1) 我们这期讨论:EtherCAT和EtherNet。
Hello工控
2024/06/25
6050
最全的PLC通讯协议解析之EtherCAT篇(2)
最全的PLC通讯协议解析之EtherCAT篇(4)
我们先回顾上几期的内容: 1.EtherCAT概述:最全的PLC通讯协议解析之EtherCAT篇(1) 2.EtherCAT与EtherNet:最全的PLC通讯协议解析之EtherCAT篇(2) 3.EtherCAT运行机制:最全的PLC通讯协议解析之EtherCAT篇(3) 我们这期重点讨论:EtherCAT同步性(分布式时钟)
Hello工控
2024/06/25
1.3K0
最全的PLC通讯协议解析之EtherCAT篇(4)
最全的PLC通讯协议解析之EtherCAT篇(6)
我们先回顾上几期的内容: 1.EtherCAT概述:最全的PLC通讯协议解析之EtherCAT篇(1) 2.EtherCAT与EtherNet:最全的PLC通讯协议解析之EtherCAT篇(2) 3.EtherCAT运行机制:最全的PLC通讯协议解析之EtherCAT篇(3) 4.EtherCAT同步性(分布式时钟):最全的PLC通讯协议解析之EtherCAT篇(4) 5.EtherCAT性能:最全的PLC通讯协议解析之EtherCAT篇(5)
Hello工控
2024/06/25
4490
最全的PLC通讯协议解析之EtherCAT篇(6)
最全的PLC通讯协议解析之EtherCAT篇(5)
我们先回顾上几期的内容: 1.EtherCAT概述:最全的PLC通讯协议解析之EtherCAT篇(1) 2.EtherCAT与EtherNet:最全的PLC通讯协议解析之EtherCAT篇(2) 3.EtherCAT运行机制:最全的PLC通讯协议解析之EtherCAT篇(3) 4.EtherCAT同步性(分布式时钟):最全的PLC通讯协议解析之EtherCAT篇(4)
Hello工控
2024/06/25
4380
最全的PLC通讯协议解析之EtherCAT篇(5)
从Ethernet到TSN:实时通信一小步,工业4.0一大步
如今,许多工业自动化应用对于延迟的要求非常严格,以满足实时数据传输的需求。但是,现有的大部分自动化控制解决方案都是基于传统的以太网实现的,而且各大厂商还研发了一些附加的技术机制,从而导致了很多协议都不兼容。
SDNLAB
2019/05/07
2.1K0
从Ethernet到TSN:实时通信一小步,工业4.0一大步
使用 Python 通过 ModbusTCP 连接 PLC(不限品牌 含示例程序)
在现代工业自动化系统中,PLC(Programmable Logic Controller,可编程逻辑控制器)被广泛应用于监控和控制各种设备和过程。而与之配套的通信协议也是至关重要的。其中,Modbus TCP 协议作为一种常见的通信协议,被广泛应用于工业领域。
剑指工控
2023/08/31
2.7K0
使用 Python 通过 ModbusTCP 连接 PLC(不限品牌 含示例程序)
Modbus TCP vs. EtherNet/IP
关于Modbus TCP,我们在介绍Modbus协议时已经详细介绍过,Modbus TCP 的物理层也是以太网。
Hello工控
2024/09/29
6060
Modbus TCP vs. EtherNet/IP
【MODBUS】Modbus协议和PLC协议的区别和联系
Modbus协议和PLC协议是两个不同的概念,它们有一些区别和联系。以下是它们的主要区别和联系:
帐篷Li-物联网布道师
2024/03/20
6920
你敢信!!!用MQTT来采集PLC数据
开源日记
2024/06/27
7950
你敢信!!!用MQTT来采集PLC数据
工业以太网Industrial Ethernet有多少种?
回顾下最开始的投票,即针对PLC通讯协议《您最想了解的PLC通讯协议有哪些?》,我们初步的结果如下:
Hello工控
2024/09/06
3250
工业以太网Industrial Ethernet有多少种?
SCADA和DCS的区别
笔者对于讨论SCADA和DCS的区别这一主题有些不知如何下笔,原因在于不论是SCADA(1970年前后)还是DCS(1975年)其实都是应用非常成熟的技术,思考用什么样的“新瓶”来装“旧酒”,能够让各位知友看完后能够有所收获。考虑到知友不一定是自动化专业人士,本文尝试用读研究生时写学术论文所用到的起承转合的方法,综述性的分这四个维度来展开。
科控物联
2022/03/29
2.7K0
SCADA和DCS的区别
什么是Profinet?
投票大部分朋友选择不是,当然这个问题实际上本身有些问题。如果说Profinet是不是一种基于EtherNet的技术,我想这个答案是确定的。
Hello工控
2024/08/16
2060
什么是Profinet?
推荐阅读
相关推荐
Soft PLC(软PLC)会成为未来的主流PLC吗?
更多 >
LV.1
这个人很懒,什么都没有留下~
目录
  • 1. 引言
  • 2. 什么是 Tribuo?
  • 3. 支持的机器学习算法
  • 4. 搭建 Tribuo 项目
  • 5. 类级变量
  • 6. 加载与划分数据集
  • 7. 训练回归模型
  • 8. 评估
  • 9. 保存模型
  • 10. 方法调用
  • 11. 使用模型
  • 12. 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档