Scikit-learn的多进程处理

10

我已经用load_file方法使得LinearSVC能够对训练集和测试集进行工作,现在我想让它在多处理器环境中能够工作。

如何在LinearSVC().fit()LinearSVC().predict()函数中使用多进程呢?我还不太熟悉scikit-learn的数据类型。

我也考虑将样本拆分成多个数组,但我不熟悉numpy数组和scikit-learn的数据结构。

这样做将更容易放入multiprocessing.pool()中,将样本划分为块,进行训练,然后再合并训练集,这样会起作用吗?

编辑:

假设我们有100万个文件在训练样本集中,当我们想要将Tfidfvectorizer的处理分发到几个处理器时,我们必须分割这些样本(对于我的情况,每个样本只有两个类别,所以可以将每个类别分为500000个样本)。我的服务器有24个核心和48 GB内存,所以我想将每个主题拆分成多个块,即 1000000/24,然后在上面处理Tfidfvectorizer。就像我将Testing样本集,SVC.fit()和decide()处理一样。有意义吗?

谢谢。

PS:请勿关闭此问题。


2
请纠正我,但是SVM通常不需要很长时间来做出决策。对于不同的样本进行并行解码可能比将一个样本的解码并行化更有意义。 - Qnan
1
我不认为我理解你的问题。这些样本是独立的。你为什么要重新组合一些东西? - Qnan
因此,对于这些样本的拆分,我需要在多进程结束时重新组合以获取训练集。 - Phyo Arkar Lwin
我明白了。你之前提到的只是测试,这让我感到惊讶。一旦模型被训练好了,就可以独立地对测试集中的每个样本做出决策,因此可以很好地并行化。然而,训练是另一回事——并行化SVM训练绝非易事,据我所知scikit-learn也没有实现它。 - Qnan
1
由于中央词汇表的存在,Tfidfvectorizer 无法并行化。我们需要一个共享词汇表(例如,在集群上使用 redis 服务器)或实现一个尚不存在的 HashVectorizer - ogrisel
显示剩余5条评论
2个回答

12

我认为在处理这种数据时,使用SGDClassifier而不是LinearSVC会是个好主意,因为它更快。对于向量化,我建议你查看哈希转换器PR

对于多进程:你可以将数据集分配到不同的核心上进行,执行partial_fit,获取权重向量,取平均值,将其分发给估计器,再次执行部分拟合。

并行梯度下降是一个活跃的研究领域,因此没有现成的解决方案。

顺便问一下,你的数据有多少类别?对于每个类别,将自动训练一个分类器。如果你的类别数量几乎与核心数相同,最好和更容易地在SGDClassifier中通过指定n_jobs来处理每个核心的一个类别。


只会有3个类。SGDClassifer和LinearSVC一样准确吗?我会进行测试。 - Phyo Arkar Lwin

11
对于线性模型(LinearSVCSGDClassifierPerceptron ...),您可以对数据进行分块,对每块训练独立的模型,并通过将coef_intercept_的平均值作为属性传递给SGDClasifier等来构建一个聚合的线性模型。由于LinearSVCSGDClassifierPerceptronpredict方法计算相同的函数(使用与intercept_阈值和One vs All多类别支持进行点积的线性预测),因此用于保存平均系数的特定模型类并不重要。

但是,如前所述,关键点是并行化特征提取,当前的scikit-learn版本(0.12)没有提供任何轻松实现这一点的方式。

编辑:scikit-learn 0.13+现在有一个状态无关的哈希向量化器。


1
谢谢,我会试着测试一下。所以Tfidfvectorizer还不能并行处理,对吧?另外,特征提取在我们的测试中需要最长时间。 - Phyo Arkar Lwin
1
是的,这是scikit-learn已知的限制。使用哈希向量化器进行高效可并行化的文本特征提取是我个人优先事项清单中的重点,但现在我有更高的优先事项 :) - ogrisel
1
如果我想做出贡献,应该从哪里开始? - Phyo Arkar Lwin
1
如果您想贡献一个哈希文本向量化器,您应该首先通过阅读其源代码和相关文件来熟悉现有的CountVectorizer实现。然后阅读以下论文Kilian Weinberger, Anirban Dasgupta, John Langford, Alex Smola, Josh Attenberg, Feature Hashing for Large Scale Multitask Learning, ICML 2009,接着查看这个pull request on a hashing transformer,虽然它不是一个哈希文本向量化器,但与之密切相关。 - ogrisel
请使用joblib.Parallel而不是直接使用多进程循环(例如在scikit-learn源代码中的其他用法)。据我所知,我们确实尝试过并行化这样的内部循环,但开销并不足以使其在这个级别上变得有趣。 - ogrisel
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接