朴素贝叶斯模型简单理解
小白一個,如果有問題歡迎大家指正。
?
?
樸素貝葉斯法
樸素貝葉斯法是基于貝葉斯定理與特征條件獨立假設的分類方法。對于給定的訓練數據集,首先基于特征條件獨立假設學習輸入\輸出的聯合概率分布;然后基于此模型,對給定的輸入x,利用貝葉斯定理求出后驗概率最大的輸出y。這里可以舉個例子,就好比醫生在幫病人看病的時候,病人手里的化驗單以及各種檢測證明(假設證明之間相互獨立),就是特征條件,醫生就好比是一個分類器,輸入了一堆特征條件x,然后進行判斷病人具體得的是什么病也就是P(y|x)概率最大的那個,并且這個醫生診斷的準確率,與他當初受到的教育方式(構造方法)、病人的癥狀是否突出(待分類數據的特性)以及醫生的經驗多少(訓練樣本數量)都有密切關系。這個過程就是分類的過程。
這里先給出幾個概率的公式,讓大家回憶一下,后續會用到。
條件概率:? ? ? ?? ? ? ? ? ? ? ? ? ? P(B)為先驗概率,P(A|B)為后驗概率,P(AB)為聯合概率
全概率:? ? ? ? ?
貝葉斯公式:?
這里給一道貝葉斯公式的例題
Q:8支步槍中有5支已校準過,3支未校準。一個射手用校準過的槍射擊,中靶概率為0.8,用未校準過的槍射擊,中靶概率為0.3,現從8支槍中隨機取一支射擊,結果中靶。求該槍是已校準過的概率。
A:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?
?
OK,那么現在開始樸素貝葉斯的學習。首先要給出兩個樸素貝葉斯的假設。
1、一個特征的出現的概率,與其他特征(條件)獨立,其實也就是說對于給定分類的條件下,特征獨立。
2、每一個特征同等重要(特征均衡性)
?
那么在這個假設的情況下,我們回過頭來去看看貝葉斯公式,將會有新的發現(我感覺信息量巨大的發現。。。)
貝葉斯公式帶來的一些思考?
在給定某些樣本D的時候,在這些樣本中計算某些結論出現的概率,即
? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
第一個等式:貝葉斯公式
第二個等式:樣本給定的情況下,則對于任何的Ai,P(D)是常數,僅僅只是一個歸一化因子,所以可以去掉。
第三個箭頭:若這些結論的先驗概率相等或者相近似,則得到最后一個等式。也就是可以理解為Ai的分布是均勻分布,這估計也是樸素貝葉斯的第二個假設的原因。
總結:在已知樣本D的時候,我們想要知道最有可能是哪一個結論到時候(也就是輸入一個x,我們想要知道它的分類),我們通常不是計算,而是去計算。后面的那個概率其實就是極大似然估計了,因為我們之前LR模型或者線性回歸里面,我們去估計參數的時候,都是假定參數是同等重要的,然后在此前提下去找到Ai使得分割面或者分割線,使得數據得到最大。所以,極大似然估計里面先驗的假定了Ai是相同的。
這里換一種簡單的方式說明邏輯回歸和樸素貝葉斯之間的關系。
假設是一個二分類問題,并且存在三個特征X1,X2,X3。
那么
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
所以分類的最終目的就在于,,便可以說明Y=1的概率比Y=0的概率更大。所以兩個概率相除,得到
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
但是,由于概率值域是[0,1],相乘和相除容易產生過小的數值,導致編程下溢問題,所以兩邊取對數得到
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
對于樸素貝葉斯而言,由于之前提過的,樸素貝葉斯當中有個強假設,就是條件獨立假設,每個條件之間沒有耦合,相互獨立。所以對數可以進一步拆分成
? ? ? ? ? ? ? ? ?
對于邏輯回歸而言,是用線性模型的預測結果取逼近這個后驗概率的比值,也就是
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
此時,我們就可以發現兩者的表達式是多么的相似。但是二者的區別就是在于,用了兩種不同的方法求出來權重是不一樣的。產生差別的原因就是在于之前樸素貝葉斯之中有一個強假設(條件獨立性假設),因為這個強假設所以樸素貝葉斯不需要梯度下降直接通過統計每個特征的后驗概率來當做權重,而邏輯回歸,條件獨立假設不成立,所以通過梯度下降法,可以得到特征之間的耦合信息,從而得到相應的權重。
?
?
鋪墊了這么多,現在開始通過一個文本分類的例子,了解樸素貝葉斯。
樣本有10000封郵件,每個郵件被標記為垃圾郵件或者非垃圾郵件,目標是確定未知的郵件是垃圾郵件還是非垃圾郵件。
首先,這是一個二分類問題,假設類別c:垃圾郵件c1,非垃圾郵件c2。之后我們需要進行統計里面的單詞,且每個單詞出現了幾次,相當于是建立一個詞匯表。建立詞匯表有兩種方法。
1、可以使用現成的單詞詞典,可以包含大量的單詞;
2、可以將所有郵件中出現的單詞全部統計出來,得到詞典。
我們記錄單詞的數目為N。那么就可以將每個郵件m映射成一個維度為N的向量x。若單詞在郵件m中出現過,則=1,否則,=0。即郵件可以全部向量化。(也可以記錄頻數)。
然后根據貝葉斯公式:
注意這里x是向量。由于我們之前進行強假設,特征之間是相互獨立的,所以,P(x|c)可以進行拆分。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
帶回之前的公式就可以求出P(c|x),包含x特征的郵件是屬于哪一類郵件。順便提一句,公式右邊都是可以通過統計求出具體的值,因為根據大數定理,當樣本足夠大的時候,我們可以認為統計的比例近似于概率。
在這里寫下右邊各項的含義。
: 在(此題目,要么是垃圾郵件,要么是非垃圾郵件)的前提下,第i個單詞出現的概率(頻率)。
:在所有樣本中,單詞出現的概率(頻率)。
:在所有樣本中,郵件類別出現的概率(頻率)。
所以,舉個例子,比如“我司可辦理正規發票(保真)17%增值稅發票點數優惠!”這一句話,我們需要判斷出現這句話的郵件,是不是垃圾郵件,就是要看在垃圾郵件中,出現這些詞的次數,然后根據大數定理,我們假定頻率就代表著概率,就比如P(“發票”|c=c1(垃圾郵件))=(垃圾郵件中所有"發票"的次數)/(垃圾郵件中所有詞的次數)。由于并行的計算,所以我們工業界進行詞匯統計是很快的。
?
這里給個代碼(不是分類垃圾郵件的,是Mnist數字識別的,超級無敵的詳細,每行基本上都有注釋,感謝大佬寫的代碼,鏈接我放在了后面)
# coding=utf-8 # Author:Dodo # Date:2018-11-17 # Email:lvtengchao@pku.edu.cn''' 數據集:Mnist 訓練集數量:60000 測試集數量:10000 ------------------------------ 運行結果:正確率:84.3%運行時長:103s '''import numpy as np import timedef loadData(fileName):'''加載文件:param fileName:要加載的文件路徑:return: 數據集和標簽集'''#存放數據及標記dataArr = []; labelArr = []#讀取文件fr = open(fileName)#遍歷文件中的每一行for line in fr.readlines():#獲取當前行,并按“,”切割成字段放入列表中#strip:去掉每行字符串首尾指定的字符(默認空格或換行符)#split:按照指定的字符將字符串切割成每個字段,返回列表形式curLine = line.strip().split(',')#將每行中除標記外的數據放入數據集中(curLine[0]為標記信息)#在放入的同時將原先字符串形式的數據轉換為整型#此外將數據進行了二值化處理,大于128的轉換成1,小于的轉換成0,方便后續計算dataArr.append([int(int(num) > 128) for num in curLine[1:]])#將標記信息放入標記集中#放入的同時將標記轉換為整型labelArr.append(int(curLine[0]))#返回數據集和標記return dataArr, labelArrdef NaiveBayes(Py, Px_y, x):'''通過樸素貝葉斯進行概率估計:param Py: 先驗概率分布:param Px_y: 條件概率分布:param x: 要估計的樣本x:return: 返回所有label的估計概率'''#設置特征數目featrueNum = 784#設置類別數目classNum = 10#建立存放所有標記的估計概率數組P = [0] * classNum#對于每一個類別,單獨估計其概率for i in range(classNum):#初始化sum為0,sum為求和項。#在訓練過程中對概率進行了log處理,所以這里原先應當是連乘所有概率,最后比較哪個概率最大#但是當使用log處理時,連乘變成了累加,所以使用sumsum = 0#獲取每一個條件概率值,進行累加for j in range(featrueNum):sum += Px_y[i][j][x[j]]#最后再和先驗概率相加(也就是式4.7中的先驗概率乘以后頭那些東西,乘法因為log全變成了加法)P[i] = sum + Py[i]#max(P):找到概率最大值#P.index(max(P)):找到該概率最大值對應的所有(索引值和標簽值相等)return P.index(max(P))def model_test(Py, Px_y, testDataArr, testLabelArr):'''對測試集進行測試:param Py: 先驗概率分布:param Px_y: 條件概率分布:param testDataArr: 測試集數據:param testLabelArr: 測試集標記:return: 準確率'''#錯誤值計數errorCnt = 0#循環遍歷測試集中的每一個樣本for i in range(len(testDataArr)):#獲取預測值presict = NaiveBayes(Py, Px_y, testDataArr[i])#與答案進行比較if presict != testLabelArr[i]:#若錯誤 錯誤值計數加1errorCnt += 1#返回準確率return 1 - (errorCnt / len(testDataArr))def getAllProbability(trainDataArr, trainLabelArr):'''通過訓練集計算先驗概率分布和條件概率分布:param trainDataArr: 訓練數據集:param trainLabelArr: 訓練標記集:return: 先驗概率分布和條件概率分布'''#設置樣本特診數目,數據集中手寫圖片為28*28,轉換為向量是784維。# (我們的數據集已經從圖像轉換成784維的形式了,CSV格式內就是)featureNum = 784#設置類別數目,0-9共十個類別classNum = 10#初始化先驗概率分布存放數組,后續計算得到的P(Y = 0)放在Py[0]中,以此類推#數據長度為10行1列Py = np.zeros((classNum, 1))#對每個類別進行一次循環,分別計算它們的先驗概率分布#計算公式為書中"4.2節 樸素貝葉斯法的參數估計 公式4.8"for i in range(classNum):#下方式子拆開分析#np.mat(trainLabelArr) == i:將標簽轉換為矩陣形式,里面的每一位與i比較,若相等,該位變為Ture,反之False#np.sum(np.mat(trainLabelArr) == i):計算上一步得到的矩陣中Ture的個數,進行求和(直觀上就是找所有label中有多少個#為i的標記,求得4.8式P(Y = Ck)中的分子)#np.sum(np.mat(trainLabelArr) == i)) + 1:參考“4.2.3節 貝葉斯估計”,例如若數據集總不存在y=1的標記,也就是說#手寫數據集中沒有1這張圖,那么如果不加1,由于沒有y=1,所以分子就會變成0,那么在最后求后驗概率時這一項就變成了0,再#和條件概率乘,結果同樣為0,不允許存在這種情況,所以分子加1,分母加上K(K為標簽可取的值數量,這里有10個數,取值為10)#參考公式4.11#(len(trainLabelArr) + 10):標簽集的總長度+10.#((np.sum(np.mat(trainLabelArr) == i)) + 1) / (len(trainLabelArr) + 10):最后求得的先驗概率Py[i] = ((np.sum(np.mat(trainLabelArr) == i)) + 1) / (len(trainLabelArr) + 10)#轉換為log對數形式#log書中沒有寫到,但是實際中需要考慮到,原因是這樣:#最后求后驗概率估計的時候,形式是各項的相乘(“4.1 樸素貝葉斯法的學習” 式4.7),這里存在兩個問題:1.某一項為0時,結果為0.#這個問題通過分子和分母加上一個相應的數可以排除,前面已經做好了處理。2.如果特診特別多(例如在這里,需要連乘的項目有784個特征#加一個先驗概率分布一共795項相乘,所有數都是0-1之間,結果一定是一個很小的接近0的數。)理論上可以通過結果的大小值判斷, 但在#程序運行中很可能會向下溢出無法比較,因為值太小了。所以人為把值進行log處理。log在定義域內是一個遞增函數,也就是說log(x)中,#x越大,log也就越大,單調性和原數據保持一致。所以加上log對結果沒有影響。此外連乘項通過log以后,可以變成各項累加,簡化了計算。#在似然函數中通常會使用log的方式進行處理(至于此書中為什么沒涉及,我也不知道)Py = np.log(Py)#計算條件概率 Px_y=P(X=x|Y = y)#計算條件概率分成了兩個步驟,下方第一個大for循環用于累加,參考書中“4.2.3 貝葉斯估計 式4.10”,下方第一個大for循環內部是#用于計算式4.10的分子,至于分子的+1以及分母的計算在下方第二個大For內#初始化為全0矩陣,用于存放所有情況下的條件概率Px_y = np.zeros((classNum, featureNum, 2))#對標記集進行遍歷for i in range(len(trainLabelArr)):#獲取當前循環所使用的標記label = trainLabelArr[i]#獲取當前要處理的樣本x = trainDataArr[i]#對該樣本的每一維特診進行遍歷for j in range(featureNum):#在矩陣中對應位置加1#這里還沒有計算條件概率,先把所有數累加,全加完以后,在后續步驟中再求對應的條件概率Px_y[label][j][x[j]] += 1#第二個大for,計算式4.10的分母,以及分子和分母之間的除法#循環每一個標記(共10個)for label in range(classNum):#循環每一個標記對應的每一個特征for j in range(featureNum):#獲取y=label,第j個特診為0的個數Px_y0 = Px_y[label][j][0]#獲取y=label,第j個特診為1的個數Px_y1 = Px_y[label][j][1]#對式4.10的分子和分母進行相除,再除之前依據貝葉斯估計,分母需要加上2(為每個特征可取值個數)#分別計算對于y= label,x第j個特征為0和1的條件概率分布Px_y[label][j][0] = np.log((Px_y0 + 1) / (Px_y0 + Px_y1 + 2))Px_y[label][j][1] = np.log((Px_y1 + 1) / (Px_y0 + Px_y1 + 2))#返回先驗概率分布和條件概率分布return Py, Px_yif __name__ == "__main__":start = time.time()# 獲取訓練集print('start read transSet')trainDataArr, trainLabelArr = loadData('路徑/mnist_train.csv')# print("trainDataArr", trainDataArr, "trainLabelArr", trainLabelArr)# 獲取測試集print('start read testSet')testDataArr, testLabelArr = loadData('路徑/mnist_test.csv')#開始訓練,學習先驗概率分布和條件概率分布print('start to train')Py, Px_y = getAllProbability(trainDataArr, trainLabelArr)#使用習得的先驗概率分布和條件概率分布對測試集進行測試print('start to test')accuracy = model_test(Py, Px_y, testDataArr, testLabelArr)#打印準確率print('the accuracy is:', accuracy)#打印時間print('time span:', time.time() -start)?
?
樸素貝葉斯對于貝葉斯,樸素在了哪里?
因為乘法具有交換律,所以交換乘法的順序不影響結果,但是,這就導致了樸素貝葉斯丟失了詞語之間的順序信息。在樸素貝葉斯眼里,“武松打死老虎”和“老虎打死武松”是完全相同的,這也就是說明了樸素貝葉斯丟失了詞語之間的順序信息(因為乘法具有交換律,所以交換乘法的順序不影響結果),就相當于把所有的詞匯扔進了一個袋子里面隨便攪和。
樸素貝葉斯模型
當特征離散的情況:
多項式模型
重復的詞語我們視為其出現多次,統計和判斷的時候都要關注重復次數
伯努利模型
將重復出現的詞語都視為其只出現一次,這種方式更加簡化與方便。當然也丟失了詞頻信息,因此效果會差點。
混合模型
在計算句子概率時,不考慮重復詞語出現的次數,但是在統計計算詞語的概率時,卻考慮重復詞語出現的次數,也就是在訓練的時候考慮重復次數,測試的時候不考慮。這種方式更加簡化與方便。當然也丟失了詞頻信息,因此效果會差點。在訓練的時候關注樣本的真實概率分布,而測試的時候為了實時判斷,就只計算一次。這種更關注實時性,因為判斷統計的時候會更快點。
當特征連續的情況:
高斯模型
當樣本為例如身高體重等類似的連續特征,并且樣本數量太少無法進行區間計算時,我們可以根據樣本計算出均值和方差,并且假設樣本分布為正態分布,這樣我們就得到了密度函數。根據密度函數,我們可以將待求得特征值代入,得到密度函數得值。比如,男性的身高是均值5.855、方差0.035的正態分布。所以,男性的身高為6英尺的概率的相對值等于1.5789。根據得到的值進行計算類別。
?
平滑技術
常用得平滑技術基本上時拉普拉斯平滑。由于在測試集上,可能出現未記錄得特征,導致P(x|y)為0,從而得到的P(y|x)為0,這顯然時不對的。這個錯誤是因為訓練集不足,所以,這個時候我們引入平滑技術。
思想其實很簡單,只要讓概率不為0就好了,哪怕是一個再小的數都可以。所以,對于每個類別下所有劃分的計數都加1。
?
其中ajl,代表第j個特征的第l個選擇,Sj代表第j個特征的個數,K代表種類的個數。為1就是拉普拉斯平滑。
?
面試題(我只是個搬運工):
問題:什么是貝葉斯決策論?
回答:貝葉斯決策論是概率框架下實施決策的基本方法。要了解貝葉斯決策論,首先得先了解以下幾個概念:先驗概率、條件概率、后驗概率、誤判損失、條件風險、貝葉斯判別準則。概念似乎有點多,別急,下面我們一個個來進行討論。
先驗概率: 所謂先驗概率,就是根據以往的經驗或者現有數據的分析所得到的概率。如,隨機扔一枚硬幣,則p(正面) = p(反面) = 1/2,這是我們根據已知的知識所知道的信息,即p(正面) = 1/2為先驗概率。
條件概率: 所謂條件概率是指事件A在另一事件B發生的條件下發送的概率。用數學符號表示為:P(B|A),即B在A發生的條件下發生的概率。舉個栗子,你早上誤喝了一瓶過期了的牛奶(A),那我們來算一下你今天拉肚子的概率(B),這個就叫做條件概率。即P(拉肚子|喝了過期牛奶), 易見,條件概率是有因求果(知道原因推測結果)。
后驗概率: 后驗概率跟條件概率的表達形式有點相似。數學表達式為p(A|B), 即A在B發生的條件下發生的概率。以誤喝牛奶的例子為例,現在知道了你今天拉肚子了(B),算一下你早上誤喝了一瓶過期了的牛奶(A)的概率, 即P(A|B),這就是后驗概率,后驗概率是有果求因(知道結果推出原因)
誤判損失: 數學表達式:L(j|i), 判別損失表示把一個標記為i類的樣本誤分類為j類所造成的損失。 比如,當你去參加體檢時,明明你各項指標都是正常的,但是醫生卻把你分為癌癥病人,這就造成了誤判損失,用數學表示為:L(癌癥|正常)。
條件風險: 是指基于后驗概率P(i|x)可獲得將樣本x分類為i所產生的期望損失,公式為:R(i|x) = ∑L(i|j)P(j|x)。(其實就是所有判別損失的加權和,而這個權就是樣本判為j類的概率,樣本本來應該含有P(j|x)的概率判為j類,但是卻判為了i類,這就造成了錯判損失,而將所有的錯判損失與正確判斷的概率的乘積相加,就能得到樣本錯判為i類的平均損失,即條件風險。)
舉個栗子,假設把癌癥病人判為正常人的誤判損失是100,把正常人判為癌癥病人的誤判損失是10,把感冒病人判為癌癥的誤判損失是8,即L(正常|癌癥) = 100, L(癌癥|正常) = 10,L(癌癥|感冒) = 8, 現在,我們經過計算知道有一個來體檢的員工的后驗概率分別為:p(正常|各項指標) = 0.2, p(感冒|各項指標) = 0.4, p( 癌癥|各項指標)=0.4。假如我們需要計算將這個員工判為癌癥的條件風險,則:R(癌癥|各項指標) = L(癌癥|正常)* p(正常|各項指標) + L(癌癥|感冒) * p(感冒|各項指標) = 5.2。
貝葉斯判別準則: 貝葉斯判別準則是找到一個使條件風險達到最小的判別方法。即,將樣本判為哪一類,所得到的條件風險R(i|x)(或者說平均判別損失)最小,那就將樣本歸為那個造成平均判別損失最小的類。
此時:h*(x) = argminR(i|x) 就稱為 貝葉斯最優分類器。
總結:貝葉斯決策論是基于先驗概率求解后驗概率的方法,其核心是尋找一個判別準則使得條件風險達到最小。而在最小化分類錯誤率的目標下,貝葉斯最優分類器又可以轉化為求后驗概率達到最大的類別標記,即 h*(x) = argmaxP(i|x)。(此時,L(i|j) = 0, if i = j;L(i|j) = 1, otherwise)
問題1:你知道什么叫做樸素貝葉斯嗎?
回答:知道。樸素貝葉斯采用 屬性條件獨立性 的假設,對于給定的待分類觀測數據X,計算在X出現的條件下,各個目標類出現的概率(即后驗概率),將該后驗概率最大的類作為X所屬的類。而計算后驗概率的貝葉斯公式為:p(A|B) =[ p(A) * p(B|A)]/p(B),因為p(B)表示觀測數據X出現的概率,它在所有關于X的分類計算公式中都是相同的,所以我們可以把p(B)忽略,則 p(A|B)= p(A) * p(B|A)。
舉個栗子,公司里面男性有60人,女性有40人,男性穿皮鞋的人數有25人,穿運動鞋的人數有35人,女性穿皮鞋的人數有10人,穿高跟鞋的人數有30人。現在你只知道有一個人穿了皮鞋,這時候你就需要推測他的性別是什么。如果推測出他是男性的概率大于女性,那么就認為他是男性,否則認為他是女性。(如果此時條件允許,你可以現場給面試官演示一下怎么計算, 計算過程如下:
p(性別 = 男性) = 0.6
p(性別 = 女性) = 0.4
p(穿皮鞋|男性)? = 0.417
p(穿皮鞋|女性) = 0.25
p(穿皮鞋|男性) * p(性別 = 男性) = 0.2502
p(穿皮鞋|女性) * p(性別 = 女性) = 0.1
因為0.2502>0.1, 所以我們可以認為這個人是男性)
?
問題2:樸素貝葉斯中的“樸素”怎么理解?
回答:樸素貝葉斯中的樸素可以理解為是“簡單、天真”的意思,因為“樸素”是假設了特征之間是同等重要、相互獨立、互不影響的,但是在我們的現實社會中,屬性之間并不是都是互相獨立的,有些屬性也會存在性,所以說樸素貝葉斯是一種很“樸素”的算法。
(有沒有注意到,如果遇到這個問題的話,接下來面試官可能會問的范圍就很廣了,建議面試者可以準備一下半樸素貝葉斯跟貝葉斯網絡的知識)
問題3:你能說說樸素貝葉斯的工作流程是怎么樣的嗎?
回答:樸素貝葉斯的工作流程可以分為三個階段進行,分別是準備階段、分類器訓練階段和應用階段。
準備階段:這個階段的任務是為樸素貝葉斯分類做必要的準備,主要工作是根據具體情況確定特征屬性,并對每個特征屬性進行適當劃分,去除高度相關性的屬性(如果兩個屬性具有高度相關性的話,那么該屬性將會在模型中發揮了2次作用,會使得樸素貝葉斯所預測的結果向該屬性所希望的方向偏離,導致分類出現偏差),然后由人工對一部分待分類項進行分類,形成訓練樣本集合。這一階段的輸入是所有待分類數據,輸出是特征屬性和訓練樣本。(這一階段是整個樸素貝葉斯分類中唯一需要人工完成的階段,其質量對整個過程將有重要影響。)
分類器訓練階段:這個階段的任務就是生成分類器,主要工作是計算每個類別在訓練樣本中的出現頻率及每個特征屬性劃分對每個類別的條件概率估計,并將結果記錄。其輸入是特征屬性和訓練樣本,輸出是分類器。這一階段是機械性階段,根據前面討論的公式可以由程序自動計算完成。
應用階段:這個階段的任務是使用分類器對待分類項進行分類,其輸入是分類器和待分類項,輸出是待分類項與類別的映射關系。這一階段也是機械性階段,由程序完成。
?
問題4:你能給我說說樸素貝葉斯有什么優缺點嗎?
回答:樸素貝葉斯的優點有4個,分別是:
樸素貝葉斯模型發源于古典數學理論,有穩定的分類效率。
對缺失數據不太敏感,算法也比較簡單,常用于文本分類。
分類準確度高,速度快。
對小規模的數據表現很好,能處理多分類任務,適合增量式訓練,當數據量超出內存時,我們可以一批批的去增量訓練(樸素貝葉斯在訓練過程中只需要計算各個類的概率和各個屬性的類條件概率,這些概率值可以快速地根據增量數據進行更新,無需重新全量計算)。
樸素貝葉斯的缺點有3個,分別是:
對訓練數據的依賴性很強,如果訓練數據誤差較大,那么預測出來的效果就會不佳。
理論上,樸素貝葉斯模型與其他分類方法相比具有最小的誤差率。 但是在實際中,因為樸素貝葉斯“樸素,”的特點,導致在屬性個數比較多或者屬性之間相關性較大時,分類效果不好。 而在屬性相關性較小時,樸素貝葉斯性能最為良好。 對于這一點,有半樸素貝葉斯之類的算法通過考慮部分關聯性適度改進。
需要知道先驗概率,且先驗概率很多時候是基于假設或者已有的訓練數據所得的,這在某些時候可能會因為假設先驗概率的原因出現分類決策上的錯誤。
問題5:“樸素”是樸素貝葉斯在進行預測時候的缺點,那么有這么一個明顯的假設缺點在,為什么樸素貝葉斯的預測仍然可以取得較好的效果?
回答:
對于分類任務來說,只要各個條件概率之間的排序正確,那么就可以通過比較概率大小來進行分類,不需要知道精確的概率值(樸素貝葉斯分類的核心思想是找出后驗概率最大的那個類,而不是求出其精確的概率)
如果屬性之間的相互依賴對所有類別的影響相同,或者相互依賴關系可以互相抵消,那么屬性條件獨立性的假設在降低計算開銷的同時不會對分類結果產生不良影響。
問題6:什么是拉普拉斯平滑法?
回答:拉普拉斯平滑法是樸素貝葉斯中處理零概率問題的一種修正方式。在進行分類的時候,可能會出現某個屬性在訓練集中沒有與某個類同時出現過的情況,如果直接基于樸素貝葉斯分類器的表達式進行計算的話就會出現零概率現象。為了避免其他屬性所攜帶的信息被訓練集中未出現過的屬性值“抹去”,所以才使用拉普拉斯估計器進行修正。具體的方法是:在分子上加1,對于先驗概率,在分母上加上訓練集中可能的類別數;對于條件概率,則在分母上加上第i個屬性可能的取值數
問題7:樸素貝葉斯中有沒有超參數可以調?
回答:樸素貝葉斯是沒有超參數可以調的,所以它不需要調參,樸素貝葉斯是根據訓練集進行分類,分類出來的結果基本上就是確定了的,拉普拉斯估計器不是樸素貝葉斯中的參數,不能通過拉普拉斯估計器來對樸素貝葉斯調參。
問題8:樸素貝葉斯中有多少種模型?
回答:樸素貝葉斯含有3種模型,分別是高斯模型,對連續型數據進行處理;多項式模型,對離散型數據進行處理,計算數據的條件概率(使用拉普拉斯估計器進行平滑的一個模型);伯努利模型,伯努利模型的取值特征是布爾型,即出現為ture,不出現為false,在進行文檔分類時,就是一個單詞有沒有在一個文檔中出現過。
問題9: 你知道樸素貝葉斯有哪些應用嗎?
回答:知道(肯定得知道啊,不然不就白學了嗎?) 樸素貝葉斯的應用最廣的應該就是在文檔分類、垃圾文本過濾(如垃圾郵件、垃圾信息等)、情感分析(微博、論壇上的積極、消極等情緒判別)這些方面,除此之外還有多分類實時預測、推薦系統(貝葉斯與協同過濾組合使用)、拼寫矯正(當你輸入一個錯誤單詞時,可以通過文檔庫中出現的概率對你的輸入進行矯正)等。
問題10:你覺得樸素貝葉斯對異常值敏不敏感?
回答:樸素貝葉斯對異常值不敏感。所以在進行數據處理時,我們可以不去除異常值,因為保留異常值可以保持樸素貝葉斯算法的整體精度,而去除異常值則可能在進行預測的過程中由于失去部分異常值導致模型的泛化能力下降。
問題11:樸素貝葉斯是高方差還是低方差模型?
回答:樸素貝葉斯是低方差模型。(誤差 = 偏差 + 方差)對于復雜模型來說,由于復雜模型充分擬合了部分數據,使得它們的偏差變小,但由于對部分數據過分擬合,這就導致預測的方差會變大。因為樸素貝葉斯假設了各個屬性之間是相互的,算是一個簡單的模型。對于簡單的模型來說,則恰恰相反,簡單模型的偏差會更大,相對的,方差就會較小。(偏差是模型輸出值與真實值的誤差,也就是模型的精準度,方差是預測值與模型輸出期望的的誤差,即模型的穩定性,也就是數據的集中性的一個指標)
?
?
?
參考
https://github.com/Dod-o/Statistical-Learning-Method_Code/blob/master/CodePic.png? ? ? ? ? ? ? ? ? ? ?(實現李航統計學習里面的代碼,基本上每行都有注釋,很nice)
https://cloud.tencent.com/developer/article/1474960? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(樸素貝葉斯面試題來源)
?
總結
以上是生活随笔為你收集整理的朴素贝叶斯模型简单理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信分享出错问题,MicroMsg.SD
- 下一篇: 阿森纳球迷高考试卷