再访PMML
嗨伙計(jì)! 從今年年初開始,就有了重新設(shè)計(jì)Drools PMML模塊的計(jì)劃。
在這篇文章中,我將描述我們將如何處理它,目前的狀態(tài),未來發(fā)展的想法等,等等……敬請期待!
背景
PMML是一個(gè)標(biāo)準(zhǔn),旨在“ 為分析應(yīng)用提供一種描述和交換由數(shù)據(jù)挖掘和機(jī)器學(xué)習(xí)算法生成的預(yù)測模型的方法。 PMML標(biāo)準(zhǔn)定義了一系列受管理的模型,我們將它們稱為“模型”。
換句話說,可能(不是那么明顯)的結(jié)果是,PMML可能被認(rèn)為是不同預(yù)測模型的協(xié)調(diào)器 ,每個(gè)預(yù)測模型都有不同的要求。 Drools有其自己的PMML實(shí)現(xiàn)。 它的原始設(shè)計(jì)是基于100%流口水引擎的,但是從長遠(yuǎn)來看,這對所有模型都不令人滿意,因此決定采用不同的方法來實(shí)施新版本。 現(xiàn)在,這里的故事開始了……
要求
簡而言之,PMML實(shí)現(xiàn)應(yīng)允許:
聽起來很簡單,不是嗎?
方法
擬議的體系結(jié)構(gòu)旨在遵循“清潔體系結(jié)構(gòu)”原則,以模塊化方式滿足要求。
為了實(shí)現(xiàn)這一點(diǎn),定義了清晰的邊界和可見性的組件。 總體思路是,存在與核心功能嚴(yán)格相關(guān)的特定任務(wù),而其他“外部”功能則應(yīng)保持不可知。 任何想深入研究此問題的人都可以閱讀RC Martin撰寫的“ Clean Architecture”一書,但從本質(zhì)上講,將good-ol的設(shè)計(jì)原則應(yīng)用于整個(gè)體系結(jié)構(gòu)只是一個(gè)問題。 明確定義此目標(biāo)后,實(shí)現(xiàn)該目標(biāo)所需的步驟為:
我們選擇實(shí)現(xiàn)插件模式以將核心邏輯綁定到特定于模型的實(shí)現(xiàn),主要有兩個(gè)原因:
(我作弊:那是三個(gè))
我們可以避免嗎? 也許。 我們可以使用由規(guī)范的xsd直接生成的模型。 但這是為了描述所有預(yù)測模型而設(shè)計(jì)的,盡管它們中的任何一個(gè)都可能以不同的方式和不同的約定使用它。 因此,此內(nèi)部視圖將準(zhǔn)確表示每個(gè)特定模型所需的內(nèi)容。
組件
我們確定了以下主要功能組件:
編譯器
該組件讀取原始PMML文件并將其翻譯為我們的內(nèi)部格式。
它的核心方面只是將xml數(shù)據(jù)解組到Java對象中。 然后,它使用java SPI檢索特定于給定PMML模型的模型編譯器(如果找不到模型編譯器,則將PMML忽略)。
最后,檢索到的模型編譯器會(huì)將原始PMML模型“轉(zhuǎn)換”為我們特定于模型的表示形式( KiePMMLModels )。
該組件的核心部分不直接依賴于任何特定的Model Compiler實(shí)現(xiàn) ,甚至不依賴于任何Drools / Kie –因此,它基本上是一個(gè)輕量級(jí)/獨(dú)立的庫。 如果該組件的執(zhí)行不是很費(fèi)時(shí),則可以在運(yùn)行時(shí) (即,在客戶項(xiàng)目的執(zhí)行期間)或在kjar的編譯期間(例如,對于流口水實(shí)現(xiàn)的模型)調(diào)用該組件。
組裝工
由編譯器內(nèi)KIE知識(shí)庫創(chuàng)建該組件存儲(chǔ)KiePMMLModels。 其他組件都不應(yīng)該對此組件有任何依賴性/知識(shí)。
反過來,它必須對實(shí)際沒有任何依賴關(guān)系/知識(shí)/引用 模型編譯器實(shí)現(xiàn)。
該組件負(fù)責(zé)PMML模型的實(shí)際執(zhí)行。 它接收PMML輸入數(shù)據(jù),檢索特定于輸入數(shù)據(jù)的KiePMMLModel并計(jì)算輸出。
對于每個(gè)模型,都有一個(gè)特定的“執(zhí)行器”,以根據(jù)模型類型允許不同類型的執(zhí)行實(shí)現(xiàn)(drool,外部庫等)。 它的核心端僅接收輸入數(shù)據(jù)并檢索特定于給定PMML模型的模型執(zhí)行器(如果找不到,則將忽略PMML)。 最后,檢索到的模型執(zhí)行器將根據(jù)輸入數(shù)據(jù)評(píng)估預(yù)測。 該組件的核心部分不直接依賴于任何特定的Model Executor實(shí)現(xiàn),但是當(dāng)然嚴(yán)格依賴于Drool運(yùn)行時(shí)。
模型實(shí)施
基于Drools的模型
一些模型將委托給drools引擎,以在重載下實(shí)現(xiàn)最佳性能。 以下是有關(guān)此類實(shí)現(xiàn)的一般方案的一些詳細(xì)信息。
DRL詳細(xì)信息
- 對于DataDictionary中的每個(gè)字段,必須定義一個(gè)特定的DataType
- 對于樹的每個(gè)分支/葉子,必須生成全路徑規(guī)則(即具有到達(dá)路徑的規(guī)則-例如“ sunny”,“ sunny_temperature”,“ sunny_temperature_humidity”)
- 創(chuàng)建了一個(gè)“狀態(tài)持有者”對象,該對象包含已觸發(fā)規(guī)則的值–更改該值將觸發(fā)與之匹配的子分支/葉規(guī)則(例如,規(guī)則“ sunny”將觸發(fā)“ sunny_temperature”,而后者又將觸發(fā)) “ sunny_temperature_humidity”)
- 此類“狀態(tài)持有人” 可能包含評(píng)估的信息/部分結(jié)果,最終將在需要結(jié)果組合的地方使用
- 價(jià)值缺失策略可以在身份持有者內(nèi)部實(shí)施, 也可以作為分解規(guī)則實(shí)施
測試中
對于每個(gè)模型,將有一組標(biāo)準(zhǔn)的單元測試,主要用于驗(yàn)證各個(gè)代碼單元。 除此之外,在特定于模型的模塊(是的,它是繞口令)中,將有一個(gè)集成測試子模塊。 后者將驗(yàn)證不同或多或少復(fù)雜的PMML文件的整體正確執(zhí)行,以盡可能模擬實(shí)際情況。
回歸
回歸模型是第一個(gè)實(shí)現(xiàn)的模型。 由于其固有的簡單性,我們選擇為其提供純基于Java的實(shí)現(xiàn)。 目前,它仍處于PR之下,并且正在添加新的完整測試。
樹
在評(píng)估了所有優(yōu)點(diǎn)/缺點(diǎn)之后,我們認(rèn)為該模型可以作為采用基于流口水的方法來實(shí)施的很好的候選者。 作為一個(gè)易于遵循的簡單模型,我們選擇將其用作流口水方法的第一個(gè)測試。
待辦事項(xiàng)
這是缺少的功能列表,這些功能尚未實(shí)現(xiàn),并且與特定模型沒有嚴(yán)格關(guān)聯(lián)。 在開發(fā)過程中將對其進(jìn)行更新:
- 設(shè)置基準(zhǔn)框架項(xiàng)目(請參閱Drools基準(zhǔn) )
- 管理擴(kuò)展標(biāo)簽(請參閱xsdElement_Extension )
- 管理SimpleSetPredicate標(biāo)記(請參閱SimpleSetPredicate )
- 在細(xì)分中實(shí)現(xiàn)VariableWeight (動(dòng)態(tài)替代靜態(tài)“權(quán)重”值)
不用說,任何評(píng)論(特別是好評(píng)論)和建議都會(huì)受到贊賞。
接下來的幾天再回來看看下一步!
再見!
翻譯自: https://www.javacodegeeks.com/2020/02/pmml-revisited.html
總結(jié)
- 上一篇: java数字格式化_Java数字格式
- 下一篇: jvm7 jvm8_JVM PermGe