【问题标题】:Huge number of classes with Multinominal Naive Bayes (scikit-learn)具有多项朴素贝叶斯的大量类(scikit-learn)
【发布时间】:2016-04-12 02:13:00
【问题描述】:

每当我开始有更多的类(1000 个或更多)时,MultinominalNB 就会变得超级慢并且占用千兆字节的 RAM。对于所有支持 .partial_fit() (SGDClassifier, Perceptron) 的 scikit learn 分类算法也是如此。 使用卷积神经网络时,10000 个类没有问题。但是当我想在相同的数据上训练 MultinominalNB 时,我的 12GB RAM 是不够的,而且速度非常慢。 根据我对朴素贝叶斯的理解,即使有很多类,它也应该快很多。 这可能是 scikit-learn 实现的问题(可能是 .partial_fit() 函数)?如何在 10000 多个类(批量)上训练 MultinominalNB/SGDClassifier/Perceptron?

【问题讨论】:

  • 给我们更多信息。你的训练数据的形状是什么?你有多少样本和多少特征?
  • 训练数据大约是 5 个 Mio 文本文档。我正在使用功能数量 = 2^18 的 HashingVectorizer。

标签: machine-learning scikit-learn naivebayes


【解决方案1】:

没有太多信息的简短回答:

  • MultinomialNB 适合每个类的独立模型,因此,如果您有 C=10000+ 类,它将适合 C=10000+ 模型,因此,只有模型参数将是[n_classes x n_features],如果n_features 很大的话,内存是相当大的。

  • scikits-learn 的 SGDClassifier 使用 OVA(one-versus-all)策略来训练多类模型(因为 SGDC 本质上不是多类),因此需要训练另一个 C=10000+ 模型。

  • 和 Perceptron,来自 scikits-learn 的文档:

Perceptron 和 SGDClassifier 共享相同的底层实现。实际上 Perceptron() 等价于 SGDClassifier(loss=”perceptron”, eta0=1, learning_rate=”constant”, pinch=None)。

因此,您提到的所有 3 个分类器都不适用于大量类,因为需要为每个类训练一个独立的模型。我建议您尝试一些本质上支持多类分类的方法,例如RandomForestClassifier

【讨论】:

  • 感谢您到目前为止的回答。不幸的是 RandomForestClassifier 不能批量训练(没有 .partial_fit() 方法)。由于训练数据是 5 个 Mio 样本,我必须进行批量训练。我该如何处理?
  • @jasmok 您可以尝试使用LogisticRegression 设置multiclass='multinomial'(而不是默认的ovr,它代表one-versus-rest,与one-versus-all 相同)。欲了解更多信息:scikit-learn.org/stable/modules/multiclass.html。但是,对于您拥有的所有数据,预计会有较长的训练时间和内存需求。
  • 但是 LogisticRegression 不支持批量训练。所以我必须将所有数据放入内存中。这不适用于 5 个 Mio 样本。 SGDRegressor 将支持批量训练,但它没有多项选项。
  • @jasmok 然后SGDClassifierloss='log'(在线逻辑回归)将是您的最佳选择。但是,训练它仍然需要很长时间。
  • @jasmok 你的数据太大了,你应该期待很长的训练时间和巨大的内存需求。
猜你喜欢
  • 2013-12-10
  • 2015-09-16
  • 2017-06-21
  • 2018-06-19
  • 2021-02-09
  • 2013-03-22
  • 2013-06-24
  • 2016-05-01
  • 2015-01-03
相关资源
最近更新 更多