将朴素贝叶斯分类器保存在内存中

Posted

技术标签:

【中文标题】将朴素贝叶斯分类器保存在内存中【英文标题】:Save Naive Bayes Classifier in memory 【发布时间】:2013-10-25 20:42:19 【问题描述】:

我是 NLTK 和机器学习的新手。我将 Python 与 NLTK Naive Bayes Classifier 一起使用。我已经使用 NLTK 创建了一个用于文本分类的朴素贝叶斯分类器并将其保存在磁盘上。我还可以在需要使用此 python 代码对一些测试数据进行分类时加载它:

import pickle
f = open('classifier.pickle')
classifier = pickle.load(f)
f.close()

但我的问题是,每当有新的测试数据出现时,我必须一次又一次地将这个分类器加载到内存中,这需要大量时间(2-3 分钟)才能加载,因为它的大小很大。此外,如果我必须运行同一个情感分析程序的两个实例,这将占用双倍 RAM,因为这两个程序将分别加载此分类器。我的问题是:是否有任何技术可以将此分类器存储在内存中,以便在需要时情感分析程序可以直接从内存中读取它,或者是否有任何其他方法可以最小化分类器的加载时间。 提前感谢您的帮助。

【问题讨论】:

难道你不能保留一个引用它的变量吗? @john:保留一个变量并不能解决问题,因为每当新用户想要分析他的测试数据时,我都会调用我的情感分析程序。所以基本上它不是程序的一次调用。谢谢你的回复。 【参考方案1】:

你不能同时拥有它。您可以一次保持酸洗/取消酸洗一个以使用更少的 RAM,或者您可以将两者都存储在内存中,使用两倍的内存,但减少加载时间和磁盘 i/o 等待时间。

这两个分类器是使用不同的训练数据训练的,还是并行使用相同的分类器?从您对“两个实例”的使用来看,这听起来像是后者,在这种情况下,您可能希望研究线程以允许同一个分类器处理两组数据(通过对一些数据进行分类可以实现一些并行性,然后做一些其他的事情,比如结果处理,以允许其他线程进行分类、重复)。

我在这方面的专长来自于启动了一个基于 NLTK 的开源情感分析系统:https://bitbucket.org/tommyjcarpenter/evopminer。

【讨论】:

汤米:谢谢你的回复。实际上,我正在开发一种产品,用户可以对其产品/品牌/数据集进行情感分析。基本上我创建了一些分类器来分析用户的品牌/产品/数据集。因此,许多用户可以同时对其产品/品牌/数据集进行分析。

以上是关于将朴素贝叶斯分类器保存在内存中的主要内容,如果未能解决你的问题,请参考以下文章

机器学习系列-朴素贝叶斯分类器

为啥训练我的朴素贝叶斯分类器会占用这么多内存?

朴素贝叶斯

动态朴素贝叶斯分类器和朴素贝叶斯分类器有啥区别

19贝叶斯分类器:半朴素贝叶斯分类器(属性之间存在依赖)

Java:如何坚持 Weka 朴素贝叶斯分类器?