2016-06-12 78 views
4

可否請你指導我如何創建並執行一個機器學習模型/統計模型(迴歸,決策樹,K均值聚類,樸素貝葉斯,記分卡/線性/邏輯迴歸等和GBM,GLM)在基於Java/JVM的應用程序(在生產中)。如何適應和用Java/JVM基於應用的得分機器學習模型

我們有一種基於Java的ETL產品,可以完成大部分數據機器學習的準備步驟,如從JDBC,文件,HDFS,無SQL等數據提取,連接和聚合等(需要對於特徵工程),現在我們想要使用機器學習/統計建模來添加分析功能。

現在,我們使用JPMML評估器對使用R和python(以及Knime)在PMML格式中創建的模型進行評分,但它需要三個獨立且未連接的步驟: - 1-在我們的Java中進行數據準備的第一步/ JVM應用程序並將採樣數據(訓練和測試)數據保存在csv文件或數據庫中, - 2-在R和python(和Knime)中創建機器學習模型並將其導出爲PMML 4.2格式 - 3-導入/在基於Java的應用程序中部署PMML,並使用JPMML評估器在生產環境中執行。

我確定這是機器學習中的常見問題,因爲通常在生產中JAVA比Python或R更受歡迎。您能否建議什麼是更好的方法來創建以及執行基於python/scikit的機器學習模型在基於JVM的應用程序中。

什麼是您認爲實現的步驟#2,#3更無縫地在基於JVM的應用程序,而不會影響性能和可用性: -

1調用Java程序,它在內部調用python scikit script(下引擎蓋)到create a model in PMML,然後使用JPMML評估器。它會假裝用戶他在單個基於JVM的應用程序(更好的可用性)。我不確定使用PMML會有什麼侷限性和缺點,因爲並非所有功能都在jpmml-sklearn中受支持。調用一個內部調用python腳本的java程序,並在外部python環境中執行模型創建和執行,並將模型和結果序列化到文件/ csv或內存數據庫(或緩存,如hazelcast)從那裏父Java應用程序將獲取結果等。我研究了我不能使用Jython來執行Sci-kit模型。 3-我可以使用Jep(在Java中嵌入Python)將Cpython嵌入到JVM中嗎?有人試用過sci-kit模型嗎?

或者,我應該探討在我的基於JVM的應用程序中使用Mahout或weka - 基於java的機器學習庫。 (我需要同時支持Windows和非Windows平臺)

我也在探索基於java的H2Oai。有人試過嗎?

回答

0

我發現了一個體面的解決方案,我的問題。我正在使用在Java中開發的H2O.ai來使用開源的可伸縮機器學習。它提供Java(Restful API),Python,R和Scala中的API。它具有分類,迴歸,聚類等最好的類算法,並且與Apache Hadoop和Spark(波光粼粼的水)無縫集成,如果有人擁有Spark集羣。它還提供了基於多層前饋人工神經網絡的深度學習算法。我正在使用Java綁定API/Rest API,有時還使用低級H2o API(用於h2o 3節點羣集管理)。

我遇到另一個基於Java的替代方案,被稱爲Smile - 統計機器智能與學習引擎,提供迴歸,分類,聚類,關聯規則挖掘,特徵選擇等,沒有任何人對這些或類似的基於Java的ML庫更多的反饋?

0

如果你有一個HDFS後端的ETL,我建議在集羣上部署Spark和使用斯巴克的MLib機器學習算法。他們支持你上面提到的方法。

您是否介意給出一些關於您計劃使用的數據的大小(行,列,類型)的上下文? Java不會是我推薦的用於ML的goto語言,但Scala會編譯爲JVM字節碼,並且具有類似於Java的語法(除了具有Java API之外)。

如果你生產驗證的概念,那麼Java是好的,但如果你在使用大數據的工作計劃,它並沒有真正很好地擴展。

+0

Spark/Hadoop設置的數據不夠大。它通常在50到1GB之間變化(有幾百行)。現在,我使用[H2o,ai](https://www.h2o.ai),因爲它是基於Java的,所以對於我的基於Java的產品來說它很順利。但它具有有限的ML算法(無SVM等)。最後,我想從基於Java的應用程序中調用python(或R)來使用豐富的ML算法。 –

+0

我的意思是說 - 數據大小在50 MB到1 GB之間(最大) –

+0

給定這些數據大小,在Python或R中實現ML應該是微不足道的。我建議不要試圖從R或Python調用Java,將數據串行化爲可接收的格式(例如CSV),並進行系統調用(批處理/ bash)以運行Python或R中的處理。這與支持跨平臺編譯的需求緊密相關。 – lohithbb

1

我使用IntelliJ IDEA與python插件。這樣我就可以在同一個項目中同時使用java和python代碼。數據在數據庫中;該連接總是可見且可訪問的,與我目前是否在編輯器中有.java或.py文件無關。在配置列表中,您可以使用Python腳本,Java應用程序,Maven目標等。 因此,我認爲您不必將Python和Java代碼混合在一起(通過從Java調用Python腳本)。這完全沒有必要。

我的工作流程(在IntelliJ IDEA的一切): 1.準備數據(通常是SQL) 2.運行Python腳本,它適用transformators的管道從特定數據庫表,並輸出構成的熊貓數據幀一個PMML。 3.在java應用程序中使用scikit-learn模型。