Я только что начал использовать 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]
Обычно вы берете 'журнал' при вычислении условных вероятностей. Возможно, вы столкнулись с числовыми проблемами. –
Я пробовал это, например, при вычислении условных вероятностей я использовал
log(Tct + 1) - log (Sum(Tct) + |V|)
, но результат остается прежним. –