Vor- und Nachteile des Algorithmus
Vorteile: Immer noch effektiv, wenn weniger Daten vorhanden sind, kann Probleme mit mehreren Kategorien bewältigen
Nachteile: Empfindlich gegenüber der Art und Weise, wie Eingabedaten vorbereitet werden
Anwendbarer Datentyp: Nominaldaten
Algorithmusidee:
Naive Bayes
Wenn wir beispielsweise feststellen möchten, ob eine E-Mail Spam ist, was wissen wir dann? ist das Die Verteilung von Wörtern in E-Mails, dann müssen wir auch wissen: die Häufigkeit bestimmter Wörter in Spam-E-Mails, die mithilfe des Bayes-Theorems ermittelt werden können.
Eine Annahme im Naive Bayes-Klassifikator ist, dass jedes Merkmal gleich wichtig ist
Bayes'sche Klassifikation ist der allgemeine Begriff für eine Klasse von Klassifikationsalgorithmen, die alle auf dem Satz von Bayes als Grundlage basieren , wird sie zusammenfassend als Bayes'sche Klassifikation bezeichnet.
Funktion
loadDataSet()
erstellt einen Datensatz, der aus aufgeteilten Wörtern besteht und Benutzerkommentare in einem Forum darstellt. Tag 1 bedeutet, dass dies ein Fluch ist
createVocabList(dataSet)
Finden Sie heraus, wie viele Wörter diese Sätze insgesamt enthalten, um die Größe unserer Wortvektoren zu bestimmen
setOfWords2Vec (vocabList, inputSet)
Konvertieren Sie den Satz basierend auf den darin enthaltenen Wörtern in einen Vektor. Das Bernoulli-Modell wird hier verwendet, dh nur, ob das Wort existiert
bagOfWords2VecMN(vocabList, inputSet )
Dies ist ein weiteres Modell, das Sätze in Vektoren umwandelt, ein Polynommodell, das die Häufigkeit des Vorkommens eines bestimmten Wortes berücksichtigt
trainNB0(trainMatrix,trainCatergory)
Berechnen Sie P (i) und P (w[i]|C[1]) und P(w[i]|C[0]), hier gibt es zwei Tricks. Einer ist, dass der Startzähler und der Nenner nicht alle auf 0 initialisiert werden Um zu verhindern, dass die Wahrscheinlichkeit, dass einer von ihnen 0 ist, der Gesamtwert 0 ist, und der andere, wird später der multiplikative Logarithmus verwendet, um zu verhindern, dass das Ergebnis aufgrund von Genauigkeitsproblemen 0 ist
classifyNB(vec2Classify, p0Vec, p1Vec, pClass1)
Berechnen Sie dies gemäß der Bayes'schen Formel. Welche der beiden Mengen hat eine höhere Wahrscheinlichkeit, dass der Vektor zu
#coding=utf-8 from numpy import * def loadDataSet(): postingList=[['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'], ['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'], ['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'], ['stop', 'posting', 'stupid', 'worthless', 'garbage'], ['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'], ['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']] classVec = [0,1,0,1,0,1] #1 is abusive, 0 not return postingList,classVec #创建一个带有所有单词的列表 def createVocabList(dataSet): vocabSet = set([]) for document in dataSet: vocabSet = vocabSet | set(document) return list(vocabSet) def setOfWords2Vec(vocabList, inputSet): retVocabList = [0] * len(vocabList) for word in inputSet: if word in vocabList: retVocabList[vocabList.index(word)] = 1 else: print 'word ',word ,'not in dict' return retVocabList #另一种模型 def bagOfWords2VecMN(vocabList, inputSet): returnVec = [0]*len(vocabList) for word in inputSet: if word in vocabList: returnVec[vocabList.index(word)] += 1 return returnVec def trainNB0(trainMatrix,trainCatergory): numTrainDoc = len(trainMatrix) numWords = len(trainMatrix[0]) pAbusive = sum(trainCatergory)/float(numTrainDoc) #防止多个概率的成绩当中的一个为0 p0Num = ones(numWords) p1Num = ones(numWords) p0Denom = 2.0 p1Denom = 2.0 for i in range(numTrainDoc): if trainCatergory[i] == 1: p1Num +=trainMatrix[i] p1Denom += sum(trainMatrix[i]) else: p0Num +=trainMatrix[i] p0Denom += sum(trainMatrix[i]) p1Vect = log(p1Num/p1Denom)#处于精度的考虑,否则很可能到限归零 p0Vect = log(p0Num/p0Denom) return p0Vect,p1Vect,pAbusive def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1): p1 = sum(vec2Classify * p1Vec) + log(pClass1) #element-wise mult p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1) if p1 > p0: return 1 else: return 0 def testingNB(): listOPosts,listClasses = loadDataSet() myVocabList = createVocabList(listOPosts) trainMat=[] for postinDoc in listOPosts: trainMat.append(setOfWords2Vec(myVocabList, postinDoc)) p0V,p1V,pAb = trainNB0(array(trainMat),array(listClasses)) testEntry = ['love', 'my', 'dalmation'] thisDoc = array(setOfWords2Vec(myVocabList, testEntry)) print testEntry,'classified as: ',classifyNB(thisDoc,p0V,p1V,pAb) testEntry = ['stupid', 'garbage'] thisDoc = array(setOfWords2Vec(myVocabList, testEntry)) print testEntry,'classified as: ',classifyNB(thisDoc,p0V,p1V,pAb) def main(): testingNB() if __name__ == '__main__': main()