Python の scikit-learn を使用してトレーニングした分類器があります。Java プログラムから分類子を使用するにはどうすればよいですか? Jython を使用できますか? 分類子を Python に保存して Java にロードする方法はありますか? 他の使い方はありますか?
6 に答える
scikit-learn は numpy と scipy に大きく依存しているため、jython を使用することはできません。これには、多くのコンパイル済み C および Fortran 拡張機能が含まれているため、jython では機能しません。
Java 環境で scikit-learn を使用する最も簡単な方法は次のとおりです。
分類子を HTTP / Json サービスとして公開します。たとえば、フラスコ、ボトル、コーニスなどのマイクロフレームワークを使用して、HTTP クライアント ライブラリを使用して Java から呼び出します。
標準入力でデータを読み取り、CSV や JSON (または下位レベルのバイナリ表現) などの形式を使用して標準出力で予測を出力するコマンドライン ラッパー アプリケーションを Python で作成し、たとえばApache Commons Execを使用して Java から Python プログラムを呼び出します。
Python プログラムが適合時に学習した生の数値パラメーターを (通常は浮動小数点値の配列として) 出力し、Java で予測関数を再実装します (これは通常、予測がしきい値処理されたドット積であることが多い予測線形モデルでは簡単です)。 .
最後のアプローチは、Java でも機能抽出を再実装する必要がある場合、より多くの作業が必要になります。
最後に、Java から scikit-learn を使用する代わりに、必要なアルゴリズムを実装する Weka や Mahout などの Java ライブラリを使用できます。
ポーターを使用することもできます。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)
私の場合、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);
}
}
}