我试图对Sci-Kit-Learn中的unigrams做一些分析。我创建了svmlight格式的文件并尝试运行MultinomialNB() KNeighborsClassifier() and SVC()
。我们第一次尝试使用unigrams,我得到了一个X训练维度的错误,大概是因为给定例子中包含的unigram是在训练中出现的unigram。我尝试创建svmlight格式的训练文件,其中包括语料库中每一个看到的unigram的占位符,甚至那些不在给定例子中的。在
问题是训练文件从3MB膨胀到300MB。这导致sklearn加载文件时出现内存错误。有没有一种方法可以避免维度不匹配或内存溢出。在
X_train, y_train= load_svmlight_file(trainFile)
x_test, y_test = load_svmlight_file(testFile)
try:
clf = MultinomialNB()
clf.fit(X_train, y_train)
preds = clf.predict(x_test)
print('Input data: ' + trainFile.split('.')[0])
print('naive_bayes')
print('accuracy: ' + str(accuracy_score(y_test, preds)))
if 1 in preds:
print('precision: ' + str(precision_score(y_test, preds)))
print('recall: ' + str(recall_score(y_test, preds)))
except Exception as inst:
print 'fail in NB ' + 'Input data: ' + trainFile.split('.')[0]
print str(inst)
pass
2828个测试示例和1212个测试示例,包含18000个不同的unigram
EDIT我试图使用sklearn CountVectorizer
,但仍然存在内存问题。这是最好的办法吗?在
尝试使用scikitlearn的^{} ,它将为您对原始文本进行特征提取。最重要的是,对一组训练示例调用的方法}唯一单词,并将每个文档转换为一个长度为
fit_transform
将自动进行单词包单字转换,在这里它跟踪在训练语料库中找到的所有{n
的数组,其特征可以是离散字数或二进制存在特征(取决于binary
选项)。CountVectorizer
最棒的地方在于它以numpy稀疏矩阵格式存储数据,这使得它非常节省内存,并且应该能够解决任何内存问题。在然后您可以在以后的测试示例中调用
transform
,它将像正常情况一样进行转换。在这也有助于解决任何维度的问题,因为
CountVectorizer
的工作就是规范化所有的东西。具体使用信息如下:http://scikit-learn.org/stable/modules/feature_extraction.html#common-vectorizer-usage
这样做的另一个好处是,您可以使用^{} 将这个向量器与分类器结合起来,使拟合和测试更加方便。在
相关问题 更多 >
编程相关推荐