Mahout - 朴素贝叶斯模型非常慢
Posted
技术标签:
【中文标题】Mahout - 朴素贝叶斯模型非常慢【英文标题】:Mahout - Naive Bayes Model Very Slow 【发布时间】:2014-01-23 21:13:16 【问题描述】:我有大约 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
)
【问题讨论】:
【参考方案1】:尽早删除停用词和其他无用词(支持太低等)。
根据您使用集群的方式,它实际上可能会使测试阶段变得更加昂贵。
尝试 Mahout 以外的其他工具。相比之下,我发现 Mahout 真的很慢。似乎它在某个地方的开销非常高。
【讨论】:
你会建议使用 Hadoop 流的基于 python 的数据工具吗? 没有。使用 hadoop 流,您需要支付重复从文本序列化到文本的开销。为了性能,您希望深入了解裸机。【参考方案2】:使用较少的培训考试是一种选择。您会看到,在特定数量的训练示例之后,您对未见过示例的分类准确度不会增加。我建议尝试使用每个类别的 100、500、1000、5000... 示例进行训练,并使用 20% 来交叉验证准确性。当它不再增加时,您发现您需要的数据量可能比您现在使用的要少得多。
另一种方法是使用另一个库。对于文档分类,我发现 liblinear 非常非常非常快。它可能比 mahout 更低级。
【讨论】:
【参考方案3】:“但我担心失去准确性”您是否真的尝试过使用更少的功能或更少的文档?您可能不会像您担心的那样失去准确度。这里可能有一些事情在起作用:
如此大量的文档不可能来自同一时间段。随着时间的推移,流的内容将不可避免地漂移,并且指示一个类别的词可能会指示另一个类别。在某种程度上,将今年的数据添加到使用去年数据训练的分类器中只会让人感到困惑。如果您使用较少的数据进行训练,您可能会获得更好的性能。 正如@Anony-Mousse 已经说过的,大多数功能都没有帮助。在训练分类器之前,您可能希望执行某种形式的特征选择。这也将加快训练速度。过去,我在相互信息方面取得了不错的成绩。我之前为类似规模的数据集训练过分类器,发现系统仅在 200k 特征时效果最佳,并且使用超过 10% 的数据进行训练根本不会提高准确性。
PS 你能告诉我们更多关于你的问题和数据集吗?
问题更新后编辑: 聚类是一种选择有代表性的文档的好方法,但是需要很长时间。随着新数据的进入,您还必须定期重新运行它。
我不认为编辑距离是要走的路。典型的算法在输入字符串的长度上是二次方的,您可能必须针对语料库中的每一对单词运行。好久不见!
我再次建议您尝试随机抽样。您说您担心准确性,但使用的是朴素贝叶斯。如果你想要钱能买到的最好的模型,你会选择非线性 SVM,而且你可能活不到看到它完成训练。人们求助于具有已知问题的分类器(Naive Bayes 被称为 Naive 是有原因的),因为它们比替代方法快得多,但性能通常会差一点。让我从我的经验中举一个例子:
RBF SVM- 85% F1 分数 - 训练时间 ~ 月 线性 SVM - 83% F1 分数 - 训练时间 ~ 天 朴素贝叶斯 - 82% F1 分数 - 训练时间 ~ 天您会在文献中找到相同的内容:paper。出于好奇,您得到的准确度是多少?
【讨论】:
好吧,老实说,我仍在四处寻找最佳方法,以在不影响准确性的情况下对每个类别中的数据进行下采样。随机抽样是我想做的最后一个。数据集是一堆在线销售的商品,我正在尝试将进来的新商品分类到它们的相关类别中,例如“男装”、“冰箱”等。我还编辑了我的帖子,你能评论一下吗如果那是正确的方法吗? 每个类别中的数据也可能存在很大偏差。我指的是每个项目的构建方式。一些供应商可能对他的物品进行了非常详细的描述,而另一些供应商可能只提供了最低限度的细节。每个类别中的一些项目可能来自不同的品牌,所有这些品牌可能没有英文名称,一些描述也可能包含非英文单词。我意识到简单的词干提取在这里没有帮助,还需要一些更奇特的东西以上是关于Mahout - 朴素贝叶斯模型非常慢的主要内容,如果未能解决你的问题,请参考以下文章