我试着在Sci Kit学习中做一些关于单字的分析。我创建了svmlight格式的文件,并尝试运行MultinomialNB() KNeighborsClassifier() and SVC()。我们第一次尝试用单位图,我得到了一个X训练维错误,大概是因为在给定的例子中包含的唯一的单位图是那些出现在训练中的。我试着创建svmlight格式的培训文件,其中包括在语料库中看到的每张单字的位置持有者,甚至包括那些不在给定示例中的。
问题是将培训文件从3MB膨胀为300 MB。这会导致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)
pass2828个测试示例和1212个测试示例,其中包含18000个不同的单元。
编辑我尝试使用sklearn CountVectorizer,但我仍然得到内存问题。这是最好的方法吗?
def fileLoadForPipeline(trainSetFile, valSetFile):
with open(trainSetFile) as json_file:
tdata = json.load(json_file)
with open(valSetFile) as json_file:
vdata = json.load(json_file)
x_train = []
x_val = []
y_train = []
y_val = []
for t in tdata:
x_train.append(t['request_text'])
y_train.append(t['requester_received_pizza'])
for v in vdata:
x_val.append(t['request_text'])
y_val.append(t['requester_received_pizza'])
return x_train, y_train, x_val, y_val
def buildPipeline(trainset, valset, norm):
x_train, y_train, x_val, y_val = fileLoadForPipeline(trainset, valset)
bigram_vectorizer = CountVectorizer(ngram_range=(1, 2), token_pattern=ur'\b\w+\b', min_df=1)
xT = bigram_vectorizer.fit_transform(x_train).toarray()
xV = bigram_vectorizer.fit_transform(x_val).toarray()
if norm:
transformer = TfidfTransformer()
xT = transformer.fit_transform(xT)
xV = transformer.fit_transform(xV)
results = []
for clf, name in ((Perceptron(n_iter=50), "Perceptron"),
(KNeighborsClassifier(n_neighbors=40), "kNN"), (MultinomialNB), (MultinomialNB(alpha=.01),'MultinomialNB'),
(BernoulliNB(alpha=.1),'BernoulliNB'),(svm.SVC(class_weight='auto'),'svc')):
print 80 * '='
print name
results.append(benchmark(clf))发布于 2014-12-07 02:48:59
尝试使用scikit-learn的CountVectorizer,它将为您进行原始文本的特征提取。最重要的是,fit_transform调用一组训练示例的方法将自动完成单词字元转换,其中它跟踪训练语料库中找到的所有n唯一单词,并将每个文档转换为一个长度n数组,其特征可以是离散字数或二进制显示特征(取决于binary选项)。CountVectorizer的伟大之处在于它以numpy稀疏矩阵格式存储数据,这使得它具有很高的内存效率,并且应该能够解决任何内存问题。
然后,您可以在以后的测试示例中调用transform,它将像正常一样进行转换。
这也应该有助于解决任何维度问题,因为CountVectorizer的工作是规范一切。关于使用的具体信息如下:
extraction.html#common-vectorizer-usage
它的另一个好处是,您可以使用Pipeline将该向量器与分类器结合起来,从而使拟合和测试更加方便。
https://stackoverflow.com/questions/27337438
复制相似问题