SciKitlearn中的naivebayes,由于数组大小不同,部分拟合中断

2024-04-25 11:33:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用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都是完全不同的,向量器也会不同。我不知道怎么解决这个问题。。。有没有一种方法可以使多个向量大小相同?或者有没有其他聪明的技巧可以用来部分训练我的分类器?在


Tags: csvtextnumpydata分类器partialframetweets
1条回答
网友
1楼 · 发布于 2024-04-25 11:33:13

我有两个选择:

1)使用HashingVectorizer而不是CountVectorizer。后者的问题是,当您调用fit时,它学习一个词汇表,并且它不支持部分拟合(这是有原因的)。您可以找到一个如何使用散列向量器here的示例。这是推荐的方法,当您确实有太多的数据时使用。在

2)在我看来,一百万条tweets并不是那么多数据,你也许可以通过使用CountVectorizer来逃脱惩罚。您的代码会对numpy数组和pandas数据帧进行大量不必要的转换,这会导致内存问题。如果你把它整理好,你就可以一次性训练了(见下文)。另外,如果您真的需要bigram特性(ngram_range=(1, 2))或者仅仅是unigram(ngram_range=(1, 1)),请仔细考虑。通常情况下,通过使用双变量来获得很少的精度,但是必须保存在内存中的矩阵的维数会爆炸。在

with open('training.cleaned.csv', 'rb') as csvfile:
    tweet_reader = csv.reader(csvfile, delimiter=',', quotechar='"')
    data = [tweet[TEXT].decode('utf8') for tweet in tweet_reader]
    targets = [tweet['class'] for tweet in tweet_reader]
count_vectorizer = CountVectorizer(ngram_range=(1, 1))          
counts = count_vectorizer.fit_transform(data)           
classifier = MultinomialNB()    
classifier.fit(counts, targets)

或者,可以提前手动提取词汇表,并将其作为构造函数参数传递给count向量器。然后您只需调用transform一次,根本不必调用fit。在

^{pr2}$

相关问题 更多 >

    热门问题