首页 > 解决方案 > 当使用枚举类型进行训练时,H2O 模型错误地将字段视为数字?

问题描述

当 H2O DRF 模型将字段类型视为int在训练模型时设置的字段类型为enum.

当使用 H2O树 API检查经过训练的 DRF 模型中的一些单独的树时,我可以看到对于在模型训练时明确设置enum的某些类型(即 pandas 数据帧被转换为H2OFrame某些字段所在的位置)使用column_typesmap 参数设置为特定类型),在执行类似的操作时,它们似乎被视为ints

root_node.features
> observe that the feature being examined for this node is one of the features set to be categorical enum by the H2OFrame that the model was trained on
tree.root_node.features
> some_categorical
tree.root_node.levels
> []
root_node.threshold
> some number

更紧凑

print(tree.root_node)

Node ID 0 
Left child node ID = 1 Right child node ID = 2 
Splits on column some_categorical 
Split threshold < 2562.5 to the left node, >= 2562.5 to the right node 
NA values go to the LEFT

但是对于其他节点(对于同一模型),我们(正确地)看到

tree.root_node.features
> some_other_categorical
tree.root_node.levels
> ['cat1', ..., 'catn']
root_node.threshold
> na

最初我认为这似乎只是被视为一个 int 因为分类值是如何在 H2O 内部表示的

枚举或枚举:保持数据集不变,在内部将字符串映射到整数,并使用这些整数进行拆分 - 当 nbins_cats 太小而无法解析所有级别时通过序数性质或通过执行完美组拆分的位集。每个类别都是一个单独的类别;它的名称(或编号)无关紧要。例如,将字符串映射为 Enum 的整数后,您可以将 {0, 1, 2, 3, 4, 5} 拆分为 {0, 4, 5} 和 {1, 2, 3}。

但是查看信息输出显示大于阈值并且没有用于确定左右方向的级别的事实,您可以看到这里还有其他一些问题。

在训练模型之前检查column_typespandas-to-H2OFrame 转换中使用的映射并打印类型,我们可以看到适当的类型被设置为enum,所以现在看到的这个输出令人困惑。任何人都知道可以在这里完成的任何其他调试步骤或可能发生什么?

标签: h2o

解决方案


这不是算法中的错误(拆分仍然正确),而是 H2O-3 在 MOJO Tree 可视化工具和树 API 中表示拆分的方式。我创建了一个 JIRA 票证,您可以在此处跟踪(或添加到该票证),这将确保 MOJO Tree Visualizer 和树 API 拆分不那么混乱(即,使用数字拆分或显示分类级别列表而不是两者)。您看到的数字拆分对应于我们进行分类拆分的内部方法。


推荐阅读