Python之pypmml:pypmml的簡介、安裝、使用方法之詳細攻略

一個處女座的程式猿發表於2020-10-23

Python之pypmml:pypmml的簡介、安裝、使用方法之詳細攻略

 

 

目錄

pypmml的簡介

1、PMML優點

2、PMML的缺點

pypmml的安裝

pypmml的使用方法

1、基礎案例

2、利用XGBoost模型對Iris資料訓練並轉為PMML檔案,載入並實現預測


 

 

pypmml的簡介

       pypmml是一個python pmml評分庫,它實際上是用於PMML4S的python api。pmml經常是跨平臺給java呼叫,借用PMML模型進行上線測試,即採用Python語言做模型訓練,線上採用 Java 載入模型做預測。離線部分負責模型訓練和匯出模型,線上匯入模型並且做預測。當然特徵工程部分主要做特徵變換,例如 分桶,單值編碼,歸一化等。
       預測模型標記語言PMML(Predictive Model Markup Language)是一套與平臺和環境無關的模型表示語言,是目前表示機器學習模型的實際標準。PMML是一種可以呈現預測分析模型的事實標準語言。標準東西的好處就是,各種開發語言都可以使用相應的包,把模型檔案轉成這種中間格式,而另外一種開發語言,可以使用相應的包匯入該檔案做線上預測。
         從2001年釋出的PMML1.1,到2019年最新4.4,PMML標準已經由最初的6個模型擴充套件到了17個模型,並且提供了挖掘模型(Mining Model)來組合多模型。作為一個開放的成熟標準,PMML由資料探勘組織DMG(Data Mining Group)開發和維護,經過十幾年的發展,得到了廣泛的應用,有超過30家廠商和開源專案(包括SAS,IBM SPSS,KNIME,RapidMiner等主流廠商)在它們的資料探勘分析產品中支援並應用PMML,
       PMML是一套基於XML的標準,通過 XML Schema 定義了使用的元素和屬性,主要由以下核心部分組成:

  • 資料字典(Data Dictionary),描述輸入資料。
  • 資料轉換(Transformation Dictionary和Local Transformations),應用在輸入資料欄位上生成新的派生欄位。
  • 模型定義 (Model),每種模型型別有自己的定義。
  • 輸出(Output),指定模型輸出結果。

 

1、PMML優點

  • 平臺無關性。PMML可以讓模型部署環境脫離開發環境,實現跨平臺部署,是PMML區別於其他模型部署方法最大的優點。比如使用Python建立的模型,匯出PMML後可以部署在Java生產環境中。
  • 互操作性。這就是標準協議的最大優勢,實現了相容PMML的預測程式可以讀取其他應用匯出的標準PMML模型。
  • 廣泛支援性。已取得30餘家廠商和開源專案的支援,通過已有的多個開源庫,很多重量級流行的開源資料探勘模型都可以轉換成PMML。
  • 可讀性。PMML模型是一個基於XML的文字檔案,使用任意的文字編輯器就可以開啟並檢視檔案內容,比二進位制序列化檔案更安全可靠。

 

2、PMML的缺點

  • 資料處理操作有限。支援不了所有的資料預處理和後處理操作。雖然PMML已經支援了幾乎所有的標準資料處理方式,但是對使用者一些自定義操作,還缺乏有效的支援,很難放到PMML中。
  • 模型型別支援有限。特別是缺乏對深度學習模型的支援,PMML下一版5.0會新增對深度模型的支援,目前Nyoka可以支援Keras等深度模型,但生成的是擴充套件的PMML模型。
  • PMML是一個鬆散的規範標準,有的廠商生成的PMML有可能不太符合標準定義的Schema,並且PMML規範允許廠商新增自己的擴充套件,這些都對使用這些模型造成了一定障礙。

 

 

參考文章https://zhuanlan.zhihu.com/p/79197337

 

pypmml的安裝

pip install pypmml
pip install --user -i https://pypi.tuna.tsinghua.edu.cn/simple pypmml

 

 

 

 

pypmml的使用方法

1、基礎案例

heart_data = pandas.read_csv("heart.csv")
#用Mapper定義特徵工程
mapper = DataFrameMapper([
    (['sbp'], MinMaxScaler()),
    (['tobacco'], MinMaxScaler()),
    ('ldl', None),
    ('adiposity', None),
    (['famhist'], LabelBinarizer()),
    ('typea', None),
    ('obesity', None),
    ('alcohol', None),
    (['age'], FunctionTransformer(np.log)),
]) 

#用pipeline定義使用的模型,特徵工程等
pipeline = PMMLPipeline([
   ('mapper', mapper),
   ("classifier", linear_model.LinearRegression())
])

pipeline.fit(heart_data[heart_data.columns.difference(["chd"])], heart_data["chd"])
#匯出模型檔案
sklearn2pmml(pipeline, "lrHeart.xml", with_repr = True)

 

 

2、利用XGBoost模型對Iris資料訓練並轉為PMML檔案,載入並實現預測

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
import pandas as pd
from xgboost import XGBClassifier

seed = 123

iris = datasets.load_iris()
target = 'Species'
features = iris.feature_names
iris_df = pd.DataFrame(iris.data, columns=features)
iris_df[target] = iris.target

X, y = iris_df[features], iris_df[target]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=seed)

pipeline = Pipeline([
    ('scaling', StandardScaler()), 
    ('xgb', XGBClassifier(n_estimators=5, seed=seed))
])

pipeline.fit(X_train, y_train)
y_pred = pipeline.predict(X_test)
y_pred_proba = pipeline.predict_proba(X_test)


from nyoka import xgboost_to_pmml
xgboost_to_pmml(pipeline, features, target, "xgb-iris.pmml")

from pypmml import Model
model = Model.load("xgb-iris.pmml")
model.predict(X_test)

 

 

 

 

 

 

相關文章