热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

规则引擎与机器学习比较与结合

机器学习正在席卷全球,许多使用规则引擎做出业务决策的公司开始利用它。然而,这两种技术针对不同的问题。规则引擎用于执行需要100%精度的离散逻辑。另一方面,机器学习专注于获取大量输入



机器学习正在席卷全球,许多使用规则引擎做出业务决策的公司开始利用它。然而,这两种技术针对不同的问题。规则引擎用于执行需要 100% 精度的离散逻辑。另一方面,机器学习专注于获取大量输入并尝试预测结果。了解这两种技术的优势非常重要,这样您才能确定问题的正确解决方案。在某些情况下,不是其中之一,而是如何将两者结合使用以获得最大价值。

业务逻辑、计算和工作流程
让我们首先从了解业务逻辑开始。多年来,我一直在系统中使用各种类型的逻辑,理解上下文很重要。

什么是业务逻辑?最简单的形式是包含管理业务流程的决策的逻辑。这些决策是业务决策。逻辑往往会随着市场的变化而变化,并且可能经常根据特定行业的驱动因素而变化。逻辑侧重于为什么和何时。最终,在采取行动之前,条件必须为真。

业务逻辑通常利用业务计算。与业务逻辑不同,业务计算往往保持不变。他们专注于什么和如何。将这两者从部署方面分离是很重要的,因为它们以不同的速率变化。作为一般规则,任何可重用的逻辑都应该是可独立部署的。如果可重用逻辑与应用程序部署相关联,则它不能单独重用并与其他组件耦合。理想情况下,我们希望将应用程序的可重用部分分解为微服务,以便它们可以独立重用和部署。

我们如何将业务逻辑的不同步骤连接在一起?工作流程。 它们是业务流程中工作任务的结构化流程或顺序。工作流可以是基于人的、基于系统的(例如编排)或两者的混合。

实现业务逻辑的方法
现在我们了解了这些部分是如何组合在一起的,让我们讨论一些构建业务逻辑的方法。
一般来说,实现业务逻辑有三种不同的方法:应用程序代码、决策表和规则引擎。
当逻辑变化不大并且相当简单时,应用程序非常适合。

决策表非常适合经常更改并且具有大量条件的逻辑,这些条件在表中比代码更易于管理。

规则引擎




规则引擎非常适合经常更改且高度复杂且涉及多个逻辑级别的逻辑。规则引擎通常是业务规则管理系统 (BRMS) 的一部分,它提供了广泛的功能来管理复杂性。 如果我们将此指南放入象限中,它将如下所示:




随着复杂性和变化率的增加,应用程序代码不再适合业务逻辑。随着变化率的增加,决策表提供了一些缓解,但最终 BRMS 提供了最适合高变化率和高复杂性的情况。

业务规则管理系统 (BRMS)
让我们通过查看以下功能参考视图来仔细了解 BRMS 的功能:



上图BRMS能力参考视图

让我们来谈谈这个参考视图中的几个关键功能,并重点介绍一些也与机器学习功能重叠的功能。

1、规则创作


  • 技术规则或指导规则提供了两种不同的方式来编写针对不同最终用户的规则。技术规则更适合您的开发人员受众,其中指导性规则由指向和点击方法组成,可能更适合技术较少的用户。
  • 领域特定语言 (DSL) 是另一种可以使非技术用户以更易于使用的语言编写规则的功能。
  • 神经网络是机器学习中使用的一种算法形式,有趣的是,一些 BRMS 已与此集成。


2、规则管理
规则存储库是 BRMS 最强大的功能之一。它是一种机制,开发人员可以在其中找出已经构建的内容以及他们可以重用的内容。规则元数据存储在这里,这对于理解潜在意图至关重要。

3、部署
通常,可以通过以下两种方式之一部署规则 - 作为 通过 REST API 调用调用的独立服务的一部分,或者作为应用程序的一部分嵌入(进程内)。在本文稍后,我们将看到机器学习平台共享一个类似的模型。

4、规则执行和部署

预测模型标记语言 (PMML)或便携式分析格式 (PFA)都是使模型可互换的行业标准格式。它们使您能够以一种语言或平台构建模型,并将其移植到支持 PMML 或 PFA 的另一种语言或平台。
一个这样的 BRMS 示例是Drools。Drools 是一个开源的 Apache 许可的、基于 Java 的规则引擎。它支持利用phreak-algorithm-con_decision-engine" class='body_href' >PHREAK 算法的前向和后向链接推理引擎。如果您希望规则引擎决定规则的顺序,此推理引擎会派上用场。Drools 提供指导性规则、技术规则 DRL 语法以及对领域特定语言 (DSL) 的支持。Drools 还支持进程内和独立部署模型。

机器学习平台
现在我们对规则引擎有了很好的理解,让我们将它们与机器学习平台进行比较。在上一篇文章中,我概述了机器学习是什么以及如何将它与开源 BPM一起使用。在一篇类似的文章中,我解释了如何将机器学习与Akka一起使用。现在让我们看一下机器学习平台的能力参考视图。



上图机器学习平台能力参考视图

让我们谈谈一些关键功能,并再次与 BRMS 视图类似的重叠部分联系起来。

1、数据摄取
数据是机器学习中最重要的东西。您的模型与您的数据一样好。您需要尽可能多的数据,其中可能包括批处理和实时数据源。

2、特征工程
特征是模型的输入,一些 ML 平台为您提供创建这些特征的功能。其他人提供可以为您自动生成功能的功能。

3、建模范式
这些是可以在机器学习模型中使用的不同算法。这里需要注意的重要一点是,它们不与Supervised、UnSupervised或Reinforcement Learning类别相关联,而是可以在所有三个类别中使用。

4、部署与执行
您会注意到此领域中的 BRMS 功能有一些相似之处,特别是进程内和独立 REST API 部署以及对 PMML 的支持。

5、管理
管理机器学习模型最重要的方面之一是监控它的准确性。机器学习的一个常见谬误是机器学习模型永远不需要重新训练,因为它可以自我学习。情况并非如此,因为机器学习模型必须经常重新训练,因为它们所训练的数据开始偏离它们在生产中执行的数据。

通过将机器学习平台的能力与规则引擎进行比较,我们现在可以看到在能力级别上存在相似之处和不同之处。鉴于这些领域的产品如何继续变得更紧密,可以理解两者之间的选择有多困难。





何时使用规则引擎与机器学习的指南
那么我们如何决定何时使用规则引擎或机器学习呢?要回答这个问题,我们从逻辑、逻辑类型、什么创建逻辑、数据这几个维度来回答这个问题。规则非常适合以下情况:


  • 逻辑:确切的逻辑是已知的。使用规则,您可以提前知道要执行的逻辑。
  • 逻辑类型:基于精度。如果那么业务逻辑是精确的并且不涉及任何预测。它基于对事实的评估产生布尔类型的结果。
  • 逻辑创造:由人类完成。软件工程师或业务用户创建代表业务逻辑的规则。
  • 数据:不需要自动从数据中推导出逻辑。分析通常会事先对数据进行以确定确切的逻辑应该是什么。

现在,让我们看看使用这些相同维度的机器学习:

  • 逻辑:确切的逻辑未知。相反,在创建预测中重要的输入/特征可能是已知的。
  • 逻辑类型:使用算法进行预测。
  • 逻辑创建:由通过训练使用算法运行的机器学习软件创建。
  • 数据:用于最终生成模型逻辑。是机器学习中最重要的东西。您希望使用尽可能多的数据,并确保数据是公正的。如果数据有偏差,那么模型就会有偏差。

总之,当您需要精确并了解逻辑时,请利用规则引擎;当您想预测某事但不知道如何准确预测时,可以利用机器学习。
但它总是那么清晰吗?如果你想利用两者的力量呢?答案是你可以。有许多混合模式,您可以在其中一起使用机器学习和规则来确定结果。让我们看一个示例用例。

结合使用机器学习和规则引擎的模式
想象一个用例,您是一名房地产经纪人,希望为您的客户提供购买房屋的最佳指导。也许他们对几个感兴趣,但不确定他们应该多快采取行动。让我们通过三种不同的模式将机器学习和规则结合在一起来实现这一点。

模式 1:利用机器学习输出作为规则的输入
在这种模式下,执行两种不同的机器学习模型。一个人确定房子在 10 天内出售的概率。另一个决定了卖家降低要价的概率。这两个预测都是规则的输入。然后,这些规则评估模型的输出并最终向房地产经纪人提供建议。具体来说,如果房子在 10 天内卖出的概率大于 50%,而卖家降价的概率小于 50%,那么这种模式对房地产经纪人做出了具体的推荐。




模式 2:利用规则输出作为机器学习模型的特征输入
在这种模式中,我们从作为机器学习模型输入的规则开始。规则执行业务逻辑以确定基于布尔值的值。房子需要维修吗?是销售淡季吗?卖家要不要把房子卖掉现在卖掉?这些规则的输出然后是机器学习模型的特征。然后,机器学习模型向房地产经纪人提供了 10 天内出售房屋以及卖家降价的概率。请注意,在此模式中,不会向房地产经纪人提供建议,而是提供概率并将最终建议留给房地产经纪人。




模式 3:利用规则和机器学习输出作为输入
在此模式中,它遵循前两种模式的混合。规则和机器学习输出都是机器学习模型的输入。在这种情况下,卖家降价的概率是 10 天内房屋出售概率的输入。这种模式也将最终建议留给房地产经纪人。




示例实现
现在让我们将这些模式应用到实际的概念证明中。我将基于我在上一篇文章中构建的响应式微服务机器学习概念验证来构建。我们将对其进行增强以包含机器学习模型作为输入的规则服务。它将使用上面的模式 1,利用机器学习输出作为规则的输入。
让我们从我们在概念验证中所做的更改开始,以支持规则与机器学习的集成。下面是一个说明架构的图表:




我们引入的一件新事物是基于 Java 的规则 MS。这是将评估机器学习模型概率输出的规则微服务。
H20 输出一个置信度值作为其预测的一部分。对于机器学习模型确定为 OK/Not Fraudulent 的交易,规则服务将检查此置信度值。
如果置信度值小于 50%,那么它将评估一些额外欺诈检查的输出,在这种情况下是名称和地址。如果其中任何一个失败,规则将建议交易是欺诈性的。
这是一个遍历这些步骤的序列流:




现在让我们看一下 Java Rules MS 代码,看看 drools 规则是如何运作的。

 rule “Trans OK and Prob <0.50 and name check fail”
  when
     m : RulesData( modelProb <= 0.50, mymodelProb : modelProb)
     RulesData( status == “Transaction OK” )
     RulesData( nameCheck <= 0 )
  then
     m.setStatus(“Fraudulent Transaction from Rules, name check   
     failed”);
end
rule “Trans OK and Prob <0.50 and address check fail”
  when
     m : RulesData( modelProb <= 0.50, mymodelProb : modelProb)
     RulesData( status == “Transaction OK” )
     RulesData( addressCheck <= 0 )
  then
     m.setStatus(“Fraudulent Transaction from Rules, address check
     failed”);
end


  
我们可以看到这是使用 Drools drl 语法,这是一种编写技术规则的方式。有两条规则都检查交易是否正常以及机器学习输出是否小于 50%。第一条规则还检查名称检查是否失败,第二条规则检查地址检查是否失败。您会注意到 Drools 中没有任何 else 子句。那是根据您指定的条件设计和规则触发。在每个规则中,您会注意到一个 RulesData 函数正在检查多个变量的状态。为了根据数据评估 Drools 规则,您必须创建一个表示数据模型的 POJO。这将包括 getter 和 setter。请参见下面的示例:

    public static class RulesData {
  private int nameCheck=0, addressCheck=0;
  private String status=null;
  private double modelProb=0;
  public String getStatus() {
     return this.status;
  }
  public int getNameCheck() {
     return this.nameCheck;
  }
  public int getAddressCheck() {
     return this.addressCheck;
  }
  public double getModelProb() {
     return this.modelProb;
  }
  public void setNameCheck(int nameCheck) {
     this.nameCheck = nameCheck;
  }
  public void setAddressCheck(int addressCheck) {
     this.addressCheck = addressCheck;
  }
  public void setModelProb(double modelProb) {
     this.modelProb = modelProb;
  }
  public void setStatus(String status) {
     this.status = status;
  }
}


  
让我们看一下调用 Drools 规则的 Java 代码片段,如下所示:

 

  //run drools rules
KieServices ks = KieServices.Factory.get();
KieContainer kCOntainer= ks.getKieClasspathContainer();
KieSession kSession = kContainer.newKieSession("ksession-rules");
// go !
kSession.insert(applicant);
kSession.fireAllRules();
kSession.destroy();


  
此代码创建一个 KieSession,然后将我们希望规则执行的数据插入到 KieSession 中。FireAllRules()告诉 Drools 这样做,解雇所有规则。然后Destroy()用于清理。基于 Java 的 Rules MS 获取 drools 规则的输出,并最终将其写入 Kafka 以供使用。

概括
规则和机器学习各有千秋,结合使用会更加强大。为问题使用正确的解决方案是关键。当您需要精确性并了解逻辑时利用规则,当您想要预测某事但不知道如何准确预测时利用机器学习。两者都可以用于反应式微服务架构风格,提供更易于维护、可扩展和更快的架构交付。
我希望您发现这个博客很有价值,并感谢您的宝贵时间!

推荐阅读
author-avatar
夫妇郭_390
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有