日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Java如何跨语言调用Python/R训练的模型

發布時間:2024/1/17 python 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java如何跨语言调用Python/R训练的模型 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在?如何使用sklearn進行在線實時預測(構建真實世界中可用的模型)?這篇文章中,我們使用 sklearn + flask 構建了一個實時預測的模型應用。無論是 sklearn 還是 flask,都是用 Python 編寫的,在工業界,我們經常會使用 Python 或 R 來訓練離線模型, 使用 Java 來做在線 Web 開發應用,這就涉及到了使用 Java 跨語言來調用 Python 或 R 訓練的模型。很明顯,之前方式就無法滿足要求了。

文章目錄?[展示]

PMML

概念

PMML 是 Predictive Model Markup Language 的縮寫,翻譯為中文就是“預測模型標記語言”。它是一種基于XML的標準語言,用于表達數據挖掘模型,可以用來在不同的應用程序中交換模型。也就是說它定義了一個標準,不同語言都可以根據這個標準來實現。關于 PMML 內部的實現原理細節,我們這里不做深究,感興趣的可以參見:http://dmg.org/pmml/v4-3/GeneralStructure.html

PMML 能做什么

介紹完了 PMML 的概念后,大家可能還是很懵逼,不清楚它有什么用。先來相對正式的說下它的用處:對于 PMML,使用一個應用程序很容易在一個系統上開發模型,并且只需通過發送XML配置文件就可以在另一個系統上使用另一個應用程序部署模型。也就是說我們可以通過 Python 或 R 訓練模型,將模型轉為 PMML 文件,再使用 Java 根據 PMML 文件來構建 Java 程序。來看一張關于 PMML 用途的圖片。

這一張圖的信息量爆炸我,我來一一說明下:

  • 整個流程分為兩部分:離線和在線。
  • 離線部分流程是將樣本進行特征工程,然后進行訓練,生成模型。一般離線部分常用 Python 中的 sklearn、R 或者 Spark ML 來訓練模型。
  • 在線部分是根據請求得到樣本數據,對這些數據采用與離線特征工程一樣的方式來處理,然后使用模型進行評估。一般在線部分常用 Java、C++ 來開發。
  • 離線部分與在線部分是通過 PMML 連接的,也就是說離線訓練好了模型之后,將模型導出為 PMML 文件,在線部分加載該 PMML 文件生成對應的評估模型。

我們可以看到,PMML 是連接離線與在線環節的關鍵,一般導出 PMML 文件和 加載 PMML 文件都需要各個語言來做單獨的實現。不過幸運的是,已經有很多大神實現了這些,可以參見:https://github.com/jpmml 。

實戰環節

訓練并導出 PMML

我們這里仍然是通過 sklearn 訓練一個隨機森林模型,我們需要借助 sklearn2pmml 將 sklearn 訓練的模型導出為 PMML 文件。如果沒有 sklearn2pmml,請輸入以下命令來安裝:

pip install --user git+https://github.com/jpmml/sklearn2pmml.git

Bash

我們來看下如何使用 sklearn2pmml 。

from sklearn.datasets import load_iris from sklearn.ensemble import RandomForestClassifier from sklearn2pmml import PMMLPipeline, sklearn2pmmliris = load_iris()# 創建帶有特征名稱的 DataFrame iris_df = pd.DataFrame(iris.data, columns=iris.feature_names)# 創建模型管道 iris_pipeline = PMMLPipeline([("classifier", RandomForestClassifier()) ])# 訓練模型 iris_pipeline.fit(iris_df, iris.target)# 導出模型到 RandomForestClassifier_Iris.pmml 文件 sklearn2pmml(iris_pipeline, "RandomForestClassifier_Iris.pmml")

Python

導出成功后,我們將在當前路徑看到一個 PMML 文件:RandomForestClassifier_Iris.pmml。

導入 PMML 并進行評估

生成了 PMML 文件后,接下來我們要做的就是使用 Java 導入(加載)PMML文件。這里借助了 Java 的第三方依賴:pmml-evaluator。我們需要在 pom.xml 文件中加入以下依賴:

<dependency><groupId>org.jpmml</groupId><artifactId>pmml-evaluator</artifactId><version>1.4.1</version> </dependency> <dependency><groupId>org.jpmml</groupId><artifactId>pmml-evaluator-extension</artifactId><version>1.4.1</version> </dependency>

Bash

引入 PMML 文件并進行評估的代碼如下:

import org.dmg.pmml.FieldName; import org.dmg.pmml.PMML; import org.jpmml.evaluator.*; import org.jpmml.model.PMMLUtil; import org.xml.sax.SAXException;import javax.xml.bind.JAXBException; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;public class ClassificationModel {private Evaluator modelEvaluator;/*** 通過傳入 PMML 文件路徑來生成機器學習模型** @param pmmlFileName pmml 文件路徑*/public ClassificationModel(String pmmlFileName) {PMML pmml = null;try {if (pmmlFileName != null) {InputStream is = new FileInputStream(pmmlFileName);pmml = PMMLUtil.unmarshal(is);try {is.close();} catch (IOException e) {System.out.println("InputStream close error!");}ModelEvaluatorFactory modelEvaluatorFactory = ModelEvaluatorFactory.newInstance();this.modelEvaluator = (Evaluator) modelEvaluatorFactory.newModelEvaluator(pmml);modelEvaluator.verify();System.out.println("加載模型成功!");}} catch (SAXException e) {e.printStackTrace();} catch (JAXBException e) {e.printStackTrace();} catch (FileNotFoundException e) {e.printStackTrace();}}// 獲取模型需要的特征名稱public List<String> getFeatureNames() {List<String> featureNames = new ArrayList<String>();List<InputField> inputFields = modelEvaluator.getInputFields();for (InputField inputField : inputFields) {featureNames.add(inputField.getName().toString());}return featureNames;}// 獲取目標字段名稱public String getTargetName() {return modelEvaluator.getTargetFields().get(0).getName().toString();}// 使用模型生成概率分布private ProbabilityDistribution getProbabilityDistribution(Map<FieldName, ?> arguments) {Map<FieldName, ?> evaluateResult = modelEvaluator.evaluate(arguments);FieldName fieldName = new FieldName(getTargetName());return (ProbabilityDistribution) evaluateResult.get(fieldName);}// 預測不同分類的概率public ValueMap<String, Number> predictProba(Map<FieldName, Number> arguments) {ProbabilityDistribution probabilityDistribution = getProbabilityDistribution(arguments);return probabilityDistribution.getValues();}// 預測結果分類public Object predict(Map<FieldName, ?> arguments) {ProbabilityDistribution probabilityDistribution = getProbabilityDistribution(arguments);return probabilityDistribution.getPrediction();}public static void main(String[] args) {ClassificationModel clf = new ClassificationModel("RandomForestClassifier_Iris.pmml");List<String> featureNames = clf.getFeatureNames();System.out.println("feature: " + featureNames);// 構建待預測數據Map<FieldName, Number> waitPreSample = new HashMap<>();waitPreSample.put(new FieldName("sepal length (cm)"), 10);waitPreSample.put(new FieldName("sepal width (cm)"), 1);waitPreSample.put(new FieldName("petal length (cm)"), 3);waitPreSample.put(new FieldName("petal width (cm)"), 2);System.out.println("waitPreSample predict result: " + clf.predict(waitPreSample).toString());System.out.println("waitPreSample predictProba result: " + clf.predictProba(waitPreSample).toString());}}

Java

輸出結果

加載模型成功! feature: [sepal length (cm), petal width (cm), sepal width (cm), petal length (cm)] waitPreSample predict result: 1 waitPreSample predictProba result: {0=0.0, 1=0.5, 2=0.5}

Bash

可以看到,模型需要的特征為:[sepal length (cm), petal width (cm), sepal width (cm), petal length (cm)],預測該樣本最終屬于目標編號為 1 的類型,預測該樣本屬于不同目標編號的概率分布,{0=0.0, 1=0.5, 2=0.5}。

小結

為了實現 Java 跨語言調用 Python/R 訓練好的模型,我們借助 PMML 的規范,將模型固化為 PMML 文件,再使用該文件生成模型來評估。

總結

以上是生活随笔為你收集整理的Java如何跨语言调用Python/R训练的模型的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。