我有大约4400万个培训案例,涉及6200个类别。经过训练后,模型显示为~450mb
在测试过程中,使用5个并行Map器(每个Map器都有足够的内存),分类的速度是每秒4项,这太慢了。
如何加快速度?我能想到的一种方法是减少单词库,但我担心会失去准确性。我把maxdfpercent设置为80。
我想到的另一种方法是通过聚类算法来运行项目,并根据经验最大化聚类的数量,同时将每个类别中的项目限制在单个聚类中。这将允许我为每个集群构建单独的模型,从而(可能)减少培训和测试时间。
还有其他想法吗?
编辑:
在下面给出了一些答案之后,我开始考虑通过运行一个聚类算法进行某种形式的下采样,确定彼此“高度”接近的项目组,然后从这些“高度”接近的组和彼此不那么紧密的其他样本中取几个样本的并集。
我还开始考虑使用某种形式的数据规范化技术,包括在使用n-gram时合并编辑距离(http://lucene.apache.org/core/4_1_0/suggest/org/apache/lucene/search/spell/ngramdistance.html)
我还考虑使用hadoopstreamingapi来利用python中列出的一些ml库http://pydata.org/downloads/ ,这里呢http://scikit-learn.org/stable/modules/svm.html#svm (这些我认为是有用的 liblinear
在下面的一个答案中提到)
3条答案
按热度按时间j2cgzkjk1#
使用较少的训练示例将是一种选择。你会看到,经过一定数量的训练后,你对看不见的例子的分类精度不会提高。我建议试着用100、500、1000、5000。。。每个类别的例子,并使用20%交叉验证的准确性。当它不再增加时,您已经发现所需的数据量可能比您现在使用的要少得多。
另一种方法是使用另一个库。对于文档分类,我发现liblinear非常快。它可能比驯兽师更低级。
efzxgjgh2#
“但我担心会失去准确性”你真的尝试过少用一些特性或文档吗?你可能不会像你担心的那样失去准确性。这里可能有一些事情在起作用:
如此多的文件不太可能来自同一时期。随着时间的推移,流的内容将不可避免地漂移,表示一个类的单词可能会表示另一个类。在某种程度上,将今年的数据添加到基于去年数据训练的分类器只会让人困惑。如果你用更少的数据训练,你可能会得到更好的表现。
正如@anony mousse已经说过的那样,大多数功能都没有帮助。在训练分类器之前,可能需要执行某种形式的特征选择。这也将加速训练。我过去在互信息方面取得了很好的成绩。
我以前训练过类似规模的数据集的分类器,发现这个系统在只有200k个特征的情况下工作得最好,使用任何超过10%的数据进行训练都不能提高准确率。
ps您能告诉我们更多关于您的问题和数据集吗?
更新问题后编辑:聚类是选择有代表性的文档的一种好方法,但需要很长时间。当新数据进来时,您还必须定期重新运行它。
我不认为编辑距离是最好的方式。典型的算法是输入字符串长度的二次方,您可能需要为语料库中的每一对单词运行。太长时间了!
我再次建议你随机抽样。你说你关心的是准确性,但使用的是朴素贝叶斯。如果你想要钱能买到的最好的模型,你会选择一个非线性支持向量机,你可能不会活着看到它完成训练。人们求助于具有已知问题的分类器(naivebayes之所以被称为naivebayes是有原因的),因为它们比另一种方法快得多,但性能往往只会差一点点。让我给你举一个我经历的例子:
rbf-svm-85%f1评分-训练时间~月
线性支持向量机-83%f1分数-训练时间~天
朴素贝叶斯-82%f1成绩-训练时间~天
你在文献中也发现了同样的东西:纸。出于好奇,你得到了什么样的准确度?
7ivaypg93#
尽可能早地删掉停止词和其他无用词(支持度太低等)。
根据您如何使用集群,它实际上可能会使测试阶段变得更加昂贵。
尝试其他工具而不是mahout。相比之下,我发现马赫拉真的很慢。它似乎在某个地方以很高的开销出现。