摘要:PMML,GBDT
PMML介紹
PMML(Predictive Model Markup Language)預測模型标記語言,是基于标記語言XML建立的應用标準語言,是W3C的标準語言。PMML就是以XML為基礎描述模型的資料定義、資料轉化、模型建構、輸出内容多一系列操作,可以在不同平台是新資料交換、模型共享,在1997年誕生,到目前已經更新到4.4版本,由資料挖掘組織DMG負責維護更新。
XML的基礎要素
XML的基礎要素包括頭部和正文,頭部,頭部包含XML聲明、文檔類型,正文包含根元素、子元素、屬性等。
XML基礎要素
如圖根元素是books,一個XML隻能有一個根元素,剩下的都是元素。books的子元素是book,可以有多個子元素,id=“bk101”是屬性,author、title、description是book的子元素。在XML中屬性和子元素可以互相轉化,既可以寫為屬性也可以寫為子元素,一般id類寫為屬性,其他寫為子元素。
一個XML可以想象為一個樹結構,從根節點(跟元素)開始生長,如下圖
樹結構圖
PMML的内容要素
PMML主要包含以下模型内容
- (1) 資料字典:定義了資料的字段名稱,資料類型
- (2) 缺失和異常處理:解決缺失值填充和異常值處理的問題,應對部署環境下的資料情況
- (3) 特征轉換:列入資料特征派生,資料分箱等功能
- (4) 模型建構:定義模型結構
- (5) 模型輸出:定義模型的輸出标簽
- (6) 輸出處理:模型輸出标簽的二次加工處理,列入機率和分數的轉化等
PMML檔案學習
下面以一個PMML檔案為例,學習一下PMML檔案的結構和各種屬性,以下是折疊了所有元素資訊的PMML檔案内容
PMML縮略圖
1.PMML頭部
第一行是PMML頭部資訊,代表XML聲明,一個XML檔案必須由一個XML申明開始,一個XML聲明就是一個XML處理指令,他聲明了XML規範的版本和字元編碼,standalone=yes表示此XML是獨立的,不需要再配合一個DTD檔案。
2.PMML正文
從根元素<PMML>開始就是正文内容,在這個PMML中根元素下有4個子元素,分别是Header,MiningBuildTask,DataDictionary,MiningModel,其中Header和MiningBuildTask是每個PMML必須有的,其他可選。
(1)根元素PMML
根元素PMML
根元素中定義了三個屬性
- xmlns:代表預設命名空間,是xml name space的意思,命名空間指定一個URI(網址連結),這個URI的作用僅僅是用來唯一辨別,并沒有取這個連結拉取資料資源。命名空間的目的是為了解決不同領域的XML詞彙同名沖突的問題,就相當于申明了下面所有的元素名稱都是在“http://www.dmg.org/PMML-4_4”規範下的。預設命名空間沒有字首,是以在下面的包含體中所有沒有字首的元素和屬性都屬于這個預設命名空間。
- xmlns:data:代表顯式命名空間,使用冒号間隔,冒号後面的内容是使用者自定義的,在下面的包含體中所有以字首+冒号開頭的元素都屬于這個顯式命名空間。
- version:表示PMML标準版本号,這個是必選屬性。
(2)Header元素
Header
Header是必須在PMML中出現的,且出現在第一個,Header描述了這個模型時何時使用什麼程式生成的。上圖中有兩個子元素
- Application:生成模型的應用程式描述,又包含name和version兩個屬性,表示生成該PMML的程式時JPMML_SkLearn,JPMML_SkLearn版本時1.6.35。
- Timestamp:建立該PMML模型的時間戳。
(3)MiningBuildTask元素
MiningBuildTask
這個代表挖掘任務,包含模型的訓練資訊,主要是模型訓練和建立時的配置資訊。上圖所示就是Sklearn的Pipeline,其中包含一個叫preprocessor的ColumnTransformer預處理過程和一個叫classifier的XGBClassifier過程。其中預處理過程包含好多,既有對缺失值的填充,又有onehot,其中本例中是對每一個列單獨起的一個SimpleImputer,因為采用均值填充的方式,每個列的均值不一樣。
(4)DataDictionary元素
DataDictionary資料字典定義了資料的類型和取值範圍,訓練和預測資料都需要符合這個資料字典的約定。DataDictionary是PMML必選的元素。
DataDictionary元素
DataDictionary的子元素DataField定義了列,他又有name,optype,dataType三個屬性
- name:字段名稱,是唯一的
- optype:度量尺度,比如連續型,離散型
- dataType:資料類型,比如字元串string,證書integer,小數double
DataField有子元素Value,定義了離散變量的取值集合,其中包含了字元串null。
(5)MiningModel元素
從這個元素開始進入模型部分,先看一下這個元素的整體結構
MiningModel元素
MiningModel是MODEL-ELEMENT是模型元素集合中的一個元素,他有以下這些元素
MODEL-ELEMENT集合
MiningModel有三個屬性
- functionName:模型任務類型,回歸還是分類,這個是必須屬性
- algorithmName:算法名稱
- x-mathContext:等于float,告訴PMML引擎需要切換到32位浮點模式
MiningModel通常用于模型的融合,因為本例子是XGB是以是多個分類回歸樹的融合。他包含兩個子元素MiningSchema,Segmentation。
- MiningSchema:是所有模型都必須有的子元素,這個元素裡面包含了這個模型用到的所有字段,DataDictionary定義的是這個PMML的所有字段,而MiningSchema定義的這個模型使用到的字段。除此之外,MiningSchema的子元素MiningField還可以對字段缺失值異常值進行處理。
- Segmentation:MiningModel包含的一個特有子的元素,用于融合多個模型。
5.1 MiningSchema
MiningSchema元素
MiningSchema包含了一個MiningField序列,MiningField包含以下屬性
- name:字段名稱
- usageType:預設是active,表示在模型中使用,如是target則是一個有監督模型的學習目标
- missingValueReplacement:缺失值填充值設定,指定一個實際值來填充該列
- missingValueTreatment:缺失值填充處理方法,包含asIs,asMean,asMode,asMedian,asValue,第一個是用原始輸入就是null來處理,後面三個是均值,衆數,中位數,最後一個是使用一個寫死的值
- invalidValueTreatment:無效值處理方式,asIs就是不處理用原始輸入,在本例中隻有離散變量會做這個操作
總結一下MiningSchema定義了模型的輸出字段,以及每個字段的異常和缺失處理邏輯。
5.2 Segmentation
Segmentation元素
Segmentation包含屬性multipleModelMethod,它指定多個模型的融合方式是modelChain,即前一個模型的輸出作為後一個模型的輸入是鍊式的,實際上,因為XGBoost用的是回歸樹,然後将所有樹的輸出結果相加得到第一個模型的輸出。除此之外multipleModelMethod還包含average ,majorityVote 等融合政策。
Segmentation中包含兩個模型,每一個模型都被包括在子元素 Segment中,通過id來辨別。先看Segment id="1"元素。
Segment id="1"元素
第一行<True/>代表PREDICATE是<True/>,說明使用該模型計算預測值。下面又是一個MiningModel,相當于的融合模型中的模型1本身又是一個融合模型。下面定義了這個融合模型的輸出Output屬性,localTransformations指定了特征轉化的工作
localTransformations元素
其中DerivedField代表派生新的字段,這裡就是把對應字段轉化為float類型。下面通過Segmentation定義這個子融合模型的融合方式,采用sum方式,一共有145個分類回歸樹(Segment id="1",Segment id="2",Segment id="3")加和逼近結果,具體看一下其中一棵樹
樹模型内容
每一個模型是一個TreeModel元素,他的屬性是functionName定義資料挖掘任務,是分類還是回歸,是必選項。這裡是回歸,因為GBDT這一類算法解決分類問題是使用的回歸樹,他需要将每個樹的預測結果和之前所有樹相加作為預測結果,預測結果和實際結果相減計算殘差,如果是采用分類基模型,label類别的相減是沒有意義的,是以GBDT采用類似邏輯回歸的對數似然函數損失來計算預測機率和實際機率的殘差。noTrueChildStrategy定義了無法到達葉子節點時預測的政策。
TreeModel有兩個子元素MiningSchema定義了輸入目前樹模型的字段,這個字段不是全局的,每棵樹不一樣。
Node元素,用于在樹模型中定義分割或葉子節點,用來定義一個嵌套規則使用其他字段如何到達這個葉子節點,就是樹模型的規則集。看一個Node
Node總覽
這是一個多層嵌套的node
多層嵌套node
其中score代表葉子節點的預測值,每個Node包含一個Predicates,Predicates可以是SimplePredicate,True。SimplePredicate:以簡單布爾表達式定義的規則,比如圖中特征score>=58.95,特征last_1_exist_infection>=1。
每個樹的預測結果是怎麼計算出來的
node層級中向右縮進的是子節點,同級的是并列node,會有一個根node給一個初始分。
- 1.所有進入該樹的特征從上到下過一遍SimplePredicate的規則,如果滿足規則,就拿SimplePredicate這一層的score作為預測得分(就是SimplePredicate的前一個縮進的Node的score屬性)
- 如果不滿足規則則拿上一層的score(SimplePredicate的前一個縮進的前一個縮進的Node的score),如果所有規則都不滿足,就拿根Node的score。
- 3.如果特征滿足多個Node規則,則取其中score最大的那個作為score,一個樹隻能産出一個score
此刻再看一下這個模型融合中第一個模型的Output和他的子融合模型的融合方式
多個樹的聚合方式
每個樹的score結果使用sum就是累計求和的方式輸出,輸出未xgbValue,這個和提升樹的原理也對上了。然後整個融合模型是modelChain方式融合的,就是把xgbValue輸出給下一個模型,然後再看整個融合模型的第二個模型
Segment id="2"
第二個模型是個RegressionModel,PMML的RegressionModel不僅可以做回歸,也可以做分類,因為可以組合多個回歸方程(回歸樹)來預測分類值。先看他的屬性functionName就是任務類型是分類任務,normalizationMethod是針對分類任務的屬性,它描述了如何将預測轉換未機率,結合下面的MiningField name="xgbValue"就是把剛才所有樹的加和結果(xgbValue是上一個融合模型的輸出)都做了logit變換(1/(1+np.exp(-sum(score))))。下面是MiningField,這裡定義了這個模型的輸入,需要把label作為target輸入。
在Output裡面分别定了1的機率和0的機率,然後到RegressionTable回歸表,如果學習任務是分類,則每個targetCategory都會有一個RegressionTable,回歸表的目的是給出回歸的結果,即每個變量的權重偏置資訊。它包含子元素NumericPredictor定義了一個數值自變量,變量名稱是xgbValue,指定了系數是1,偏置是0,是以targetCategory=1的情況就是0 + xgbValue * 1結果指派給Output中的probabilit(1)。相當于融合模型的第二個模型就是把前面所有樹的加和結果(sum(score))在求個logit函數得到最後的預測機率,整個PMML結束。
總結
- PMML的運作方式:對于提升樹,PMML的主要内容(服務于預測)是資料字典(DataDictionary)、挖掘模型(MiningModel專用于模型融合的元素),它把每棵樹的葉子節點路徑和葉子節點的score值作為布爾邏輯規則寫在PMML,并且定義加和融合的方式,在輸出層定義logit變換方式,這些内容是跨語言的,相當于把模型檔案寫成XML格式,描述模型的内部邏輯。當有新的資料進來時,根據資料字典規則,經過資料缺失填充,異常處理邏輯,然後從第一顆樹開始走規則表,每個樹的score相加,最後求logit,在PMML裡面把資料經過布爾條件,簡單運算即可得到預測結果。
- 提升樹的原理:提升樹每個樹是回歸樹,将所有樹輸出結果求和相加,最後做logit變化得到預測機率。
本文參考:
PMML 4.3 - Regression
pmml模型檔案解析與自定義_pmml檔案_Catherine_In_Data的部落格-CSDN部落格