Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在朴素贝叶斯中使用稀疏矩阵/在线学习(Python、scikit)_Python_Scipy_Scikit Learn_Sparse Matrix - Fatal编程技术网

在朴素贝叶斯中使用稀疏矩阵/在线学习(Python、scikit)

在朴素贝叶斯中使用稀疏矩阵/在线学习(Python、scikit),python,scipy,scikit-learn,sparse-matrix,Python,Scipy,Scikit Learn,Sparse Matrix,我试图在一个有超过6000000个条目和每个条目150k特征的数据集上进行朴素贝叶斯。我已尝试从以下链接实现代码: 问题是(据我所知),当我尝试运行以dok_矩阵作为参数的train方法时,它找不到iterkeys(我已将OrderedDict作为标签配对行): 问题可能是,所取的每一行并没有利用向量的稀疏性,而是通过150k条目中的每一行。作为本问题的继续,是否有人知道如何利用稀疏矩阵的朴素贝叶斯,或者是否有任何其他方法来优化上述代码?请查看scikit中的学习。诀窍是让库为您处理特征提取。

我试图在一个有超过6000000个条目和每个条目150k特征的数据集上进行朴素贝叶斯。我已尝试从以下链接实现代码:

问题是(据我所知),当我尝试运行以dok_矩阵作为参数的train方法时,它找不到iterkeys(我已将OrderedDict作为标签配对行):

问题可能是,所取的每一行并没有利用向量的稀疏性,而是通过150k条目中的每一行。作为本问题的继续,是否有人知道如何利用稀疏矩阵的朴素贝叶斯,或者是否有任何其他方法来优化上述代码?

请查看scikit中的学习。诀窍是让库为您处理特征提取。跳过NLTK包装,因为它不适用于如此大的数据集。(*)

如果文档位于文本文件中,则只需将这些文本文件交给
TfidfVectorizer
,即可从中创建稀疏矩阵:

from sklearn.feature_extraction.text import TfidfVectorizer
vect = TfidfVectorizer(input='filename')
X = vect.fit_transform(list_of_filenames)
现在,您有了一个CSR稀疏矩阵格式的训练集
X
,如果您还有一个标签列表
y
(如果您在其中编码了类,则可能从文件名派生),则可以将该训练集馈送给朴素贝叶斯分类器:

如果由于文档集太大(不太可能,因为
TfidfVectorizer
仅针对这一数量的文档进行了优化),那么请看示例,该示例演示了用于小批量学习的
HashingVectorizer
partial_fit
API。您需要使用scikit学习0.14才能使其正常工作


(*)我知道,因为我写了那个包装。与NLTK的其他部分一样,它也用于教育目的。我还在scikit learn中致力于性能改进,我正在宣传的一些代码是我自己的。

也许你可以更有效地编码功能,或者减小它们的大小?是的,但不管功能的数量如何,我恐怕仍然需要管理矩阵的大小。数据集由tweets的单词组成。至少找到了iterkeys,现在的问题是代码太慢了。你需要用Python来做吗?看看MALLET:,它非常快。不需要python本身,但我们这里有熟悉它的peeps。谢谢,我去看看。尽管如此,我认为最好能为大型数据集找到一个明确的解决方案,这样任何人在谷歌上搜索这个问题都能在这里找到答案
matr = dok_matrix((6000000, 150000), dtype=float32)
labels = OrderedDict()

#collect the data into the matrix

pipeline = Pipeline([('nb', MultinomialNB())])
classif = SklearnClassifier(pipeline)

add_label = lambda lst, lab: [(lst.getrow(x).todok(), lab[x])
                              for x in xrange(lentweets-foldsize)] 

classif.train(add_label(matr[:(lentweets-foldsize),0], labels))
readrow = [matr.getrow(x + foldsize).todok() for x in xrange(lentweets-foldsize)]
data = np.array(classif.batch_classify(readrow))
from sklearn.feature_extraction.text import TfidfVectorizer
vect = TfidfVectorizer(input='filename')
X = vect.fit_transform(list_of_filenames)
from sklearn.naive_bayes import MultinomialNB
nb = MultinomialNB()
nb.fit(X, y)