如何从 Java 调用 scikit-learn 分类器?

新手上路,请多包涵

我有一个使用 Python 的 scikit-learn 训练的分类器。如何在 Java 程序中使用分类器?我可以使用 Jython 吗?有什么方法可以在 Python 中保存分类器并在 Java 中加载它?还有其他使用方法吗?

原文由 Thomas Johnson 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.7k
2 个回答

您不能使用 jython,因为 scikit-learn 严重依赖 numpy 和 scipy,它们具有许多已编译的 C 和 Fortran 扩展,因此无法在 jython 中工作。

在 java 环境中使用 scikit-learn 的最简单方法是:

  • 将分类器公开为 HTTP / Json 服务,例如使用微框架(如 烧瓶瓶子檐口)并使用 HTTP 客户端库从 java 调用它

  • 在 python 中编写命令行包装器应用程序,使用 CSV 或 JSON(或一些较低级别的二进制表示)等格式读取 stdin 上的数据并在 stdout 上输出预测,并使用 Apache Commons Exec 从 java 调用 python 程序。

  • 使 python 程序输出在拟合时学习的原始数值参数(通常作为浮点值数组)并在 java 中重新实现预测函数(这对于预测线性模型通常很容易,其中预测通常只是一个阈值点积) .

如果您还需要在 Java 中重新实现特征提取,最后一种方法将需要更多工作。

最后,您可以使用 Java 库(例如 Weka 或 Mahout)来实现您需要的算法,而不是尝试使用 Java 中的 scikit-learn。

原文由 ogrisel 发布,翻译遵循 CC BY-SA 3.0 许可协议

为此有一个 JPMML 项目。

首先,您可以直接从 python 使用 sklearn2pmml 库将 scikit-learn 模型序列化为 PMML(内部是 XML),或者先将其转储到 python 中,然后使用 java 中 的 jpmml-sklearn 或从该库提供的命令行进行转换。接下来,您可以加载 pmml 文件,反序列化并在 Java 代码中使用 jpmml-evaluator 执行加载的模型。

这种方式并非适用于所有 scikit-learn 模型,但适用于其中的 许多 模型。

正如一些评论者正确指出的那样,重要的是要注意 JPMML 项目是根据 GNU AGPL 获得许可的。 AGPL 是一个强大的 copyleft 许可证,它可能会限制您使用该项目的能力。其中一个例子可能是您开发了一项可公开访问的服务并希望保持源代码关闭。

原文由 Dmitry Spikhalskiy 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏