sklearn管道的Pararelization

时间:2017-05-04 14:01:31

标签: python multithreading scikit-learn pipeline amazon-data-pipeline

我有一组管道,希望拥有多线程架构。我的典型管道如下所示:

huber_pipe = Pipeline([
        ("DATA_CLEANER", DataCleaner()),
        ("DATA_ENCODING", Encoder(encoder_name='code')),
        ("SCALE", Normalizer()),
        ("FEATURE_SELECTION", huber_feature_selector),
        ("MODELLING", huber_model)
    ])

是否可以在不同的线程或核心中运行管道的步骤?

1 个答案:

答案 0 :(得分:2)

一般来说,没有。

如果查看sklearn阶段的界面,方法为of the form

fit(X, y, other_stuff)

predict(X)

也就是说,它们可以处理整个数据集,并且无法对数据流(或分块流)进行增量学习。

此外,从根本上说,有些算法不适用于此。考虑一下你的舞台

("SCALE", Normalizer()),

据推测,这使用均值和/或方差进行归一化。没有看到整个数据集,它怎么知道这些东西?因此,它必须在操作之前等待整个输入,因此不能与其后的阶段并行运行。大多数(如果不是几乎所有)阶段都是这样。

但是,在某些情况下,您仍然可以使用sklearn的多核。

  1. 某些阶段有n_jobs parameter。像这样的阶段相对于其他阶段使用顺序,但可以并行化其中的工作。

  2. 在某些情况下,您可以滚动自己的(近似)其他阶段的并行版本。例如,给定任何回归阶段,您可以将其包装在一个阶段,该阶段将您的数据随机地分块到 n 部分,并行学习部分,并输出一个回归量,它是所有回归量的平均值。 YMMV。