2017-10-12 1 views
0

약 350 개의 클래스로 그룹화 된 문서 묶음이 있습니다. 새로운 문서의 클래스를 예측하기 위해 TF-IDF 다항 모델을 만들려고합니다. 테스트 예측이 단 하나의 값만 취하는 것을 제외하고는 모든 것이 잘 작동하는 것처럼 보입니다 (수천 개의 문서에서 테스트를 실행하더라도). 내가 뭘 놓치고 있니?모든 테스트 문서에 대해 동일한 카테고리를 예측하는 MultinomialNB()

가 여기에 관련 코드입니다 : 어제 잠시 동안 고민 한 후

stop_words = set(stopwords.words('english')) 
tokenizer = RegexpTokenizer(r'\w+') 
stemmer = SnowballStemmer("english") 

count_vect = CountVectorizer() 

tfidf_transformer = TfidfTransformer(norm='l1', use_idf=True, smooth_idf=False, sublinear_tf=False) 

clf = MultinomialNB()  

mycsv = pd.read_csv("C:/DocumentsToClassify.csv", encoding='latin-1') 

Document_text=mycsv.document.str.lower() 
y=mycsv.document_group 

Y=[] 
stemmed_documents = [] 

for i in range(0, 50000 ,2): 
    tokenized_document = tokenizer.tokenize(Document_text[i]) 

    stemmed_document = "" 

    for w in tokenized_document: 
     if w not in stop_words: 
      w = re.sub(r'\d+', '', w) 
      if w is not None: 
       stemmed_document=stemmed_document+" "+stemmer.stem(w) 

    stemmed_documents=np.append(stemmed_documents,stemmed_document) 
    Y=np.append(Y,y[i]) 

Y_correct=[] 
test_documents = [] 
for i in range(1,50000,4): 
    tokenized_document = tokenizer.tokenize(Document_text[i])  
    stemmed_document = "" 
    for w in tokenized_document: 
     if w not in stop_words: 
      w = re.sub(r'\d+', '', w) 
      if w is not None: 
       stemmed_document=stemmed_document+" "+stemmer.stem(w) 

    test_documents=np.append(test_documents,stemmed_document) 
    Y_correct=np.append(Y_correct,y[i]) 

Word_counts = count_vect.fit_transform(stemmed_documents) 
Words_tfidf = tfidf_transformer.fit_transform(Word_counts) 

Word_counts_test = count_vect.transform(test_documents) 
Words_tfidf_test = tfidf_transformer.transform(Word_counts_test) 

# Training 
clf.fit(Words_tfidf, Y) 

# Test 
Ynew=clf.predict(Words_tfidf_test) 

답변

0

, 나는 해결책을 알아 냈어 - SGDClassifier에 MultinomialNB()로 전환(). 왜 MultinomialNB()와 함께 작동하지 않았는지 모르겠지만 SDG는 훌륭하게 작동합니다. 다음은 관련성이 높으며 많이 단축 된 코드입니다 (http://scikit-learn.org/stable/tutorial/text_analytics/working_with_text_data.html).

text_clf = Pipeline([('vect', CountVectorizer()), 
        ('tfidf', TfidfTransformer(norm='l1', use_idf=True, smooth_idf=True, sublinear_tf=False)), 
        ('clf', SGDClassifier(loss='hinge', penalty='l2',alpha=1e-3, random_state=42)), 
]) 

# Training dataset 
train_data = pd.read_csv("A:/DocumentsWithGroupTrain.csv", encoding='latin-1') 

# Test dataset 
test_data = pd.read_csv("A:/DocumentsWithGroupTest.csv", encoding='latin-1') 

text_clf.fit(train_data.document, train_data.doc_group) 
predicted = text_clf.predict(test_data.document) 
print(np.mean(predicted == test_data.doc_group)) 
관련 문제