Tho*_*son 29 python java jython scikit-learn
我有一个使用Python的scikit-learn训练的分类器.如何使用Java程序中的分类器?我可以使用Jython吗?有没有办法在Python中保存分类器并在Java中加载它?还有其他方法可以使用它吗?
ogr*_*sel 46
你不能使用jython作为scikit-learn很大程度上依赖于numpy和scipy,它们有许多已编译的C和Fortran扩展,因此无法在jython中运行.
在java环境中使用scikit-learn的最简单方法是:
将分类器公开为HTTP/Json服务,例如使用诸如flask或bottle或cornice之类的微框架,并使用HTTP客户端库从java调用它
在python中编写一个命令行包装器应用程序,它读取stdin上的数据并使用某种格式(如CSV或JSON(或某些低级二进制表示))在stdout上输出预测,并使用Apache Commons Exec从java调用python程序.
使python程序输出在拟合时学习的原始数值参数(通常作为浮点值数组)并重新实现java中的预测函数(这通常很容易用于预测线性模型,其中预测通常只是一个阈值点积) .
如果您还需要在Java中重新实现特征提取,那么最后一种方法将会有更多工作.
最后,您可以使用诸如Weka或Mahout之类的Java库来实现您需要的算法,而不是尝试使用scikit-learn from Java.
Dmi*_*kiy 18
为此目的有JPMML项目.
首先,您可以直接从python 使用sklearn2pmml库将scikit-learn模型序列化为PMML(内部为XML),或者首先将其转储到python中,然后使用java中的jpmml-sklearn或此库提供的命令行进行转换.接下来,您可以在Java代码中使用jpmml-evaluator加载pmml文件,反序列化并执行加载的模型.
这种方式不适用于所有scikit-learn模型,但适用于其中许多模型.
您可以使用搬运工,我已经测试了 sklearn-porter ( https://github.com/nok/sklearn-porter ),它适用于 Java。
我的代码如下:
import pandas as pd
from sklearn import tree
from sklearn_porter import Porter
train_dataset = pd.read_csv('./result2.csv').as_matrix()
X_train = train_dataset[:90, :8]
Y_train = train_dataset[:90, 8:]
X_test = train_dataset[90:, :8]
Y_test = train_dataset[90:, 8:]
print X_train.shape
print Y_train.shape
clf = tree.DecisionTreeClassifier()
clf = clf.fit(X_train, Y_train)
porter = Porter(clf, language='java')
output = porter.export(embed_data=True)
print(output)
Run Code Online (Sandbox Code Playgroud)
就我而言,我使用的是 DecisionTreeClassifier,并且输出
打印(输出)
是以下代码作为控制台中的文本:
class DecisionTreeClassifier {
private static int findMax(int[] nums) {
int index = 0;
for (int i = 0; i < nums.length; i++) {
index = nums[i] > nums[index] ? i : index;
}
return index;
}
public static int predict(double[] features) {
int[] classes = new int[2];
if (features[5] <= 51.5) {
if (features[6] <= 21.0) {
// HUGE amount of ifs..........
}
}
return findMax(classes);
}
public static void main(String[] args) {
if (args.length == 8) {
// Features:
double[] features = new double[args.length];
for (int i = 0, l = args.length; i < l; i++) {
features[i] = Double.parseDouble(args[i]);
}
// Prediction:
int prediction = DecisionTreeClassifier.predict(features);
System.out.println(prediction);
}
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
27109 次 |
最近记录: |