ai.onnx.ml - 树集成¶
树集成 - 5 (ai.onnx.ml)¶
版本¶
域:
ai.onnx.ml
自版本:
5
函数:
False
支持级别:
SupportType.COMMON
形状推断:
True
此版本的运算符自域ai.onnx.ml版本5起可用。
摘要¶
树集成运算符。返回批次中每个输入的回归值。输入具有维度[N, F]
,其中N
是输入批次大小,F
是输入特征的数量。输出具有维度[N, num_targets]
,其中N
是批次大小,num_targets
是目标的数量,它是一个可配置的属性。
此属性的编码沿树的内部节点和叶子节点进行拆分。值得注意的是,以nodes_*
为前缀的属性与内部节点相关联,而以leaf_*
为前缀的属性与叶子节点相关联。所有nodes_*
字段都必须具有相同的长度,并对元组序列进行编码,如通过获取给定位置的所有nodes_*
字段所定义。
所有以leaf_*
为前缀的字段都表示树的叶子节点,并且类似地定义叶子节点的元组,并且必须具有相同的长度。
此运算符可用于实现以前的TreeEnsembleRegressor
和TreeEnsembleClassifier
节点。 TreeEnsembleRegressor
节点直接映射到此节点,并且需要更改节点的表示方式。 TreeEnsembleClassifier
节点可以通过在此节点之后添加ArgMax
节点来实现,以确定顶级类。为了对类标签进行编码,可以使用LabelEncoder
或GatherND
运算符。
属性¶
aggregate_function - INT(默认值为
'1'
)定义如何在目标内聚合叶子值。
‘AVERAGE’ (0) ‘SUM’ (1) ‘MIN’ (2) ‘MAX (3) 之一,默认为 ‘SUM’ (1)leaf_targetids - INTS(必需)
此叶子节点贡献的目标的索引(此索引必须在范围
[0, n_targets)
内)。leaf_weights - TENSOR(必需)
每个叶子的权重。
membership_values - TENSOR :
要测试每个集合成员节点的成员资格的成员。按
node_modes
中出现的'BRANCH_MEMBER'模式的顺序列出所有要再次测试的成员,并以NaN
分隔。将与模式为'BRANCH_MEMBER'的节点具有相同数量的数值集。如果节点不包含任何'BRANCH_MEMBER'节点,则可以省略此属性。n_targets - INT :
目标总数。
nodes_falseleafs - INTS(必需)
如果每个节点的false分支是叶子节点,则为1,如果是内部节点,则为0。要表示仅包含一个节点的树,可以通过让单个
nodes_*
条目引用相同的leaf_*
条目来实现true和false分支。nodes_falsenodeids - INTS(必需)
如果在条目处
nodes_falseleafs
为false,则表示false分支节点的位置。此位置可用于索引到nodes_*
条目中。如果nodes_falseleafs
为false,则它是一个索引到leaf_*属性中。nodes_featureids - INTS(必需)
每个节点的特征ID。
nodes_hitrates - TENSOR :
每个节点的流行度,用于性能,可以省略。
nodes_missing_value_tracks_true - INTS :
对于每个节点,定义在存在NaN输入特征时是否遵循true分支(如果属性值为1)或false分支(如果属性值为0)。此属性可以不定义,并且所有节点的默认值为false (0)。
nodes_modes - TENSOR(必需)
节点执行的比较操作。这被编码为枚举值,0 表示 ‘BRANCH_LEQ’、1 表示 ‘BRANCH_LT’、2 表示 ‘BRANCH_GTE’、3 表示 ‘BRANCH_GT’、4 表示 ‘BRANCH_EQ’、5 表示 ‘BRANCH_NEQ’ 和 6 表示 ‘BRANCH_MEMBER’。请注意,这是一个 uint8 类型的张量。
nodes_splits - 张量 (必填)
对于每个模式不为 ‘BRANCH_MEMBER’ 的节点,用于分割的阈值。
nodes_trueleafs - 整数 (必填)
如果每个节点的真分支是叶子节点则为 1,否则为内部节点则为 0。要表示一个只有单个节点的树,可以通过使用单个
nodes_*
条目,并将真分支和假分支都引用同一个leaf_*
条目来实现。nodes_truenodeids - 整数 (必填)
如果
nodes_trueleafs
在某个条目处为假,则表示真分支节点的位置。此位置可用于索引nodes_*
条目。如果nodes_trueleafs
为真,则它是一个指向 leaf_* 属性的索引。post_transform - 整数 (默认值为
'0'
)指示要应用于分数的转换。
‘NONE’ (0)、‘SOFTMAX’ (1)、‘LOGISTIC’ (2)、‘SOFTMAX_ZERO’ (3) 或 ‘PROBIT’ (4) 之一,默认为 ‘NONE’ (0)tree_roots - 整数 (必填)
指向
nodes_*
中每棵树的根节点的索引。树结构源自每个节点的分支。
输入¶
X (异构) - T
形状为 [批大小,特征数量] 的输入。
输出¶
Y (异构) - T
形状为 [批大小,目标数量] 的输出。
类型约束¶
T in (
tensor(double)
,tensor(float)
,tensor(float16)
)输入类型必须是数值类型的张量。
示例¶
_tree_ensemble_single_tree¶
import numpy as np
import onnx
node = onnx.helper.make_node(
"TreeEnsemble",
["X"],
["Y"],
domain="ai.onnx.ml",
n_targets=2,
membership_values=None,
nodes_missing_value_tracks_true=None,
nodes_hitrates=None,
aggregate_function=1,
post_transform=0,
tree_roots=[0],
nodes_modes=make_tensor(
"nodes_modes",
onnx.TensorProto.UINT8,
(3,),
np.array([0, 0, 0], dtype=np.uint8),
),
nodes_featureids=[0, 0, 0],
nodes_splits=make_tensor(
"nodes_splits",
onnx.TensorProto.DOUBLE,
(3,),
np.array([3.14, 1.2, 4.2], dtype=np.float64),
),
nodes_truenodeids=[1, 0, 1],
nodes_trueleafs=[0, 1, 1],
nodes_falsenodeids=[2, 2, 3],
nodes_falseleafs=[0, 1, 1],
leaf_targetids=[0, 1, 0, 1],
leaf_weights=make_tensor(
"leaf_weights",
onnx.TensorProto.DOUBLE,
(4,),
np.array([5.23, 12.12, -12.23, 7.21], dtype=np.float64),
),
)
x = np.array([1.2, 3.4, -0.12, 1.66, 4.14, 1.77], np.float64).reshape(3, 2)
y = np.array([[5.23, 0], [5.23, 0], [0, 12.12]], dtype=np.float64)
expect(
node,
inputs=[x],
outputs=[y],
name="test_ai_onnx_ml_tree_ensemble_single_tree",
)
_tree_ensemble_set_membership¶
import numpy as np
import onnx
node = onnx.helper.make_node(
"TreeEnsemble",
["X"],
["Y"],
domain="ai.onnx.ml",
n_targets=4,
aggregate_function=1,
membership_values=make_tensor(
"membership_values",
onnx.TensorProto.FLOAT,
(8,),
[1.2, 3.7, 8, 9, np.nan, 12, 7, np.nan],
),
nodes_missing_value_tracks_true=None,
nodes_hitrates=None,
post_transform=0,
tree_roots=[0],
nodes_modes=make_tensor(
"nodes_modes",
onnx.TensorProto.UINT8,
(3,),
np.array([0, 6, 6], dtype=np.uint8),
),
nodes_featureids=[0, 0, 0],
nodes_splits=make_tensor(
"nodes_splits",
onnx.TensorProto.FLOAT,
(3,),
np.array([11, 232344.0, np.nan], dtype=np.float32),
),
nodes_trueleafs=[0, 1, 1],
nodes_truenodeids=[1, 0, 1],
nodes_falseleafs=[1, 0, 1],
nodes_falsenodeids=[2, 2, 3],
leaf_targetids=[0, 1, 2, 3],
leaf_weights=make_tensor(
"leaf_weights", onnx.TensorProto.FLOAT, (4,), [1, 10, 1000, 100]
),
)
x = np.array([1.2, 3.4, -0.12, np.nan, 12, 7], np.float32).reshape(-1, 1)
expected = np.array(
[
[1, 0, 0, 0],
[0, 0, 0, 100],
[0, 0, 0, 100],
[0, 0, 1000, 0],
[0, 0, 1000, 0],
[0, 10, 0, 0],
],
dtype=np.float32,
)
expect(
node,
inputs=[x],
outputs=[expected],
name="test_ai_onnx_ml_tree_ensemble_set_membership",
)