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

Hadoop Mahout-朴素贝叶斯模型非常慢,hadoop,machine-learning,classification,cluster-analysis,mahout,Hadoop,Machine Learning,Classification,Cluster Analysis,Mahout,我有大约4400万个培训示例,涉及6200个类别。 经过训练后,模型显示为~450MB 在测试过程中,使用5个并行映射器(每个映射器都有足够的内存),分类以每秒4个项目的速度进行,这太慢了 怎样才能加快速度? 我能想到的一种方法是减少单词语料库,但我担心会失去准确性。我把maxDFPercent设置为80 我想到的另一种方法是通过聚类算法运行项目,并经验最大化集群的数量,同时将每个类别中的项目限制在单个集群中。这将允许我为每个集群构建单独的模型,从而(可能)减少培训和测试时间 还有其他想法吗 编

我有大约4400万个培训示例,涉及6200个类别。 经过训练后,模型显示为~450MB

在测试过程中,使用5个并行映射器(每个映射器都有足够的内存),分类以每秒4个项目的速度进行,这太慢了

怎样才能加快速度? 我能想到的一种方法是减少单词语料库,但我担心会失去准确性。我把maxDFPercent设置为80

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

还有其他想法吗

编辑

在下面给出了一些答案之后,我开始考虑通过运行聚类算法进行某种形式的下采样,确定彼此“高度”接近的项目组,然后从这些“高度”接近的组和其他彼此不太接近的样本中取几个样本的并集

我还开始考虑使用某种形式的数据规范化技术,包括在使用n-grams()时合并编辑距离


我还考虑使用hadoop streaming api来利用这里和这里列出的Python中可用的一些ML库(我认为这些库使用了下面一个答案中提到的
liblinear

尽早删除停止字和其他无用字(支持率太低等)

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


尝试除Mahout以外的其他工具。相比之下,我发现Mah真的很慢。这似乎是一个非常高的开销。

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

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

“但我担心会失去准确性”您是否确实尝试过使用更少的功能或更少的文档?你可能不会像你担心的那样失去准确性。这里可能有一些事情在起作用:

  • 如此多的文件不太可能来自同一时间段。随着时间的推移,流的内容将不可避免地漂移,表示一个类别的单词可能会表示另一个类别。在某种程度上,将今年的数据添加到基于去年数据训练的分类器只会让人感到困惑。如果使用较少的数据进行训练,您可能会获得更好的性能
  • 正如@Anony Mouse已经说过的,大多数功能都没有帮助。在训练分类器之前,可能需要执行某种形式的特征选择。这也将加速训练。我过去在相互信息方面取得了很好的成绩
我以前曾为类似规模的数据集训练过分类器,发现该系统在只有200k个特征的情况下工作得最好,并且使用超过10%的数据进行训练根本无法提高准确性

PS您能告诉我们更多关于您的问题和数据集的信息吗


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

我不认为编辑距离是正确的选择。典型的算法在输入字符串的长度上是二次的,您可能需要为语料库中的每一对单词运行。好久不见了

我再次建议你进行随机抽样。你说你关心准确性,但你使用的是朴素贝叶斯。如果你想要钱能买到的最好的模型,你会选择非线性支持向量机,而你可能不会活着看到它完成训练。人们求助于具有已知问题的分类器(NaiveBayes之所以被称为NaiveBayes是有原因的),因为它们比其他分类器快得多,但性能往往会差一点点。让我根据我的经验给你举个例子:

  • RBF支持向量机-85%F1分数-训练时间~月
  • 线性支持向量机-83%F1分数-训练时间~天
  • 朴素贝叶斯-82%F1分数-训练时间~天

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

您会建议使用Hadoop流媒体的基于python的数据工具吗?不会。使用Hadoop流媒体,您需要支付从文本到文本重复序列化的开销。就性能而言,您需要深入到最底层。老实说,我仍在努力寻找在不影响准确性的情况下对每个类别中的数据进行下采样的最佳方法。随机抽样是我最不想做的。数据集是一组在线销售的商品,我正在尝试将新进来的商品分为相关类别,如“男装”、“冰箱”等。我也编辑了我的帖子,你能评论一下这是否正确吗?每个类别中的数据也可能有很大的偏差。我指的是每个项目的构建方式。一些供应商可能对他的商品非常有描述性,而另一个供应商可能只提供最低限度的细节。每个类别中的某些商品可能来自不同的品牌,所有这些品牌可能没有英文名称,某些描述也可能包含非英文单词。我意识到简单的词干分析在这里没有帮助,需要一些东西