Я реализую Наивный алгоритм Байеса для классификации текста.У меня ~ 1000 документов для обучения и 400 документов для тестирования.Я думаю, что правильно выполнил учебную часть, но я запутался в тестовой части.Вот что я сделал вкратце:
В моей функции обучения:
vocabularySize= GetUniqueTermsInCollection();//get all unique terms in the entire collection
spamModelArray[vocabularySize];
nonspamModelArray[vocabularySize];
for each training_file{
class = GetClassLabel(); // 0 for spam or 1 = non-spam
document = GetDocumentID();
counterTotalTrainingDocs ++;
if(class == 0){
counterTotalSpamTrainingDocs++;
}
for each term in document{
freq = GetTermFrequency; // how many times this term appears in this document?
id = GetTermID; // unique id of the term
if(class = 0){ //SPAM
spamModelArray[id]+= freq;
totalNumberofSpamWords++; // total number of terms marked as spam in the training docs
}else{ // NON-SPAM
nonspamModelArray[id]+= freq;
totalNumberofNonSpamWords++; // total number of terms marked as non-spam in the training docs
}
}//for
for i in vocabularySize{
spamModelArray[i] = spamModelArray[i]/totalNumberofSpamWords;
nonspamModelArray[i] = nonspamModelArray[i]/totalNumberofNonSpamWords;
}//for
priorProb = counterTotalSpamTrainingDocs/counterTotalTrainingDocs;// calculate prior probability of the spam documents
}
Мне кажется, я правильно понял и реализовал учебную часть, но я не уверен, что смог правильно выполнить тестовую часть,Здесь я пытаюсь просмотреть каждый тестовый документ и вычисляю logP (spam | d) и logP (non-spam | d) для каждого документа.Затем я сравниваю эти две величины, чтобы определить класс (спам / не спам).
В моей функции тестирования:
vocabularySize= GetUniqueTermsInCollection;//get all unique terms in the entire collection
for each testing_file:
document = getDocumentID;
logProbabilityofSpam = 0;
logProbabilityofNonSpam = 0;
for each term in document{
freq = GetTermFrequency; // how many times this term appears in this document?
id = GetTermID; // unique id of the term
// logP(w1w2.. wn) = C(wj)∗logP(wj)
logProbabilityofSpam+= freq*log(spamModelArray[id]);
logProbabilityofNonSpam+= freq*log(nonspamModelArray[id]);
}//for
// Now I am calculating the probability of being spam for this document
if (logProbabilityofNonSpam + log(1-priorProb) > logProbabilityofSpam +log(priorProb)) { // argmax[logP(i|ck) + logP(ck)]
newclass = 1; //not spam
}else{
newclass = 0; // spam
}
}//for
Моя проблема в том, чтоЯ хочу вернуть вероятность каждого класса вместо точных 1 и 0 (спам / не спам).Я хочу видеть, например, newclass = 0.8684212, чтобы я мог применить порог позже.Но я запутался здесь.Как я могу рассчитать вероятность для каждого документа?Могу ли я использовать logProbabilities для его расчета?