1

我想为我的分析实现一个增强的决策树。但是我的数组包含的条目长度不同,因此该数组不能直接转换为 numpy 或 pandas。

有什么方法可以使用带有尴尬数组的现有 ML 库?

4

1 回答 1

1

您的 ML 库可能会假定数组是 NumPy 数组并且无法识别ak.Array. 这个问题本身很容易解决:调用np.to_numpy(或等效地,使用np.asarray进行转换)以将其置于 ML 库期望的形式中。顺便说一句,还有ak.to_pandas可以制作一个 DataFrame,其中可变长度的嵌套列表由 MultiIndex 表示(有限制:必须只有一个嵌套列表,因为 DataFrame 只有一个索引)。

以上就是我所说的“品牌”问题:ML 库无法识别ak.Array数组的“品牌”,因此我们重新标记了它。但还有一个更根本的问题:所讨论的 ML 算法本质上是否需要直线数据?例如,前馈神经网络将N维输入映射到M维输出;每个输入的NM不能不同。即使您没有使用 Awkward Array,这也是一个问题。在 HEP 中,

我注意到一些 ML 库正在引入他们自己的“锯齿状数组”,这是 Awkward Array 提供的最小结构:TensorFlow 有 RaggedTensorsPyTorch 有 NestedTensors。不过,我不知道这些数据类型在多大程度上已集成到 ML算法中。如果是这样,那么 Awkward Array 应该得到一个ak.to_tensorflowandak.to_pytorch来补充ak.to_numpyand ak.to_pandas,作为向这些库发送数据时保持锯齿状的一种方式。希望他们能够在他们的 ML 算法中使用这种参差不齐的特性!(否则,有什么意义呢?但我并没有密切关注这些事态发展。)

您对增强决策树 (BDT) 感兴趣。我想不出一个决策树模型,无论是否提升,都可以适应不同长度的输入......或者我可以:决策树的节点根据值选择将数据向下传递到哪个子树N维输入中的一个索引。这并不意味着存在最大索引值N,尽管特定的树会有一组它分裂的索引,并且该集合会有一些最大值(因为树是有限的!)。在n < k的输入上应用想要在索引k上拆分的树无论如何,元素必须具有如何拆分的偶然性,但是已经有将决策树应用于具有缺失值的数据集的方法。具有n 个元素的输入数据可以被视为一个输入,大于n的索引被视为缺失值。要训​​练这样的 BDT,您必须为其提供超出每个列表最大元素的缺失值的输入。

在 Awkward Array 中,函数是ak.pad_none。如果您知道样本中的最大长度列表(ak.numak.max),则可以填充整个数组,以使所有列表的长度相同,最后缺少值。如果设置clip=True,则生成的数组类型为“常规”,它不再考虑列表长度与所选长度不同的可能性。如果您将这样的数组传递给np.to_numpy(而不是np.asarray),那么它将成为NumPy 掩码数组,期望缺失值的 BDT 算法应该能够识别该数组。

这个计划的唯一问题是,将每个列表填充为与最大长度列表相同的长度会占用更多内存。如果 BDT 算法知道锯齿状(TensorFlow 和即将到来的 PyTorch 会/将意识到锯齿状的方式),那么它应该能够制作这些树并将它们应用于数据而无需内存填充步骤。我不知道那里是否有任何这样的 BDT 实现,但如果有人想编写一个“带有缺失值的 BDT 接受锯齿状数组”,我很乐意帮助他们使用 Awkward Arrays 设置它!

于 2021-03-13T19:01:15.573 回答