這篇文章主要為大家詳細介紹了python機器學習之貝葉斯分類的相關資料,具有一定的參考價值,感興趣的小夥伴們可以參考一下
如果需要擷取到這個【Python機器學習】文檔的話幫忙轉發一下然後再關注我私信回複“學習”得到擷取方式吧!
一、貝葉斯分類介紹
貝葉斯分類器是一個統計分類器。它們能夠預測類别所屬的機率,如:一個資料對象屬于某個類别的機率。貝葉斯分類器是基于貝葉斯定理而構造出來的。對分類方法進行比較的有關研究結果表明:簡單貝葉斯分類器(稱為基本貝葉斯分類器)在分類性能上與決策樹和神經網絡都是可比的。
在處理大規模資料庫時,貝葉斯分類器已表現出較高的分類準确性和運算性能。基本貝葉斯分類器假設一個指定類别中各屬性的取值是互相獨立的。這一假設也被稱為:類别條件獨立,它可以幫助有效減少在構造貝葉斯分類器時所需要進行的計算。
二、貝葉斯定理
p(A|B) 條件機率 表示在B發生的前提下,A發生的機率;
基本貝葉斯分類器通常都假設各類别是互相獨立的,即各屬性的取值是互相獨立的。對于特定的類别且其各屬性互相獨立,就會有:
P(AB|C) = P(A|C)*P(B|C)
三、貝葉斯分類案例
1.分類屬性是離散
假設有樣本數為6個的訓練集數字如下:
現在假設來又來了一個人是症狀為咳嗽的教師,那這位教師是患上感冒、發燒、鼻炎的機率分别是多少呢?這個問題可以用貝葉斯分類來解決,最後三個疾病哪個機率高,就把這個咳嗽的教師劃為哪個類,實質就是分别求p(感冒|咳嗽*教師)和P(發燒 | 咳嗽 * 教師)
P(鼻炎 | 咳嗽 * 教師) 的機率;
假設各個類别互相獨立:
P(感冒)=3/6 P(發燒)=1/6 P(鼻炎)=2/6
p(咳嗽) = 3/6 P(教師)= 2/6
p(咳嗽 | 感冒) = 2/3 P(教師 | 感冒) = 1/3
故
按以上方法可分别求 P(發燒 | 咳嗽 × 教師) 和P(鼻炎 |咳嗽 × 教師 )的機率;
2.分類屬性連續
如果按上面的樣本上加一個年齡的屬性;因為年齡是連續,不能采用離散變量的方法計算機率。而且由于樣本太少,是以也無法分成區間計算;這時,可以假設感冒、發燒、鼻炎分類的年齡都是正态分布,通過樣本計算出均值和方差,也就是得到正态分布的密度函數;
下面就以求P(年齡=15|感冒)下的機率為例說明:
第一:求在感冒類下的年齡平均值 u=(15+48+12)/3=25
第二:求在感冒類下年齡的方差 代入下面公司可求:方差=266
第三:把年齡=15 代入正太分布公式如下:參數代進去既可以求的P(age=15|感冒)的機率
其他屬性按離散方法可求;
四、機率值為0處理
假設有這種情況出現,在訓練集上感冒的元祖有10個,有0個是孩子,有6個是學生,有4個教師;當分别求
P(孩子|感冒) =0; P(學生|感冒)=6/10 ; P(教師|感冒)=4/10 ;出現了機率為0的現象,為了避免這個現象,在假設訓練元祖數量大量的前提下,可以使用拉普拉斯估計法,把每個類型加1這樣可求的分别機率是
P(孩子|感冒) = 1/13 ; P(學生|感冒) = 7/13 ; P(教師|感冒)=4/13
五、垃圾郵件貝葉斯分類案例
1.準備訓練集資料
假設postingList為一個六個郵件内容,classVec=[0,1,0,1,0,1]為郵件類型,設1位垃圾郵件
- | def loadDataSet():
- | postingList =[['my','dog','has',' flea','problems','help','please'],
- | ['mybe','not','take','him','to','dog','park','stupid'],
- | ['my','dalmation','is','so','cute','i','love','hime'],
- | ['stop','posting','stupid','worthless','garbage'],
- | ['mr','licks','ate','my','steak','how','to','stop','hime'],
- | ['quit','buying','worthless','dog','food','stupid','quit']]
- | classVec =[0,1,0,1,0,1]
- | return postingList,classVec
2.根據所有的郵件内容建立一個所有單詞集合
- | def createVocabList(dataSet):
- | vocabSet =set([])
- | for document in dataSet:
- | vocabSet = vocabSet | set(document)
- | return list(vocabSet)
測試後擷取所有不重複單詞的集合見下一共:
3.根據2部所有不重複的單詞集合對每個郵件内容向量化
- | def bagOfWords2VecMN(vocabList,inputSet):
- | returnVec =[0]*len(vocabList)
- | for word in inputSet:
- | returnVec[vocabList.index(word)] +=1
- | return returnVec
測試後可得如下,列印内容為向量化的六個郵件内容
4.訓練模型,此時就是分别求p(垃圾|文檔) = p(垃圾)*p(文檔|垃圾)/p(文檔)
- | def trainNBO(trainMatrix,trainCategory):
- | numTrainDocs = len(trainMatrix)
- | numWords =len(trainMatrix[0])
- | #計算p(垃圾)的機率
- | pAbusive = sum(trainCategory)/float(numTrainDocs)
- | #為了防止一個機率為0,假設都有一個
- | p0Num =ones(numWords);
- | p1Num = ones(numWords)
- | p0Denom =2.0;p1Denom=2.0;
- | for i in range(numTrainDocs):
- | if trainCategory[i] ==1:
- | p1Num +=trainMatrix[i]
- | p1Denom +=sum(trainMatrix[i])
- | else:
- | p0Num +=trainMatrix[i]
- | p0Denom +=sum(trainMatrix[i])
- | p1Vect = np.log((p1Num/p1Denom))
- | p0Vect = np.log(p0Num/p0Denom)
- | return p0Vect,p1Vect,pAbusive
對訓練模型進行測試結果如下:
5.定義分類方法
- | def classifyNB(vec2Classify,p0Vec,p1Vec,pClass1):
- | p1 =sum(vec2Classify * p1Vec) +math.log(pClass1)
- | p0 = sum(vec2Classify * p0Vec)+math.log(1.0-pClass1)
- | if p1>p0:
- | return 1
- | else:
- | return 0
6.以上分類完成,下面就對其進行測試,測試方法如下:
- | def testingNB():
- | listOPosts,ListClasses = loadDataSet();
- | myVocabList = createVocabList(listOPosts)
- | trainMat=[]
- | for postinDoc in listOPosts:
- | trainMat.append(bagOfWords2VecMN(myVocabList,postinDoc))
- | p0V,p1V,pAb =trainNBO(trainMat,ListClasses)
- | testEntry =['stupid','my','dalmation']
- | thisDoc = array(bagOfWords2VecMN(myVocabList,testEntry))
- | print testEntry,'classified as',classifyNB(thisDoc,p0V,p1V,pAb)
結果如下:
以上就是本文的全部内容,希望對大家的學習有所幫助,也希望大家多多支援小編。