pmml_再访PMML

pmml

嗨伙计! 从今年年初开始,就有了重新设计Drools PMML模块的计划。

在这篇文章中,我将描述我们将如何处理它,目前的状态,未来发展的想法等,等等……敬请期待!

背景

PMML是一个标准,旨在“ 为分析应用提供一种描述和交换由数据挖掘和机器学习算法产生的预测模型的方法。 ” PMML标准定义了一系列受管理的模型,我们将其称为“模型”。

换句话说,这可能不是那么明显的结果是,PMML可以被认为是不同预测模型的协调器 ,每个预测模型都有不同的要求。 Drools有其自己的PMML实现。 它的原始设计是基于100%流口水引擎的,但是从长远来看,这对所有模型都不令人满意,因此决定采用不同的方法来实现新版本。 现在,这里的故事开始了……

要求

简而言之,PMML实现应允许:

  1. 加载PMML文件(xml格式)
  2. 提交输入数据
  3. 返回预测值

听起来很简单,不是吗?

方法

拟议的体系结构旨在遵循“清洁体系结构”原则以模块化方式满足要求。

为了实现这一点,定义了清晰的边界和可见性的组件。 总体思路是,存在与核心功能严格相关的特定任务,而其他“外部”功能则应保持不可知。 任何想深入研究此问题的人都可以阅读RC Martin撰写的“ Clean Architecture”一书,但从本质上讲,将good-ol的设计原则应用于整个体系结构只是一个问题。 明确定义此目标后,实现该目标所需的步骤为:

  1. 识别核心逻辑和实施细节(特定于模型)
  2. 在“独立”模块中实现核心逻辑
  3. 为特定于模型的模块编写代码

我们选择实现插件模式以将核心逻辑绑定到特定于模型的实现,主要有两个原因:

  1. 增量开发和整体代码管理:核心模块本身不依赖于任何特定于模型的实现,因此可以增量地提供/更新/替换后者,而不会对核心产生任何影响
  2. 可以用自定义的实现替换提供的实现
  3. 我们还预见到了可能会根据原始PMML结构在运行时选择实现的可能性(例如,根据给定PMML的大小使用其他实现可能是有意义的)

(我作弊:那是三个)

  1. 这是原始PMML模型的Kie表示形式的定义。
  2. 对于每个实际模型,都有特定的实现,并且可以是任何类型的对象(java映射,drools规则等)。

我们可以避免吗? 也许。 我们可以使用由规范的xsd直接生成的模型。 但这是为了描述所有预测模型而设计的,尽管它们中的任何一个都可能以不同的方式和不同的约定使用它。 因此,此内部视图将准确表示每个特定模型所需的内容。

组件

我们确定了以下主要功能组件:

  1. 编译器
  2. 组装工
  3. 执行者

编译器

该组件读取原始PMML文件并将其翻译为我们的内部格式。

它的核心方面只是将xml数据解组到Java对象中。 然后,它使用Java SPI检索特定于给定PMML模型的模型编译器(如果找不到模型编译器,则将PMML忽略)。

最后,检索到的模型编译器会将原始PMML模型“转换”为我们特定于模型的表示形式( KiePMMLModels )。

该组件的核心部分不直接依赖于任何特定的Model Compiler实现 ,甚至不依赖于任何Drools / Kie –因此,它基本上是一个轻量级/独立的库。 如果该组件的执行不是很费时,则可以在运行时 (即,在客户项目的执行期间)或在kjar的编译期间(例如,对于流口水实现的模型)调用该组件。

组装工

编译器内KIE知识库创建该组件存储KiePMMLModels。 其他组件都不应该对此组件有任何依赖性/知识。

反过来,它必须对实际没有任何依赖性/知识/引用 模型编译器实现。

该组件负责PMML模型的实际执行。 它接收PMML输入数据,检索特定于输入数据的KiePMMLModel并计算输出。

对于每个模型,都有一个特定的“执行器”,以根据模型类型允许不同类型的执行实现(drool,外部库等)。 它的核心端仅接收输入数据并检索特定于给定PMML模型的模型执行器(如果找不到,则将忽略PMML)。 最后,检索到的模型执行者将基于输入数据评估预测。 该组件的核心部分不直接依赖于任何特定的Model Executor实现,但是当然严格依赖于Drool运行时。

整体架构

模型实施

基于Drools的模型

一些模型将委托给drools引擎,以在重载下实现最佳性能。 以下是有关此类实现的一般方案的一些详细信息。

  1. 编译器在生成kjar时(或在运行时热加载PMML文件时)被调用
  2. 编译器读取PMML文件并将其转换为“ descr”对象(请参见BaseDescr , DescrFactory , DescrBuilderTest )
  3. 不管如何调用模型编译 器,都必须在调用drools编译器后立即对其进行调用,以使基于descr对象生成Java类
  4. 汇编器将生成的类放在kie base中
  5. 执行程序加载生成的“ drools模型”,并使用输入参数调用它

DRL详细信息

  • 对于DataDictionary中的每个字段,必须定义一个特定的DataType
  • 对于树的每个分支/叶子,必须生成全路径规则(即具有到达路径的规则-例如,“晴天”,“晴天温度”,“晴天温度湿度”)
  • 创建了一个“状态持有者”对象,该对象包含已触发规则的值–更改该值将触发与之匹配的子分支/叶规则(例如,规则“ sunny”将触发“ sunny_temperature”,而后者又将触发) “ sunny_temperature_humidity”)
  • 此类“状态持有人” 可能包含评估的信息/部分结果,最终将在需要结果组合的地方使用
  • 价值缺失策略可以在身份持有者内部实施, 可以作为爆炸规则

测试中

对于每个模型,都会有一组标准的单元测试,以主要验证各个代码单元。 除此之外,在特定于模型的模块内(是的,它绕口令),将有一个集成测试子模块。 后者将验证不同或多或少复杂的PMML文件的整体正确执行,以尽可能模拟实际场景中可能发生的情况。

回归

回归模型是第一个实现的模型。 由于其固有的简单性,我们选择为其提供纯基于Java的实现。 目前,它仍处于PR之下,并且正在添加新的完整测试。

在评估了所有优点/缺点之后,我们认为该模型可以作为采用基于流口水的方法来实施的很好的候选者。 作为一个易于遵循的简单模型,我们选择将其用作流口水方法的第一个测试。

待办事项

这是尚未实现的,与特定模型没有严格关联的缺失功能的列表。 在开发过程中将对其进行更新:

  • 设置基准框架项目(请参阅Drools基准 )
  • 管理扩展标签(请参阅xsdElement_Extension )
  • 管理SimpleSetPredicate标记(请参阅SimpleSetPredicate )
  • 细分中实现VariableWeight (动态替代静态“权重”值)

不用说,任何评论(尤其是好的评论)和建议将不胜感激。

接下来的几天再回来看看下一步!

再见!

翻译自: https://www.javacodegeeks.com/2020/02/pmml-revisited.html

pmml

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331711.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java集合——视图与包装器

【0】README 0.1) 本文描述转自 core java volume 1, 源代码为原创,旨在理解 java集合——视图与包装器 的相关知识; 0.2) for full source code , please visit https://github.com/pacosonTang/core-java-volume/b…

php把表单转为json保存,javascript – 使用jquery将表单数据保存到本地json文件中

我有一个带有一些输入字段的基本表单.我想在提交表单时将表单数据保存到json文件中.json文件中保存数据的格式应如下所示.[{"title":"some text","description":"some text","info":"some text","username&q…

java之包装类与BigInteger、BigDecimal

一、包装类 (1)包装类与原类型 Integer int 的包装类 Boolean boolean 的包装类 Character char的包装类 Double double的包装类 Float float 的包装类 Byte …

哈希值 哈希表_哈希杰森

哈希值 哈希表我最近写了一个简单的库,可预测地对json进行哈希处理 。 该实用程序基于出色的Jackson Json解析库构建 问题 我需要从相当大的基于json的内容生成的哈希值,以便稍后确定该内容是否发生了更改。 将json视为字符串不是格式化的选项&#xf…

新浪微博搜索php待遇,新浪微博面试

PHP技术基础1、合并数据的函数。我当时回答的是array_merge(),array_combine()(注意与前者的区分);当时面试官告诉我还可以使用 加号()2,判断一个IP地址是否合法。只让说一下思路:(1)用点分割.,$arrIp explore();(2)判…

java集合——集合与数组间的转换+算法

【0】README 0.1) 本文描述转自 core java volume 1, 源代码为原创,旨在理解 java集合——集合与数组间的转换算法 的相关知识; 0.2) for full source code , please visit https://github.com/pacosonTang/core-jav…

java之String

一、String类的特性 String对象是不可变的,字符串一旦创建,就不可以改变。二、构造字符串字符串直接量String anew String("字符串直接量"); 字符数组String bnew String(chars);字符串直接量赋值,java把字符串直接量看作String对象…

java记录目录树_Java记录

java记录目录树https://openjdk.java.net/jeps/359概述了Java的新功能,该功能可能会/将在某些将来的Java版本中实现。 JEP建议使用一种新的“类别”:记录。 JEP中的示例内容如下: record Range( int lo, int hi) { public Range { if (lo >…

java集合——遗留的集合

【0】README 0.1) 本文描述转自 core java volume 1, 源代码为原创,旨在理解 java集合——遗留的集合 的相关知识; 0.2) for full source code , please visit https://github.com/pacosonTang/core-java-volume/blo…

oracle 扩展分区,Oracle 在线扩展分区

在对Oracle分区表操作是,当一个分区已经有了最大的分区,如何再次扩展分区呢?简单的方式是先删除最大分区,然后添加需要的分区在对Oracle分区表操作是,当一个分区已经有了最大的分区,如何再次扩展分区呢&…

java之StringBuider与StringBuffer

一、StringBuider与StringBuffer StringBuider与StringBuffer类比String更加灵活,只要使用字符串的地方,都可以使用StringBuider与StringBuffer类。三者的共同之处都是 final 类,不允许被继承,这主要是从性能和安全性上考虑的&…

织机原理_项目织机

织机原理为什么为什么? Java 8流背后的驱动程序之一是并发编程。 在流管道中,指定要完成的工作,然后任务将自动分配到可用处理器上: var result myData.parallelStream().map(someBusyOperation).reduce(someAssociativeBinOp)…

java集合——java.util.Properties类

【0】README 0.1)以下全文转自 :  http://trans.blog.51cto.com/503170/110227/ 【1】认识properties文件 1、 properties文件是一个文本文件2、 properties文件的语法有两种,一种是注释,一种属性配置。 注 释:前…

电力系统潮流计算matlab程序,大神们,求个电力系统潮流计算的matlab程序。

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼ninput(Please input n\n); %n表示系统的节点数d0input(Please input d0\n); %d0表示系统的误差minput(Please inpit m\n); %m表示系统的pq节点的个数p0ones(n-1,1);q0ones(m,1);d1;dpvones(n-1,1);dqvones(m,1);dpzeros(n-1,1);dq…

java之正则表达式

一、匹配字符串String类的matchs方法用的是正则表达式匹配,matchs方法与equals类似。"javac".matchs("javac");"javac".equals("javac");结果都为true。match方法更强大,不仅能匹配固定字符串,还能匹…

gradle配置_Gradle配置

gradle配置在这篇文章中,我们将介绍有关Gradle配置的综合文章。 1.技术 Gradle是用于自动任务管理的开源构建工具。 它基于Apache Ant,Apache Maven的概念。 Gradle是使用Groovy语言开发的。 Gradle是使用基于Groovy的领域特定语言(DSL&…

removeAll throws java.lang.UnsupportedOperationException

【1】出现的问题&#xff1a; 如果该列表list 不支持 removeAll 方法的话&#xff0c; 就会抛出UnsupportedOperationException 【2】解决方法&#xff1a; List<String> list new ArrayList(Arrays.asList(new String[]{"C","B","D"})…

C#的float、double与decimal

float 单精度浮点 32bit&#xff0c;double 双精度浮点64bit&#xff0c;decimal是高精度 128bit&#xff0c;浮点型。 float double 是 基本类型&#xff08;primitive type&#xff09;&#xff0c;decimal不是。 float 有效数字7位&#xff0c;范围 1.5 10E−45 to 3.4 …

matlab支持 编程语言,用于数学的10个优秀编程语言

原标题&#xff1a;用于数学的10个优秀编程语言译文&#xff1a;http://www.codeceo.com/article/10-programming-language-for-math.html英文&#xff1a;10 Great Programming Languages for Mathematics翻译&#xff1a;码农网 – 小峰作为一个对数学和编程语言充满激情的人…

java锁_Java锁

java锁锁是一种线程同步机制&#xff0c;例如同步块。 锁是使用同步块在内部实现的。 因此&#xff0c;我们可以在Java中使用锁代替同步关键字。 锁比同步块更灵活&#xff0c;更复杂。 从Java 5版本开始&#xff0c;JDK提供了几种锁实现&#xff0c;例如ReentrantReadWriteLo…