使用PMML部署機(jī)器學(xué)習(xí)模型

目錄

PMML簡(jiǎn)介

預(yù)測(cè)模型標(biāo)記語(yǔ)言PMML(Predictive Model Markup Language)是一套與平臺(tái)和環(huán)境無(wú)關(guān)的模型表示語(yǔ)言娃肿,是目前表示機(jī)器學(xué)習(xí)模型的實(shí)際標(biāo)準(zhǔn)火架。從2001年發(fā)布的PMML1.1强戴,到2019年最新4.4歉摧,PMML標(biāo)準(zhǔn)已經(jīng)由最初的6個(gè)模型擴(kuò)展到了17個(gè)模型燃异,并且提供了挖掘模型(Mining Model)來(lái)組合多模型礼饱。

作為一個(gè)開放的成熟標(biāo)準(zhǔn)李滴,PMML由數(shù)據(jù)挖掘組織DMG(Data Mining Group)開發(fā)和維護(hù)突硝,經(jīng)過十幾年的發(fā)展测摔,得到了廣泛的應(yīng)用,有超過30家廠商和開源項(xiàng)目(包括SAS解恰,IBM SPSS锋八,KNIME,RapidMiner等主流廠商)在它們的數(shù)據(jù)挖掘分析產(chǎn)品中支持并應(yīng)用PMML护盈,這些廠商應(yīng)用詳情見下表:PMML Powered

PMML標(biāo)準(zhǔn)介紹

PMML是一套基于XML的標(biāo)準(zhǔn)挟纱,通過 XML Schema 定義了使用的元素和屬性,主要由以下核心部分組成:

  • 數(shù)據(jù)字典(Data Dictionary)腐宋,描述輸入數(shù)據(jù)紊服。
  • 數(shù)據(jù)轉(zhuǎn)換(Transformation Dictionary和Local Transformations),應(yīng)用在輸入數(shù)據(jù)字段上生成新的派生字段胸竞。
  • 模型定義 (Model)欺嗤,每種模型類型有自己的定義。
  • 輸出(Output)卫枝,指定模型輸出結(jié)果煎饼。

PMML預(yù)測(cè)過程符合數(shù)據(jù)挖掘分析流程:


pmml-flow.png

PMML優(yōu)點(diǎn)

  • 平臺(tái)無(wú)關(guān)性。PMML可以讓模型部署環(huán)境脫離開發(fā)環(huán)境校赤,實(shí)現(xiàn)跨平臺(tái)部署吆玖,是PMML區(qū)別于其他模型部署方法最大的優(yōu)點(diǎn)。比如使用Python建立的模型马篮,導(dǎo)出PMML后可以部署在Java生產(chǎn)環(huán)境中沾乘。
  • 互操作性。這就是標(biāo)準(zhǔn)協(xié)議的最大優(yōu)勢(shì)浑测,實(shí)現(xiàn)了兼容PMML的預(yù)測(cè)程序可以讀取其他應(yīng)用導(dǎo)出的標(biāo)準(zhǔn)PMML模型翅阵。
  • 廣泛支持性。已取得30余家廠商和開源項(xiàng)目的支持迁央,通過已有的多個(gè)開源庫(kù)怎顾,很多重量級(jí)流行的開源數(shù)據(jù)挖掘模型都可以轉(zhuǎn)換成PMML。
  • 可讀性漱贱。PMML模型是一個(gè)基于XML的文本文件槐雾,使用任意的文本編輯器就可以打開并查看文件內(nèi)容,比二進(jìn)制序列化文件更安全可靠幅狮。

PMML開源類庫(kù)

模型轉(zhuǎn)換庫(kù)募强,生成PMML:

模型評(píng)估庫(kù)接奈,讀取PMML:

PMML演示

構(gòu)建模型客税,完整Jupyter Notebook,請(qǐng)參考:xgb-iris-pmml.ipynb

  1. 使用Iris數(shù)據(jù)構(gòu)建一個(gè)XGBoost模型撕贞,在建模之前對(duì)浮點(diǎn)數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化更耻,利用Scikit-learn中的Pipeline:
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 = 123456

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)
  1. 使用Nyoka,把Pipeline導(dǎo)出PMML:
from nyoka import xgboost_to_pmml
xgboost_to_pmml(pipeline, features, target, "xgb-iris.pmml")
  1. 使用PyPMML來(lái)驗(yàn)證PMML預(yù)測(cè)值是否和原生Python模型一致:
from pypmml import Model
model = Model.load("xgb-iris.pmml")
model.predict(X_test)

讀取PMML捏膨,進(jìn)行預(yù)測(cè)秧均。以下使用PMML4S的Scala接口,您也可以使用它的Java接口号涯,使用非常簡(jiǎn)單目胡。完整程序,在以下Zeppelin Notebook中:https://github.com/aipredict/ai-deployment/blob/master/deploy-ml-using-pmml/pmml4s-demo.json

因?yàn)镚ithub不支持瀏覽Zeppelin Notebook诚隙,可以訪問以下地址瀏覽:https://www.zepl.com/viewer/github/aipredict/ai-deployment/master/deploy-ml-using-pmml/pmml4s-demo.json

import org.pmml4s.model.Model
val model = Model.fromFile("xgb-iris.pmml")
val result = model.predict(Map("sepal length (cm)" -> 5.7, "sepal width (cm)" -> 4.4, "petal length (cm)" -> 1.5, "petal width (cm)" -> 0.4))

PMML缺點(diǎn)

PMML雖然有很多優(yōu)點(diǎn)讶隐,但也并非毫無(wú)缺點(diǎn),比如:

  • 支持不了所有的數(shù)據(jù)預(yù)處理和后處理操作久又。雖然PMML已經(jīng)支持了幾乎所有的標(biāo)準(zhǔn)數(shù)據(jù)處理方式巫延,但是對(duì)用戶一些自定義操作,還缺乏有效的支持地消,很難放到PMML中炉峰。
  • 模型類型支持有限。特別是缺乏對(duì)深度學(xué)習(xí)模型的支持脉执,PMML下一版5.0會(huì)添加對(duì)深度模型的支持疼阔,目前Nyoka可以支持Keras等深度模型,但生成的是擴(kuò)展的PMML模型半夷。
  • PMML是一個(gè)松散的規(guī)范標(biāo)準(zhǔn)婆廊,有的廠商生成的PMML有可能不太符合標(biāo)準(zhǔn)定義的Schema,并且PMML規(guī)范允許廠商添加自己的擴(kuò)展巫橄,這些都對(duì)使用這些模型造成了一定障礙淘邻。

總結(jié)

本文中我們介紹了PMML這種跨平臺(tái)機(jī)器學(xué)習(xí)模型表示標(biāo)準(zhǔn),PMML的優(yōu)缺點(diǎn)湘换,常用的PMML開源類庫(kù)宾舅,以及演示了如何生成和使用PMML。

雖然PMML有一些缺點(diǎn)和不足彩倚,但瑕不掩瑜筹我,PMML的優(yōu)點(diǎn)是要遠(yuǎn)遠(yuǎn)超過存在的缺點(diǎn)。如果您訓(xùn)練的模型可以導(dǎo)出PMML帆离,建議使用PMML來(lái)部署蔬蕊,如果導(dǎo)出的PMML不能包含整個(gè)Pipelines,可以參考文章《自動(dòng)部署PMML模型生成REST API》中介紹的部署自定義實(shí)時(shí)預(yù)測(cè)Web服務(wù)哥谷。

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末概而,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子囱修,更是在濱河造成了極大的恐慌赎瑰,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件破镰,死亡現(xiàn)場(chǎng)離奇詭異餐曼,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)鲜漩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門源譬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人孕似,你說我怎么就攤上這事踩娘。” “怎么了喉祭?”我有些...
    開封第一講書人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵养渴,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我泛烙,道長(zhǎng)理卑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任蔽氨,我火速辦了婚禮藐唠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鹉究。我一直安慰自己宇立,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開白布自赔。 她就那樣靜靜地躺著妈嘹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪匿级。 梳的紋絲不亂的頭發(fā)上蟋滴,一...
    開封第一講書人閱讀 50,096評(píng)論 1 291
  • 那天染厅,我揣著相機(jī)與錄音痘绎,去河邊找鬼。 笑死肖粮,一個(gè)胖子當(dāng)著我的面吹牛孤页,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播涩馆,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼行施,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼允坚!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起蛾号,我...
    開封第一講書人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤稠项,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后鲜结,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體展运,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年精刷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拗胜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡怒允,死狀恐怖埂软,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情纫事,我是刑警寧澤勘畔,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站儿礼,受9級(jí)特大地震影響咖杂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蚊夫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一诉字、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧知纷,春花似錦壤圃、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至乍桂,卻和暖如春冲杀,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背睹酌。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工权谁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人憋沿。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓旺芽,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子采章,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351