【问题标题】:Multiprocessing scikit-learn多处理 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

标签: python multithreading numpy machine-learning scikit-learn


【解决方案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+ 现在有一个无状态的散列矢量化器。

【讨论】:

猜你喜欢
  • 2014-11-17
  • 2013-04-25
  • 2020-03-26
  • 2018-07-07
  • 2019-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-17
相关资源
最近更新 更多