Mahout - 朴素贝叶斯模型非常慢

时间:2014-01-06 12:50:23

标签: hadoop machine-learning classification cluster-analysis mahout

我在大约6200个类别中有大约4400万个培训示例。 经过培训,模型出现了~450MB

在测试时,使用5个并行映射器(每个给定足够的RAM),分类以每秒~4项的速率进行,这是太慢了。

如何加快速度? 我能想到的一种方法是减少单词语料库,但我害怕失去准确性。我将maxDFPercent设置为80。

我想到的另一种方法是通过聚类算法运行项目,并凭经验最大化聚类数量,同时将每个类别中的项目限制为单个聚类。这将允许我为每个集群构建单独的模型,从而(可能)减少培训和测试时间。

还有其他想法吗?

修改

在下面给出的一些答案之后,我开始考虑通过运行聚类算法进行某种形式的下采样,识别出高度"高度"彼此接近,然后从那些"高度"关闭组和其他不紧密相关的样本。

我也开始考虑使用某种形式的数据规范化技术,这些技术涉及在使用n-gram时加入编辑距离(http://lucene.apache.org/core/4_1_0/suggest/org/apache/lucene/search/spell/NGramDistance.html

我还考虑使用hadoop流API来利用这里列出的Python中可用的一些ML库http://pydata.org/downloads/,以及http://scikit-learn.org/stable/modules/svm.html#svm(这些我认为使用liblinear在下面的答案之一中提到)

3 个答案:

答案 0 :(得分:2)

尽早修剪停用词和其他无用词(支持率太低等)。

根据您使用群集的方式,实际上可能会使测试阶段更加昂贵。

尝试除Mahout之外的其他工具。我发现Mahout比较慢。它似乎在某个地方出现了很高的开销。

答案 1 :(得分:2)

使用较少的培训示例将是一种选择。您将看到,经过特定数量的培训示例后,您看不见的示例的分类准确性将不会增加。我建议尝试每个类别使用100,500,1000,5000,......示例进行训练,并使用20%来交叉验证准确性。当它不再增加时,您已经找到了所需的数据量,这可能比您现在使用的数据少得多。

另一种方法是使用另一个库。对于文档分类,我发现liblinear非常非常快。它可能比mahout更低级。

答案 2 :(得分:1)

“但我害怕失去准确性”您是否真的尝试使用较少的功能或较少的文件?你可能不会像你担心的那样失去准确性。这里可能会有一些事情发生:

  • 如此大量的文件不太可能来自同一时期。随着时间的推移,流的内容将不可避免地漂移,并且指示一个类的单词可能成为另一个类的指示。在某种程度上,将今年的数据添加到按去年数据训练的分类器只会让人感到困惑。如果你训练的数据较少,你可以获得更好的表现。
  • 大多数功能都没有帮助,正如@ Anony-Mousse已经说过的那样。在训练分类器之前,您可能希望执行某种形式的特征选择。这也将加快培训。我过去在互信方面取得了很好的成绩。

我之前已经为类似规模的数据集训练了分类器,发现系统最好只有20万个功能,并且使用超过10%的数据进行训练并没有提高准确性。

PS你能告诉我们你的问题和数据集吗?


问题更新后编辑: 聚类是选择代表性文档的好方法,但这需要很长时间。当新数据进入时,您还必须定期重新运行它。

我不认为编辑距离是要走的路。典型的算法在输入字符串的长度上是二次的,您可能必须为语料库中的每对单词运行。那是很久了!

我再次建议您随机抽样一次。你说你关心准确性,但是正在使用朴素贝叶斯。如果你想要最好的模型钱可以购买,你会选择非线性SVM,你可能不会看到它完成训练。人们诉诸具有已知问题的分类器(Naive Bayes被称为Naive的原因)因为它们比替代方案快得多,但性能通常会稍微差一点。让我举一个例子来说明我的经验:

  • RBF SVM- 85%F1得分 - 训练时间〜月
  • 线性SVM- 83%F1得分 - 训练时间〜天
  • 朴素贝叶斯 - 82%F1得分 - 训练时间〜天

你在文献中找到了相同的东西:paper。出于好奇,你得到了什么样的准确度?