機器學習模型部署—PMML

以前闡述了 邏輯迴歸 孤立森林 等建模方法,本文介紹如何把建好的模型保存爲標準格式(PMML文件)。
那麼,什麼狀況下須要把模型保存爲 PMML 文件?
當模型須要 跨平臺部署 反覆調用 時,能夠把模型保存爲PMML文件。
好比最近要上線一個反欺詐模型(用的GBDT)。
訓練模型用的Python(裏面有不少現成的庫,構建機器學習模型較方便),生產調用用的Java(寫機器學習模型很是麻煩)。

這時須要在Python中把訓練好的模型保存爲PMML文件,到Java中直接調用預測。javascript

本文目錄
  1. 什麼是PMML?html

  2. Python中把模型保存爲PMML的標準格式java

  3. 實例一:把GBDT模型保存爲PMML文件python

    3.1 導入數據nginx

    3.2 取出建模所需的變量typescript

    3.3 訓練模型並保存爲PMML文件微信

  4. 實例二:把隨機森林模型保存爲PMML文件app

    4.1 導入包dom

    4.2 按標準流程建模並導出PMML文件機器學習

  5. PMML的優缺點

    5.1 優勢

    5.2 缺點


1、什麼是PMML

PMML(Predictive Model Markup Language):預測模型標記語言,它用XML格式來描述生成的機器學習模型,是目前表示機器學習模型的實際標準

若要將在Python中訓練好的模型部署到生產上時,可使用目標環境解析PMML文件的庫來加載模型,並作預測。


2、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」,便可免費獲取。


 2  取出建模所需的變量

本文選取了8個自變量,1個因變量進行建模。

columns_model = ['1個月內借款人身份證申請借款平臺數','3個月內關聯P2P網貸平臺數','3個月內申請人關聯融資租賃平臺數','3個月手機號關聯身份證數','7天內關聯P2P網貸平臺數','二度風險名單個數','是否命中身份證風險關注名單','一度風險名單個數']X_model = data[columns_model]y = data['y']

X_model具體格式以下:


 3  訓練模型並保存爲PMML文件

在實例一中沒有進行特徵處理(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)

參數詳解:

train_test_split: 把模型數據按test_size的比例生成訓練集和測試集。
GBDT:建模所用方法, 裏面的參數可自行調整
random_state:隨機種子。
max_depth:樹的最大深度。
min_samples_split 限制子樹繼續劃分的條件,若是某節點的樣本數目小於此值,則不會再繼續劃分。
pipeline.fit:訓練模型,train表明自變量,train_labels表明因變量。
sklearn2pmml:把模型保存爲PMML文件。

獲得部分結果以下:


4、實例二:把隨機森林模型保存爲PMML

本例數據和實例一相同,就不贅述了。

本例按Python中把模型導出爲PMML文件的通常流程進行。


 1  加載包

首先導入數據預處理和建模所需的包

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


 2  按標準流程建模並導出PMML文件

本文選取了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:用通道中設定的方法訓練模型。

sklearn2pmml:把通道中訓練好的模型保存爲PMML文件。

生成的PMML文件內容以下:

若是模型訓練和預測用同一種語言,我認爲不必使用PMML。由於R、Python等語言都有標準的輸出格式能夠直接加載。

好比在Python中訓練了GBDT模型,模型尚未上線,需天天手工打樣驗證。能夠用pickle函數把模型打包,以後要使用直接加載就能夠了。

若是訓練環境和預測環境不同,在生產上安裝(R、Python、Spark等)不方便,可使用PMML文件的方式,在生成環境直接讀取PMML得到訓練後的模型。


5、PMML的優缺點
 1  優勢
  • 1. 平臺無關性。PMML採用標準的XML格式保存模型,能夠實現跨平臺部署。
  • 2. 普遍的支持性。不少經常使用的開源模型均可以轉換成PMML文件。
  • 3. 易讀性。PMML模型文件是一個基於XML的文本文件,任意文本編輯器均可以打開查閱。
 2  缺點
  • 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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索