多处理 scikit-learn

Posted

技术标签:

【中文标题】多处理 scikit-learn【英文标题】:Multiprocessing scikit-learn 【发布时间】:2012-10-15 14:48:39 【问题描述】:

我让 linearsvc 使用 load_file 方法针对训练集和测试集工作,我试图让它在多处理器环境中工作。

如何在LinearSVC().fit() LinearSVC().predict() 上进行多处理工作?我对 scikit-learn 的数据类型还不是很熟悉。

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

这样做会更容易放入 multiprocessing.pool() 中,这样,将样本分成块,训练它们并稍后组合训练集,它会工作吗?

编辑: 这是我的场景:

可以说,我们在训练样本集中有 100 万个文件,当我们想在多个处理器上分配 Tfidfvectorizer 的处理时,我们必须拆分这些样本(对于我的情况,它只有两个类别,所以假设每个样本 500000 个培训) 。我的服务器有 24 个 48 GB 的内核,所以我想将每个主题分成 1000000 / 24 个块并在它们上处理 Tfidfvectorizer。就像我会对测试样本集以及 SVC.fit() 和决定() 做的那样。是否有意义?

谢谢。

PS:请不要关闭这个。

【问题讨论】:

如果我错了,请纠正我,但 SVM 通常不会花很长时间来做出决定。并行执行不同样本的解码可能比并行执行一个样本的解码更有意义。 如果我要对 2100 万份文档执行此操作怎么办?会不会很久? 我也在考虑不同的样本,是否可以将不同的样本拆分为每个流程后重新组合? 我想我没有得到你的问题。样本独立的。为什么你必须重新组合一些东西? Tfidfvectorizer 在中心词汇表中是不可并行的。我们要么需要一个共享词汇表(例如,在集群上使用一个 redis 服务器),要么实现一个尚不存在的HashVectorizer 【参考方案1】:

我认为对这类数据使用 SGDClassifier 而不是 LinearSVC 会是一个好主意,因为它要快得多。对于矢量化,我建议您查看hash transformer PR。

对于多处理:您可以跨核心分配数据集,执行partial_fit,获取权重向量,对其进行平均,将它们分配给估计器,再次进行部分拟合。

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

顺便说一句,您的数据有多少类?对于每个班级,将(自动)训练一个单独的班级。如果您的类几乎与核心一样多,那么通过在 SGDClassifier 中指定 n_jobs,每个核心只做一个类可能会更好、更容易。

【讨论】:

只有 3 个班级。 SGDClassifer 和 LinearSVC 一样准确吗?我会测试一下。【参考方案2】:

对于线性模型(LinearSVCSGDClassifierPerceptron...),您可以对数据进行分块,在每个块上训练独立模型并通过粘贴来构建聚合线性模型(例如 SGDClasifiercoef_intercept_ 的平均值作为属性。 LinearSVCSGDClassifierPerceptronpredict 方法计算相同的函数(使用具有intercept_ 阈值和 One vs All 多类支持的点积进行线性预测),因此您用于保存的特定模型类平均系数并不重要。

然而,如前所述,棘手的问题是并行化特征提取,而当前的 scikit-learn(0.12 版)并没有提供任何轻松实现这一点的方法。

编辑:scikit-learn 0.13+ 现在有一个无状态的散列矢量化器。

【讨论】:

谢谢大佬,我看看测试一下。所以 Tfidfvectorizer 还不能并行化,对吗?并且,特征提取在我们的测试中花费的时间最多。 是的,这是 scikit-learn 的一个已知限制。使用散列矢量化器进行高效的可并行化文本特征提取在我个人的优先级列表中居高不下,但我现在有更高的优先级:) Ic,如果我想贡献我应该从哪里开始? 如果你想贡献一个散列文本矢量化器,你应该首先通过阅读其源代码和相关文件的源代码来熟悉现有的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。 阅读contributors guide of scikit-learn。

以上是关于多处理 scikit-learn的主要内容,如果未能解决你的问题,请参考以下文章

如何在多处理函数中传递参数以及如何使用多处理列表?

多线程是啥

Mybatis按结果嵌套处理实现多对一处理和一对多处理

多处理机学习

与非多处理情况相比,使用 AllenNLP 解码的多处理是缓慢的

什么是多线程,多进程?