对 BDT 使用 awkward1.Array

Using awkward1.Array for BDT

我想为我的分析实施提升决策树。但是我的数组中包含的条目长度不同,因此该数组不能直接转换为 numpy 或 pandas.

有没有什么方法可以使用现有的 ML 库和笨拙的数组?

您的 ML 库可能会假设数组是 NumPy 数组并且无法识别 ak.Array。这个问题本身很容易解决:调用 np.to_numpy (or equivalently, cast it with np.asarray) to put it in a form the ML library expects. Incidentally, there's also ak.to_pandas 来创建一个 DataFrame,其中可变长度的嵌套列表由 MultiIndex 表示(有限制:必须只有一个嵌套列表,因为 DataFrame 只有一个索引)。

以上就是我所说的“品牌”问题:ML 库无法识别数组的 ak.Array“品牌”,因此我们重新标记它。但还有一个更基本的问题:所讨论的 ML 算法本质上是否需要直线数据?例如,前馈神经网络将 N 维输入映射到 M 维输出;每个输入的 NM 不能不同。即使您不使用 Awkward Array,这也是一个问题。在 HEP 中,旧的解决方案是通过递归神经网络 运行 可变长度数据(因此忽略列表之间的边界并对它们施加不相关的顺序)而新的解决方案似乎是图神经网络(这是理论上更正确的事情)。

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

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

在 Awkward Array 中,对应的函数是 ak.pad_none. If you know the maximum length list in your sample (ak.num and ak.max), you can pad the whole array such that all lists have the same length with missing values at the end. If you set clip=True, then the resulting array type is "regular," it no longer considers the possibility that a list can have a length different from the chosen length. If you pass such an array to np.to_numpy (and not np.asarray), then it becomes a NumPy masked array,期望缺失值的 BDT 算法 应该 能够识别。

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