我正在尝试使用SciKit的MultinomialNB分类器为tweets创建一个情感分类器。我有一个包含160万条分类tweets的数据集,我想用它来训练我的分类器。因为一次完成所有操作需要太多内存,所以我尝试使用partial_fit()
来完成。在
linecounter = 0
classifier = MultinomialNB()
data_frame = DataFrame({'text': [], 'class': []})
# open csv file
with open('training.cleaned.csv', 'rb') as csvfile:
# parse csv file
tweet_reader = csv.reader(csvfile, delimiter=',', quotechar='"')
#loop through each line
for tweet in tweet_reader:
data_frame = data_frame.append(DataFrame({'text': [tweet[TEXT].decode('utf8')], 'class': tweet[SENTIMENT]}, index=[tweet[ID]]))
linecounter += 1
if linecounter % 100 == 0:
count_vectorizer = CountVectorizer(ngram_range=([1, 2]))
counts = count_vectorizer.fit_transform(numpy.asarray(data_frame['text'], dtype="|S6"))
targets = numpy.asarray(data_frame['class'], dtype="|S6")
classifier.partial_fit(counts, targets, numpy.asarray(['negative', 'neutral', 'positive']))
对于每100行(对于这个测试),我要训练分类器。第一轮进行得很好,但第二轮却抛出了一个错误:
^{pr2}$我知道这是由countVector引起的,因为每100条tweet都是完全不同的,向量器也会不同。我不知道怎么解决这个问题。。。有没有一种方法可以使多个向量大小相同?或者有没有其他聪明的技巧可以用来部分训练我的分类器?在
我有两个选择:
1)使用
HashingVectorizer
而不是CountVectorizer
。后者的问题是,当您调用fit
时,它学习一个词汇表,并且它不支持部分拟合(这是有原因的)。您可以找到一个如何使用散列向量器here的示例。这是推荐的方法,当您确实有太多的数据时使用。在2)在我看来,一百万条tweets并不是那么多数据,你也许可以通过使用
CountVectorizer
来逃脱惩罚。您的代码会对numpy数组和pandas数据帧进行大量不必要的转换,这会导致内存问题。如果你把它整理好,你就可以一次性训练了(见下文)。另外,如果您真的需要bigram特性(ngram_range=(1, 2)
)或者仅仅是unigram(ngram_range=(1, 1)
),请仔细考虑。通常情况下,通过使用双变量来获得很少的精度,但是必须保存在内存中的矩阵的维数会爆炸。在或者,可以提前手动提取词汇表,并将其作为构造函数参数传递给count向量器。然后您只需调用
^{pr2}$transform
一次,根本不必调用fit
。在相关问题 更多 >
编程相关推荐