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

2022-09-01 06:30:06

我有一个分类器,我使用Python的scikit-learn进行训练。如何从 Java 程序使用分类器?我可以使用 Jython 吗?有没有办法在Python中保存分类器并将其加载到Java中?有没有其他方法来使用它?


答案 1

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

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

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

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

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

最后一种方法将是更多的工作,如果你也需要在Java中重新实现功能提取。

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


答案 2

有用于此目的的 JPMML 项目。

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

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