這時須要在Python中把訓練好的模型保存爲PMML文件,到Java中直接調用預測。javascript
什麼是PMML?html
Python中把模型保存爲PMML的標準格式java
實例一:把GBDT模型保存爲PMML文件python
3.1 導入數據nginx
3.2 取出建模所需的變量typescript
3.3 訓練模型並保存爲PMML文件微信
實例二:把隨機森林模型保存爲PMML文件app
4.1 導入包dom
4.2 按標準流程建模並導出PMML文件機器學習
PMML的優缺點
5.1 優勢
5.2 缺點
PMML(Predictive Model Markup Language):預測模型標記語言,它用XML格式來描述生成的機器學習模型,是目前表示機器學習模型的實際標準。
若要將在Python中訓練好的模型部署到生產上時,可使用目標環境解析PMML文件的庫來加載模型,並作預測。
Python中把模型導出爲PMML文件的通常流程以下:
step1:特徵處理(DataFrameMapper函數)。
step2:訓練模型(pipeline函數)。
step3:導出模型(sklearn2pmml函數)。
其中step1不是必須步驟。
接下來看兩個具體實例。
3、實例一:把GBDT模型保存爲PMML文件
1 導入數據
首先導入建模所需數據。
# coding: utf-8import osimport pandas as pd #導入數據處理的庫import numpy as np #導入數據處理的
os.chdir(r'F:\微信公衆號\Python\40_機器學習模型導出爲PMML文件')data = pd.read_csv('testtdmodel.csv',sep=',',encoding='gb18030')
注:如需本文數據實現全部代碼,可到公衆號中回覆「PMML」,便可免費獲取。
本文選取了8個自變量,1個因變量進行建模。
columns_model = ['1個月內借款人身份證申請借款平臺數','3個月內關聯P2P網貸平臺數','3個月內申請人關聯融資租賃平臺數','3個月手機號關聯身份證數','7天內關聯P2P網貸平臺數','二度風險名單個數','是否命中身份證風險關注名單','一度風險名單個數']X_model = data[columns_model]y = data['y']
X_model具體格式以下:
在實例一中沒有進行特徵處理(step1),直接訓練模型並導出PMML文件。
from sklearn import treefrom sklearn.model_selection import train_test_splitfrom sklearn2pmml import PMMLPipeline, sklearn2pmmlfrom sklearn.ensemble import GradientBoostingClassifier
train, test, train_labels, test_labels = train_test_split(X_model, y, test_size=0.2, random_state=0)GBDT = GradientBoostingClassifier(random_state=9,max_depth=5,min_samples_split=10)pipeline = PMMLPipeline([ ("classifier", GBDT)])pipeline.fit(train, train_labels)sklearn2pmml(pipeline, 'GBDT1.pmml', with_repr=True, debug=True)
參數詳解:
獲得部分結果以下:
本例數據和實例一相同,就不贅述了。
本例按Python中把模型導出爲PMML文件的通常流程進行。
首先導入數據預處理和建模所需的包。
import numpy as npimport pandas as pdfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.datasets import load_irisfrom sklearn.ensemble import GradientBoostingClassifierfrom sklearn2pmml import sklearn2pmml, PMMLPipelinefrom sklearn2pmml.decoration import ContinuousDomainfrom sklearn.feature_selection import SelectKBest
# frameworks for MLfrom sklearn_pandas import DataFrameMapperfrom sklearn.pipeline import make_pipeline
# transformers for category variablesfrom sklearn.preprocessing import LabelBinarizerfrom sklearn.preprocessing import MultiLabelBinarizerfrom sklearn.preprocessing import LabelEncoderfrom sklearn.preprocessing import OneHotEncoder#from sklearn.preprocessing import Imputerfrom sklearn.impute import SimpleImputer
# transformers for numerical variablesfrom sklearn.preprocessing import MinMaxScalerfrom sklearn.preprocessing import StandardScalerfrom sklearn.preprocessing import Normalizer
# transformers for combined variablesfrom sklearn.decomposition import PCAfrom sklearn.preprocessing import PolynomialFeatures
# user-defined transformersfrom sklearn.preprocessing import FunctionTransformer
本文選取了8個自變量和一個因變量進行建模,並對其中4個變量進行數據處理。
#step1:特徵工程mapper = DataFrameMapper([ (['1個月內借款人身份證申請借款平臺數'],FunctionTransformer(np.abs)), (['3個月內關聯P2P網貸平臺數'],OneHotEncoder()), (['7天內關聯P2P網貸平臺數', '二度風險名單個數'], [MinMaxScaler(),StandardScaler()])])
iris_pipeline = PMMLPipeline([ ("mapper", mapper), ("pca", PCA(n_components=3)), ("selector", SelectKBest(k=2)), #返回k個最佳特徵 ("classifier", RandomForestClassifier())]) #step2:訓練模型iris_pipeline.fit(X_model,y) #step3:導出模型到 RandomForestClassifier_Iris.pmml 文件sklearn2pmml(iris_pipeline, "RandomForestClassifier_Iris.pmml")
參數詳解:
DataFrameMapper:進行數據預處理。
np.abs:對該列進行絕對值處理。
OneHotEncoder:對該列進行one-hot編碼。
MinMaxScaler:對該列進行標準化處理(min max 歸一化)。
PCA:主成分分析。
RandomForestClassifier:隨機森林建模。
iris_pipeline.fit:用通道中設定的方法訓練模型。
生成的PMML文件內容以下:
好比在Python中訓練了GBDT模型,模型尚未上線,需天天手工打樣驗證。能夠用pickle函數把模型打包,以後要使用直接加載就能夠了。
若是訓練環境和預測環境不同,在生產上安裝(R、Python、Spark等)不方便,可使用PMML文件的方式,在生成環境直接讀取PMML得到訓練後的模型。
-
1. 平臺無關性。PMML採用標準的XML格式保存模型,能夠實現跨平臺部署。 -
2. 普遍的支持性。不少經常使用的開源模型均可以轉換成PMML文件。
-
3. 易讀性。PMML模型文件是一個基於XML的文本文件,任意文本編輯器均可以打開查閱。
1.對數據預處理的支持有限。雖然已經支持了幾乎全部的標準數據處理方式,可是對於自拓展的方法,還缺少有效支持。
2. 模型類型支持有限。缺少對深度學習模型的支持。
3. 預測會有一點誤差。由於PMML格式的通用性,會損失特殊模型的特殊優化。
好比一個樣本,用sklearn的決策樹模型預測爲類別2,可是咱們把這個決策樹保存爲PMML文件,並用JAVA加載後,繼續預測剛纔這個樣本,有較小的機率出現預測的結果不爲類別2。
參考文獻:
https://www.jianshu.com/p/386fa2eb218ahttps://blog.csdn.net/wshzd/article/details/96165636https://blog.csdn.net/hshuihui/article/details/53260922https://blog.csdn.net/yueguanghaidao/article/details/91892549https://www.cnblogs.com/pinard/p/9220199.html
本文分享自微信公衆號 - 阿黎逸陽的代碼(gh_f3910c467dfe)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。