h2o - 当使用枚举类型进行训练时,H2O 模型错误地将字段视为数字?
问题描述
当 H2O DRF 模型将字段类型视为int
在训练模型时设置的字段类型为enum
.
当使用 H2O树 API检查经过训练的 DRF 模型中的一些单独的树时,我可以看到对于在模型训练时明确设置enum
的某些类型(即 pandas 数据帧被转换为H2OFrame
某些字段所在的位置)使用column_types
map 参数设置为特定类型),在执行类似的操作时,它们似乎被视为int
s
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_types
pandas-to-H2OFrame 转换中使用的映射并打印类型,我们可以看到适当的类型被设置为enum
,所以现在看到的这个输出令人困惑。任何人都知道可以在这里完成的任何其他调试步骤或可能发生什么?
解决方案
这不是算法中的错误(拆分仍然正确),而是 H2O-3 在 MOJO Tree 可视化工具和树 API 中表示拆分的方式。我创建了一个 JIRA 票证,您可以在此处跟踪(或添加到该票证),这将确保 MOJO Tree Visualizer 和树 API 拆分不那么混乱(即,使用数字拆分或显示分类级别列表而不是两者)。您看到的数字拆分对应于我们进行分类拆分的内部方法。
推荐阅读
- azure - 如何在 .NET 中使用 MSAL 在 Azure AD Auth 中进行身份验证/授权
- python-3.x - Raspberry Pi 4 上的 Kivy 在显示窗口之前终止
- mysql - 并发更新
- php - php不保存文件
- cryptography - 取消极光桥上的交易
- html - 引导网格对齐不准确,不会响应 .css 文件
- python - 完成蝗虫实例后是否可以运行代码?
- kubernetes - 使用无选择器服务和手动端点从 microk8s pod 访问外部 InfluxDb 数据库?
- omnet++ - 在 .cc 文件中定义节点连接,而不是在 Omenet++ 中的 .ned 文件
- reactjs - 我可以在 MUI 的 Grid 组件中使用组件 Box 吗?是正确的做法吗?