В настоящее время у меня есть классификатор MultinomialNB()
, настроенный с использованием CountVectorizer
для извлечения признаков из текстовых документов, и хотя он работает довольно хорошо, я хочу использовать ту же методологию для прогнозирования 3-4 верхних меток, а не только верхней.
Основная причина заключается в том, что есть метки c.90, а ввод данных невелик, что приводит к точности 35% для максимальной оценки. Если бы я мог предложить пользователю 3-4 наиболее вероятных ярлыка в качестве предложения, то я мог бы значительно увеличить точность охвата.
Какие-либо предложения? Любые указатели будут оценены!
Текущий код выглядит так:
import numpy
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.pipeline import Pipeline
from sklearn.cross_validation import KFold
from sklearn.metrics import confusion_matrix, accuracy_score
df = pd.read_csv("data/corpus.csv", sep=",", encoding="latin-1")
df = df.set_index('id')
df.columns = ['class', 'text']
data = df.reindex(numpy.random.permutation(df.index))
pipeline = Pipeline([
('count_vectorizer', CountVectorizer(ngram_range=(1, 2))),
('classifier', MultinomialNB())
])
k_fold = KFold(n=len(data), n_folds=6, shuffle=True)
for train_indices, test_indices in k_fold:
train_text = data.iloc[train_indices]['text'].values
train_y = data.iloc[train_indices]['class'].values.astype(str)
test_text = data.iloc[test_indices]['text'].values
test_y = data.iloc[test_indices]['class'].values.astype(str)
pipeline.fit(train_text, train_y)
predictions = pipeline.predict(test_text)
confusion = confusion_matrix(test_y, predictions)
accuracy = accuracy_score(test_y, predictions)
print accuracy