SparkML 中的并行训练独立模型Scala

问题描述

假设我有 3 个简单的 SparkML 模型,它们将使用相同的 DataFrame 作为输入,但彼此完全独立(在运行序列和使用的数据列中)。

我想到的第一件事是创建一个包含 3 个模型的流水线数组,然后运行总体拟合/转换以获得完整的预测等。

但是,我的理解是,因为我们将这些模型作为一个序列堆叠在单个管道中,Spark 不一定会并行运行这些模型,即使它们彼此完全独立。

话虽如此,有没有办法并行拟合/转换 3 个独立模型?我想到的第一件事是创建一个创建管道的函数/对象,然后运行 ​​map 或 parmap,我将在 map 函数中运行 3 个模型,但我不知道这是否会利用并行性。

这些也不是真正的交叉验证类型模型;我想要的工作流程是:

  1. 准备我的数据框
  2. 数据框将有 10 列 0-1s
  3. 我将总共运行 10 个模型,其中每个模型将采用 10 列之一,如果该列 val == 1 则过滤数据,然后进行拟合/转换。

因此,独立性来自这样一个事实,即这些单独的模型没有链接在一起,可以按原样运行。

谢谢!

解决方法

SparkML 支持对同一管道 https://spark.apache.org/docs/2.3.0/ml-tuning.html 进行并行评估。但是对于不同的模型,我还没有看到任何实现。如果您使用并行集合来包装管道,那么它所安装的第一个模型将获取 Spark 应用程序的资源。也许使用 RDD api 您可以做一些事情,但是使用 Spark ML...并行训练不同的管道,并使用不同的管道模型生成不同的并行阶段,目前这是不可能的。