我想为我的分析实现一个增强的决策树。但是我的数组中包含的条目有不同的长度,因此数组不能直接转换为numpy或熊猫。
是否有任何方法使用现有的带有尴尬数组的ML库?
发布于 2021-03-13 19:01:15
您的ML库可能假设数组是NumPy数组,而不识别ak.Array。这个问题本身很容易解决:调用numpy (或等效地将其转换为np.asarray),将其置于ML库所期望的形式中。顺便说一句,还有一个熊猫来创建一个DataFrame,其中变量长度嵌套列表由一个MultiIndex表示(但有一些限制:必须只有一个嵌套列表,因为DataFrame只有一个索引)。
以上就是我所说的“品牌”问题: ML库只是不承认数组的ak.Array“品牌”,所以我们重新定义它。但还有一个更根本的问题:所讨论的ML算法本质上是否需要直线数据?例如,前馈神经网络将N维输入映射到M维输出;N和M对于每个输入都不能不同。这是一个问题,即使您没有使用尴尬的数组。在HEP中,旧的解决方案是通过一个递归的神经网络运行可变长度的数据(从而忽略列表之间的边界,并对它们强加不相关的顺序),而新的解决方案似乎是图神经网络(这在理论上是正确的)。
我注意到一些ML库引入了自己的“交错数组”,这是尴尬的数组提供的最小结构:TensorFlow有RaggedTensors和PyTorch得到了NestedTensors。不过,我不知道这些数据类型在多大程度上已经集成到了ML算法中。如果是这样的话,那么尴尬的数组应该得到一个ak.to_tensorflow和ak.to_pytorch来补充ak.to_numpy和ak.to_pandas,这是在向这些库发送数据时保持混乱的一种方法。希望他们能够在他们的ML算法中使用这种混乱!(否则,有什么意义?但我并没有密切关注这些发展。)
您对增强决策树(BDTs)感兴趣。我想不出一个决策树模型,不管是不是,可以适应不同长度的输入.或者我可以:决策树的节点根据N维输入中一个索引的值来选择向下传递数据的子树。这并不意味着有一个最大的索引值N,尽管一个特定的树将有一组索引被它分割,并且该集合会有一些最大值(因为树是有限的!)要在输入的索引k上使用n
在尴尬的数组中,它的函数是无。如果您知道示例中的最大长度列表(ak.num和ak.max),则可以填充整个数组,以便所有列表都具有相同的长度,最后缺少值。如果您设置了clip=True,那么得到的数组类型是“正则的”,它不再考虑列表的长度与所选长度不同的可能性。如果您将这样的数组传递给numpy (而不是np.asarray),那么它就变成了一个NumPy掩模阵列,一个期望丢失值的BDT算法应该能够识别这个NumPy掩模阵列。
此计划的唯一问题是填充每个列表,使其具有与最大长度列表相同的长度,使用更多内存。如果BDT算法意识到锯齿性( TensorFlow和PyTorch很快就会意识到参差不齐),那么它应该能够使这些树不需要内存填充步骤就应用到数据中。我不知道是否有这样的BDT实现,但如果有人想要写一个“含有缺失值的BDT,接受交错数组”,我很乐意帮助他们用尴尬的数组来设置它!
https://stackoverflow.com/questions/66616853
复制相似问题