前言
本文主要描述决策树模型文件的结构。首先举例,再进行详细说明
模型文件举例
<?xml version="1.0" encoding="UTF-8"?>
<decision_tree>
<factors>
<factor id="Age" index="0">
<value>below 20</value>
<value>above 20</value>
</factor>
。。。
</factors>
<paths>
<path index="1">0:0</path>
<path index="2">0:1</path>
<path index="5">0:1|2:0</path>
<path index="6">0:1|2:1</path>
<path index="5">0:0|1:2</path>
<path index="0">0:0|1:0</path>
<path index="4">0:0|1:1</path>
</paths>
<decisions>
<decision id="decision0" index="0"/>
<decision id="decision1" index="1"/>
<decision id="decision2" index="2"/>
<decision id="decision3" index="3"/>
<decision id="decision4" index="4"/>
<decision id="decision5" index="5"/>
<decision id="decision6" index="6"/>
</decisions>
</decision_tree>
模型结构
由上面的内容可以看出,模型文件包含factors,decisions和paths等元素
Factors节点
包含多个factor节点,代表用户定义的所有factor的集合。
Factor节点
包含两个属性和多个文本值
- Id:名字
- Index:代表唯一的factor索引值
- value:代表factor的某个取值
decisions节点
包含用户定义的所有decision
Decision节点
包含两个属性
- Id:名字
- Index:代表唯一的decision索引值
Paths节点
包含所有可以触达到某个decision的路径的集合
path节点
代表一个可以到达某个decision的factor的路径。包含一个属性和一个路径值:
- Index:该路径对应的决策index
- 路径值:由|分隔的一系列节点间的链接。每个链接由:分隔的factor的index和factor value的index所组成
举两个例子方便大家理解
样例1
0:1 代表该路径匹配index值为2的decision,既”decision2” 0:1代表第0个factor的第1个值。既factor: Age对应的第一个值above 20 由之前的图可以看出当Age above 20的时候,可以获得decision2
样例2
0:0|1:1 该path可以匹配index为4的decision,既decision4 0:0|1:1代表两个链接:
- 0:0。含义为第0个factor的第0个值,既Age below 20
- 1:1。含义为第1个factor的第一个值,既Rank为level 2
新增模型元素
从install 1.2.0开始,xdecision tree editor的模型文件增加了三个节点。commnets, parser和evaluator。 commnets允许用户为决策树增加注释;另外两个支持用户更好的定制决策树的使用过程。
样例
增加的属性在属性窗口可以进行编辑
<?xml version="1.0" encoding="UTF-8"?>
<decision_tree>
<comments/>
<parser/>
<evaluator>com.xrosstools.xdecision.ext.AviatorPathEvaluator</evaluator>
<factors>
<factor id="A" index="0">
<value>< 20</value>
<value>> 20</value>
</factor>
<factor id="B" index="1">
<value>== true</value>
<value>== false</value>
</factor>
<factor id="C" index="2">
<value>== 'abc'</value>
<value>== 'def'</value>
</factor>
</factors>
<paths>
<path index="1">0:0</path>
<path index="2">0:1</path>
<path index="3">0:0|1:0</path>
<path index="4">0:0|1:1</path>
<path index="5">0:1|2:0</path>
<path index="6">0:1|2:1</path>
</paths>
<decisions>
<decision id="decision0" index="0"/>
<decision id="decision1" index="1"/>
<decision id="decision2" index="2"/>
<decision id="decision3" index="3"/>
<decision id="decision4" index="4"/>
<decision id="decision5" index="5"/>
<decision id="decision6" index="6"/>
</decisions>
</decision_tree>
comments节点
还允许用户为决策树添加注释(之前的注释的实现有bug)
parser
用于解析用户自定义的factor或decision。如果没有提供,则缺省实现DefaultParser就是简单的使用对应的字符串。对应接口为:
public interface XDecisionTreeParser {
Object parseFact(String name, String value);
Object parseDecision(String name);
}
如果不提供自定义实现,则缺省实现为:
evaluator
允许用户自定义如何对path进行解析。返回值时某个factor的path/value。接口定义:
public interface PathEvaluator {
Object evaluate(Facts facts, String factorName, Object[] paths);
}
如果不提供自定义实现,则缺省实现为:
AviatorPathEvaluator
从xdecision 2.0.0开始提供基于AviatorEvaluator的path实现。xdecision本身对其maven依赖的scope为provided。因此如果用户使用该类,请在主项目里自行添加依赖。
该实现主要是为了支持用户对factor下面的路径进行动态解析。具体做法是用factor的名字拼接上路径上的字符串作为表达式来求值。
具体示例可以参考:
XrossEvaluator
为了让用户使用类似SQL的语法定义决策树的条件,从xdecision 2.1.0开始提供XrossEvaluator。这个evaluator同时实现了XDecisionTreeParser 和PathEvaluator 接口。并且不依赖任何第三方组件。
XrossEvaluator的用法是类似 操作符 操作数 的形式。目前支持以下操作符:
操作符 | 含义 | 示例 |
---|---|---|
== | 等于 | == 123 |
<> | 不等于 | <> 123 |
> | 大于 | > 123 |
>= | 大于等于 | >= 123 |
< | 小于 | < 123 |
<= | 小于等于 | <= 123 |
IS NULL | 为空 | IS NULL |
IS NOT NULL | 不为空 | IS NOT NULL |
BETWEEN | 在上下界之间 | BETWEEN 123, 456 |
NOT BETWEEN | 不在上下界之间 | NOT BETWEEN 123, 456 |
IN | 在给定范围里面 | IN 1, 2, 3, 4, 5 |
NOT IN | 不在给定范围里面 | NOT IN 1, 2, 3, 4, 5 |
STARTS WITH | 以给定值为开头 | STARTS WITH '123' |
ENDS WITH | 以给定值为结尾 | ENDS WITH '123' |
CONTAINS | 包含给定值 | CONTAINS '123' |
数值类型
XrossEvaluator支持以下数据类型:
* 数字型,可以直接写数字,例如,123,123.456等
* 字符型,单引号括起来的字符串。例如'abc'
* 变量,factor的名字。例如 A。变量可以是普通的数值,字符串或者是集合类型
操作数支持变量
除了不带操作数的操作符IS NULL和IS NOT NULL之外,带操作数的操作符,其操作数可以是常量,也可以是基于factor的变量。例如:
== A,IN 123, AList, BETWEEN A,B。等等
综合示例: