摘要:PMML
,GBDT
PMML介绍
PMML(Predictive Model Markup Language)预测模型标记语言,是基于标记语言XML创建的应用标准语言,是W3C的标准语言。PMML就是以XML为基础描述模型的数据定义、数据转化、模型构建、输出内容多一系列操作,可以在不同平台是新数据交换、模型共享,在1997年诞生,到目前已经升级到4.4版本,由数据挖掘组织DMG负责维护升级。
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文件内容
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
根元素中定义了三个属性
-
xmlns
:代表默认命名空间
,是xml name space的意思,命名空间指定一个URI(网址链接),这个URI的作用仅仅是用来唯一标识,并没有取这个链接拉取数据资源。命名空间的目的是为了解决不同领域的XML词汇同名冲突的问题,就相当于申明了下面所有的元素名称都是在“http://www.dmg.org/PMML-4_4”规范下的。默认命名空间没有前缀,因此在下面的包含体中所有没有前缀的元素和属性都属于这个默认命名空间。 -
xmlns:data
:代表显式命名空间
,使用冒号间隔,冒号后面的内容是用户自定义的,在下面的包含体中所有以前缀+冒号开头的元素都属于这个显式命名空间。 -
version
:表示PMML标准版本号,这个是必选属性。
(2)Header元素
Header是必须在PMML中出现的,且出现在第一个,Header描述了这个模型时何时使用什么程序生成的。上图中有两个子元素
-
Application
:生成模型的应用程序描述,又包含name和version两个属性,表示生成该PMML的程序时JPMML_SkLearn,JPMML_SkLearn版本时1.6.35。 -
Timestamp
:创建该PMML模型的时间戳。
(3)MiningBuildTask元素
这个代表挖掘任务,包含模型的训练信息,主要是模型训练和创建时的配置信息。上图所示就是Sklearn的Pipeline,其中包含一个叫preprocessor的ColumnTransformer预处理过程和一个叫classifier的XGBClassifier过程。其中预处理过程包含好多,既有对缺失值的填充,又有onehot,其中本例中是对每一个列单独起的一个SimpleImputer,因为采用均值填充的方式,每个列的均值不一样。
(4)DataDictionary元素
DataDictionary数据字典定义了数据的类型和取值范围,训练和预测数据都需要符合这个数据字典的约定。DataDictionary是PMML必选的元素。
DataDictionary的子元素DataField定义了列,他又有name,optype,dataType三个属性
-
name
:字段名称,是唯一的 -
optype
:度量尺度,比如连续型,离散型 -
dataType
:数据类型,比如字符串string,证书integer,小数double
DataField有子元素Value,定义了离散变量的取值集合,其中包含了字符串null。
(5)MiningModel元素
从这个元素开始进入模型部分,先看一下这个元素的整体结构
MiningModel
是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包含了一个MiningField序列,MiningField包含以下属性
-
name
:字段名称 -
usageType
:默认是active,表示在模型中使用,如是target则是一个有监督模型的学习目标 -
missingValueReplacement
:缺失值填充值设定,指定一个实际值来填充该列 -
missingValueTreatment
:缺失值填充处理方法,包含asIs,asMean,asMode,asMedian,asValue,第一个是用原始输入就是null来处理,后面三个是均值,众数,中位数,最后一个是使用一个写死的值 -
invalidValueTreatment
:无效值处理方式,asIs就是不处理用原始输入,在本例中只有离散变量会做这个操作
总结一下MiningSchema定义了模型的输出字段,以及每个字段的异常和缺失处理逻辑。
5.2 Segmentation
Segmentation包含属性multipleModelMethod
,它指定多个模型的融合方式是modelChain,即前一个模型的输出作为后一个模型的输入是链式的,实际上,因为XGBoost用的是回归树,然后将所有树的输出结果相加得到第一个模型的输出。除此之外multipleModelMethod还包含average ,majorityVote 等融合策略。
Segmentation中包含两个模型,每一个模型都被包括在子元素 Segment中,通过id来标识。先看Segment id="1"元素。
第一行<True/>代表PREDICATE是<True/>,说明使用该模型计算预测值。下面又是一个MiningModel,相当于的融合模型中的模型1本身又是一个融合模型。下面定义了这个融合模型的输出Output
属性,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
其中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输出给下一个模型,然后再看整个融合模型的第二个模型
第二个模型是个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变化得到预测概率。
本文参考:
https://dmg.org/pmml/v4-3/Regression.html
https://blog.csdn.net/zhouwenyuan1015/article/details/120143318