python sklearn2pmml


問題導讀
1.scikit-learn已經成為Python重要的機器學習庫,那么如何將scikit-learn訓練好的模型直接導出為PMML呢?  

2.如何將原有pickle格式的模型文件轉換為PMML?

綜述
自2007年發布以來,scikit-learn已經成為Python重要的機器學習庫了。scikit-learn簡稱sklearn,支持包括分類、回歸、降維和聚類四大機器學習算法。還包含了特征提取、數據處理和模型評估三大模塊。
sklearn擁有着完善的文檔,上手容易,具有着豐富的API,在學術界頗受歡迎。sklearn已經封裝了大量的機器學習算法,包括LIBSVM和LIBINEAR。同時sklearn內置了大量數據集,節省了獲取和整理數據集的時間。
本文介紹了如何將sklearn中的模型導出為PMML文件,方便后續的工程上線操作,內容包括涉及環境的搭建和中間遇到的坑。

前置知識
  • Python 基本操作,會使用pip 或者Anaconda進行依賴庫管理
  • Maven 基本操作
  • Java 命令基本操作

sklearn2pmml 

使用sklearn2pmml 可以在python中,訓練完模型之后,直接將模型導出為PMML文件。
軟件版本
  • Python 2.7,3.4 或者更新。
  • scikit-learn 0.16.0 或者更新。
  • sklearn-pandas 0.0.10 或者更新。
  • sklearn2pmml 0.14.0 或者更新。
安裝scikit-learn
使用pip 安裝,命令如下:
[Shell]  純文本查看  復制代碼
?
1
pip install -U scikit-learn


使用conda 安裝,命令如下:
[Shell]  純文本查看  復制代碼
?
1
conda install scikit-learn


個人強烈建議,使用 Anaconda 進行Python 版本管理,使用conda命令進行安裝。(貌似因為源的問題,conda中被牆的可能性小)
詳細內容,可以參見  sklearn 安裝文檔
安裝skkearn-pandas
命令如下:
[Shell]  純文本查看  復制代碼
?
1
pip install sklearn-pandas


這個地方,如果因為被牆,可以去官網下載 whl文件到本地,假設路徑為”/data/users/miao18/sklearn_pandas-1.6.0-py2.py3-none-any.whl”然后
[Shell]  純文本查看  復制代碼
?
1
pip install /data/users/miao18/sklearn_pandas-1 .6.0-py2.py3-none-any.whl


通過本地文件的方式安裝。
安裝sklearn2pmml
命令如下:
[Shell]  純文本查看  復制代碼
?
1
pip install --user --upgrade git+[url=https: //github .com /jpmml/sklearn2pmml .git]https: //github .com /jpmml/sklearn2pmml .git[ /url ]


校驗是否安裝成功
進入Python 命令行,輸入如下命令
[Python]  純文本查看  復制代碼
?
1
2
3
4
5
6
import sklearn, sklearn.externals.joblib, sklearn_pandas, sklearn2pmml
 
print (sklearn.__version__)
print (sklearn.externals.joblib.__version__)
print (sklearn_pandas.__version__)
print (sklearn2pmml.__version__)


我的環境輸出結果如下,符合要求:
[Plain Text]  純文本查看  復制代碼
?
1
2
3
4
0.19.1
0.11
1.6.0
0.26.0


使用方法
使用iris數據集,訓練一個簡單的決策樹模型,並導出為pmml。
[Python]  純文本查看  復制代碼
?
01
02
03
04
05
06
07
08
09
10
11
from sklearn2pmml import PMMLPipeline
from sklearn.datasets import load_iris
from sklearn import tree
iris = load_iris()
clf = tree.DecisionTreeClassifier()
pipeline = PMMLPipeline([( "classifier" , clf)])
pipeline.fit(iris.data, iris.target)
 
# 導出為PMML
from sklearn2pmml import sklearn2pmml
sklearn2pmml(pipeline, "DecisionTreeIris.pmml" , with_repr = True )


工作目錄下的DecisionTreeIris.pmml 就是導出的pmml文件。
這里需要注意,sklearn中都是以pipeline 的形式進行轉化的。原型如下:
[Python]  純文本查看  復制代碼
?
1
sklearn2pmml(pipeline, pmml, user_classpath, with_repr, debug)
jpmml-sklearn
使用jpmml-sklearn,可以將一個現有的pickle格式的模型文件轉換為PMML文件。
軟件版本
  • Python 2.7,3.4 或者更新。
  • scikit-learn 0.16.0 或者更新。
  • sklearn-pandas 0.0.10 或者更新。
  • sklearn2pmml 0.14.0 或者更新。
  • Java 1.8 或者更新。
安裝
從github 下載源碼,並安裝:
[Shell]  純文本查看  復制代碼
?
1
2
git clone [url=mailto:git@github.com]git@github.com[ /url ]:jpmml /jpmml-sklearn .git
mvn clean install


執行完畢后,在target目錄下有 一個 converter-executable-1.4-SNAPSHOT.jar 的jar文件。
使用方法
一個典型的workflow如下:
  • 使用Python 訓練一個模型。
  • 將模型序列化為pickle,並存到本地。
  • 使用Java命令,將pickle文件轉為pmml。
Python 側生成一個pickle 文件
訓練部分,和直接導出pmml類似,只是最后的落地文件,不直接導出為pmml,而是存成pickle文件,代碼如下:
[Python]  純文本查看  復制代碼
?
01
02
03
04
05
06
07
08
09
10
from sklearn2pmml import PMMLPipeline
from sklearn.datasets import load_iris
from sklearn import tree
iris = load_iris()
clf = tree.DecisionTreeClassifier()
pipeline = PMMLPipeline([( "classifier" , clf)])
pipeline.fit(iris.data, iris.target)
 
from sklearn.externals import joblib
joblib.dump(pipeline, "pipeline.pkl.z" , compress = 9 )


Java側轉換
使用上文編譯好的Jar包,進行轉換,命令如下:
[Shell]  純文本查看  復制代碼
?
1
java -jar target /jpmml-sklearn-executable-1 .5-SNAPSHOT.jar --pkl-input pipeline.pkl.z --pmml-output pipeline.pmml


總結
分別使用了sklearn2pmml 和 jpmml-sklearn 進行導出pmml文件,操作過程類似。
使用sklearn2pmml 的方式更為便捷,直接在python 中就可以導出,這意味着每次訓練完模型,就能快速生成一個pmml文件。
使用jpmml-sklearn,則可以對現有的pickle 文件進行操作。
兩者各有優劣,請使用者根據實際情況按需使用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM