如何在基于 Java/JVM 的应用程序中拟合和评分机器学习模型

how to fit and score a machine learning models in Java/JVM based application

能否请您指导我如何创建和执行机器学习 models/statistical 模型(回归、决策树、K 表示聚类、朴素贝叶斯、scorecard/linear/logistic 回归等和 GBM、GLM ) 在基于 Java/JVM 的应用程序中(在生产中)。

我们有一种基于 Java 的 ETL 产品,可以在其中完成机器学习的大部分数据准备步骤,例如从 JDBC、文件、HDFS 中提取数据,没有 SQL 等,连接和聚合等(这是特征工程所必需的),现在我们想使用机器 learning/statistical 建模来添加分析功能。

现在,我们正在使用 JPMML- 评估器对使用 R 和 python(以及 Knime)以 PMML 格式创建的模型进行评分,但它需要三个独立且不相关的步骤:- 1- 在我们的 Java/JVM 应用程序中准备数据的第一步,并将采样数据(训练和测试)数据保存在 csv 文件或数据库中,- 2- 在 R 和 python(和 Knime)中创建机器学习模型并以 PMML 4.2 格式导出它 - 3- Import/deploy 我们基于 Java 的应用程序中的 PMML,并使用 JPMML 评估器在生产中执行它。

我确信这是机器学习中的一个常见问题,因为通常在生产中 JAVA 比 Python 或 R 更受欢迎。你能建议什么是更好的创建方法吗?在基于 JVM 的应用程序中执行基于 python/scikit 的机器学习模型。

您认为如何在基于 JVM 的应用程序中更无缝地实现步骤 #2 和 #3,同时又不影响性能和可用性:-

1- 调用内部调用 python scikit script (under the hood) to create a model in PMML 的 java 程序,然后使用 JPMML 求值器。它会向用户假装他在一个基于 JVM 的应用程序中(更好的可用性)。我不确定使用 PMML 的局限性和缺点是什么,因为 jpmml-sklearn 并非支持所有功能。 2- 调用一个 java 程序,该程序在内部调用 python 脚本并在外部 python 环境中创建和执行模型,并将模型和结果序列化到 file/csv 或内存数据库(或缓存,如 hazelcast),父 Java 应用程序将从那里获取结果等。我研究过我不能使用 Jython 来执行 Sci-kit 模型。 3- 我可以使用 Jep(在 Java 中嵌入 Python)在 JVM 中嵌入 Cpython 吗?有人试过 sci-kit 模型吗?

或者,我应该探索在基于 JVM 的应用程序中使用基于 Mahout 或 weka - java 的机器学习库。 (我需要同时支持 windows 和非 windows 平台)

我也在探索基于 java 的 H2Oai。有人试过吗

如果您有带 HDFS 后端的 ETL,我建议在集群上部署 Spark 并使用 Spark 的 MLib 机器学习算法。他们支持你上面提到的方法。

您介意提供一些有关您计划使用的数据的大小(行、列、类型)的背景信息吗? Java 不是我推荐的 ML 转到语言,但 Scala 编译为 JVM 字节码并且具有与 java 相似的语法(除了具有 Java API)。

如果您要进行概念验证,那么 Java 没问题,但如果您打算使用大数据,它的扩展性就不太好。

我已经为我的问题找到了一个不错的解决方案。我正在使用在 Java 中开发的 H2O.ai 用于使用开源的可扩展机器学习。它在 Java (Restful API)、Python、R 和 Scala 中提供 APIs。它具有 class 算法中最好的 class 化、回归、集群等算法,并且如果有人拥有 Spark 集群,它还可以与 Apache Hadoop 和 Spark(气泡水)无缝集成。它还提供了一种基于多层前馈人工神经网络的深度学习算法。我正在使用 Java 绑定 API/Rest API 有时使用低级 H2o API(用于 h2o 3 节点集群管理)。

我遇到了另一个基于 java 的替代方案,称为 Smile - 统计机器智能和学习引擎,它提供回归、class化、聚类、关联规则挖掘、特征选择等. 有人对这些或类似的基于 Java 的 ML 库有更多反馈吗?

我将 IntelliJ IDEA 与 python 插件一起使用。这样我在同一个项目中同时拥有 java 和 python 代码。数据在数据库中;该连接始终可见且可访问,与我当前在编辑器中是否有 .java 或 .py 文件无关。在配置列表中,您可以有 Python 个脚本、Java 个应用程序、maven 目标等。 因此,我认为您不必将 Python 和 Java 代码混合在一起(通过从 Java 中调用 Python 脚本)。那是完全没有必要的。

我的工作流程是(IntelliJ IDEA 中的所有内容): 1.准备数据(通常是SQL) 2. 运行 python 脚本,它将转换器管道应用于从某个数据库 table 构造的 pandas 数据框并输出 PMML。 3. 在您的 java 应用程序中使用 scikit-learn 模型。