2013-12-11 6 views
2

Я только что начал использовать Naive Bayes для классификации текста. Я закодировал его из прикрепленного моментального снимка псевдокода.Показатель классификатора Наивного Байеса неожиданно

У меня есть два класса, то есть положительные и отрицательные. У меня есть всего 2000 образцов (IMDB Movie Reviews), из которых 1800 (900 положительных, 900 отрицательных) используются для обучения классификатора, тогда как 200 (100 отрицательных, 100 положительных) используются для тестирования системы.

Он помечает документы с положительным классом, но не удался для классификации документов отрицательного класса. Все документы, принадлежащие к отрицательным классам, классифицируются в положительный класс и тем самым дают точность 50%.

Если я документы из каждого класса индивидуально, как сначала проверить весь документ, принадлежащий отрицательным классам, а затем из положительных тестовых образцов, то он дает мне точность 100%, но когда я кормлю его смешанными тестовыми образцами, он терпит неудачу и классифицирует все в одном классе (в моем случае положительный).

Есть ли какая-либо ошибка, которую я делаю или недоступен в этом алгоритме? Являются ли учебные образцы слишком малыми, а эффективность классификаторов будет возрастать после увеличения учебных образцов?

Я испытал те же образцы с weka и rapid miner, которые дают гораздо лучшую точность. Я знаю, что совершил ошибку, но что я не могу ее схватить? Самый простой в понимании, но результат точности был совершенно неожиданным и сбил меня с ума. Вот мой псевдокод кода кода. У меня есть вектор документа, используя tf-idf для взвешивания сроков и вектора вектора.

TrainMultinomialNB(C, D) 

1. V = ExtractVocabulary(D) 
2. N = CountDocs(D) 
3. For each c E C 
4. Do Nc = CountDocsInClass (D, c) 
5. Prior[c] = Nc/N 
6. Textc = ConcatenateTextOfAllDocsInClass (D,c) 
7. For each t E V 
8. Do Tct = CountTokensOfTerm(textc, t) 
9. For each t E V 
10. Do condprob[t][c] = (Tct + 1) /(Sum(Tct) + |V|) 
11. Return V, prior, condprob 

ApplyMultinomialNB(C, V, prior, condprob, d) 

1. W = ExtractTokensFromDoc (V, d) 
2. For each c E C 
3. Do score [c] = log (prior) 
4. For each t E W 
5. Do score [c] + = log (condprob[t][c]) 
6. Return argmax(cEC) score [c] 

algorithm

+0

Обычно вы берете 'журнал' при вычислении условных вероятностей. Возможно, вы столкнулись с числовыми проблемами. –

+0

Я пробовал это, например, при вычислении условных вероятностей я использовал log(Tct + 1) - log (Sum(Tct) + |V|), но результат остается прежним. –

ответ

0

Без просмотра вашего реального кода и набор данных, это не легко сказать, что проблема может быть. Тем не менее, я пытаюсь обобщить некоторые возможные подходы к улучшению производительности наивных байков. Вероятно, вам нужно уменьшить список ваших слов функций, используемых в обучении, путем разбора каждого документа на границах слов. Отфильтруйте стоп-слова и включите компоновки bigram, как показано в этом article.

Другим возможным подходом является Fisher method, в котором рассчитываются вероятность положительного и отрицательного для каждого функционального слова в документе, затем получается объединенная вероятность.

+0

Да его плохо. я делал ошибку, которая влияла на производительность классификатора. Я также использовал функцию тестирования данных в учебных данных, из-за которых была затронута производительность. Однако я прочитал его. Теперь я использую NaiveBayes в FilteredClassifier в weka, который дает улучшенную производительность. –

Смежные вопросы