问题描述
我想为我的分析实现一个提升的决策树。但是我的数组中包含的条目长度各不相同,因此该数组不能直接转换为 numpy 或 pandas。
有什么办法可以使用现有的带有笨拙数组的机器学习库吗?
解决方法
您的 ML 库可能假定数组是 NumPy 数组并且无法识别 ak.Array
。这个问题本身很容易解决:调用 np.to_numpy(或等效地,用 np.asarray 转换它)将其放入 ML 库期望的形式。顺便说一句,还有 ak.to_pandas 可以制作一个 DataFrame,其中可变长度的嵌套列表由 MultiIndex 表示(有限制:必须只有一个嵌套列表,因为一个 DataFrame 只有一个索引)。
以上就是我所说的“品牌”问题:ML 库无法识别数组的 ak.Array
“品牌”,因此我们重新标记它。但还有一个更基本的问题:所讨论的 ML 算法本质上是否需要直线数据?例如,前馈神经网络将 N 维输入映射到 M 维输出; N 和 M 对于每个输入不能不同。即使您不使用 Awkward Array,这也是一个问题。在 HEP 中,旧的解决方案是通过循环神经网络运行可变长度的数据(因此忽略列表之间的边界并对它们施加不相关的顺序),而新的解决方案似乎是图神经网络(理论上更正确)要做的事情)。
我注意到一些 ML 库正在引入他们自己的“锯齿状数组”,这是 Awkward Array 提供的最小结构:TensorFlow has RaggedTensors 和 PyTorch is getting NestedTensors。不过,我不知道这些数据类型在多大程度上已集成到 ML 算法 中。如果是这样,那么 Awkward Array 应该得到一个 ak.to_tensorflow
和 ak.to_pytorch
来补充 ak.to_numpy
和 ak.to_pandas
,作为向这些库发送数据时保持锯齿状的一种方式。希望他们能够在他们的 ML 算法中使用这种锯齿! (否则,有什么意义?但我没有密切关注这些发展。)
您对增强决策树 (BDT) 感兴趣。我想不出一个决策树模型,无论是否提升,如何适应不同长度的输入......或者我可以:决策树的节点根据值选择将数据向下传递到哪个子树N 维输入中的一个索引。这并不意味着存在最大索引值 N,尽管特定的树会有一组它分裂的索引,并且该集合会有一些最大值(因为树是有限的! )。在具有 n 个元素的输入上应用想要在索引 k 上拆分的树无论如何都必须有一个如何拆分的偶然性,但是已经有方法可以将决策树应用于具有缺失值的数据集。具有 n 元素的输入数据可被视为输入,其索引大于 n 被视为缺失值。要训练这样的 BDT,您必须为其输入缺失值超出每个列表的最大元素。
在 Awkward Array 中,它的函数是 ak.pad_none。如果您知道样本中的最大长度列表(ak.num 和 ak.max),您可以填充整个数组,使所有列表的长度相同,最后缺少值。如果设置 clip=True
,则结果数组类型为“常规”,它不再考虑列表长度可能与所选长度不同的可能性。如果你将这样的数组传递给 np.to_numpy(而不是 np.asarray),那么它就变成了一个 NumPy masked array,这是一个期望缺失值的 BDT 算法应该能够识别。
这个计划的唯一问题是填充每个列表以与最大长度列表具有相同的长度使用更多的内存。如果 BDT 算法知道锯齿状(TensorFlow 和很快 PyTorch 意识到/将意识到锯齿状的方式),那么它应该能够制作这些树并将它们应用于数据而无需内存填充步骤。我不知道是否有任何这样的 BDT 实现,但是如果有人想编写一个“接受锯齿状数组的缺失值的 BDT”,我很乐意帮助他们使用 Awkward Arrays 进行设置!