Naive Bayes is a probabilistic machine learning algorithm based on the Bayes Theorem, used in a wide variety of classification tasks.
貝葉斯算法是分類問題的重要解決方法,簡單但是很強(qiáng)大,在文本分類、垃圾郵件識別等高維數(shù)據(jù)(特征超多的數(shù)據(jù)集)的機(jī)器學(xué)習(xí)領(lǐng)域有重要應(yīng)用。基本邏輯就是很多的時候我們很容易知道在不同的因變量的水平上自變量的分布的怎樣的,我們要解決的問題是知道了特征的情況然后去預(yù)測因變量,其實就是:from P(X|Y), known from the training dataset, to find P(Y|X).樸素貝葉斯算法架起了從from P(X|Y)to find P(Y|X)的橋梁。
要很好的理解樸素貝葉斯的整個過程首先要弄清楚兩個東西,一個是條件概率、一個是貝葉斯理論。
條件概率和貝葉斯定理我們什么理論都不要想,先做一個例子:100個人的數(shù)據(jù)如下表,按照身份可以分為教師、學(xué)生。按照性別又可以分為男性女性,F(xiàn)在我們嘗試得到男性中教師的概率是多少(把性別當(dāng)做特征,把身份當(dāng)做結(jié)局,這個問題便是知道特征求結(jié)局的概率的一個問題)。
這個男性中教師的概率就是條件概率,我們不是單純的求教師的概率而是先給了個條件(這個人首先得是男性)。這個時候計算概率的分母會變化。
when you say the conditional probability of A given B, it denotes the probability of A occurring given that B has already occurred.
這個問題你會怎么做?可以直接找到男教師有多少(看表應(yīng)該是12),然后用這個數(shù)字除以男性(看表應(yīng)該是60人),可以得到12/60=0.12。就得到男性中教師的概率是0.2。
上面的12比上100就是0.12為同時是男性又是教師的概率。60比上100就是0.6為數(shù)據(jù)中男性的概率,我們用0.12/0.6得到了0.2的結(jié)果其實我們就是在不自覺地運(yùn)行下面的公式:
公式中,teacher和male可以互換位置。于是就有
圖1
上面這兩個公式就是兩獨立事件計算條件概率時天然滿足的:
圖2
我們將圖1中的公式2帶入公式1就得到貝葉斯定理了:
這個貝葉斯定理最最重要的作用就是打通了從P(X|Y), known from the training dataset, to find P(Y|X)的路徑
貝葉斯與樸素貝葉斯上面的例子我們知道了貝葉斯定理的公式,這個公式和實際問題聯(lián)系到一起還需要拓展一下
我們把公式中的AB換成XY,于是就有下圖:
我們把x當(dāng)做自變量,y當(dāng)做因變量。通過貝葉斯定理我們就把P(X|Y)到P(Y|X)的路徑打通了。這個話要反復(fù)讀。
現(xiàn)實中,我們收集來一波訓(xùn)練數(shù)據(jù),我們是很容易知道在y的不同水平x是如何分布的(就像上面的例子中我們很容易知道教師中男性的比例是如何的,如果把性別當(dāng)做自變量、身份當(dāng)做因變量的話,很容易知道P(X|Y)),通過貝葉斯公式我們可以求得x分布確定的情況下,y取不同水平的概率(就像上面例子中我們知道了自變量性別是男性可以求的其為教師的概率為0.2,得到P(Y|X)).
也就是說貝葉斯定理成功的讓我們可以從自變量的分布預(yù)測因變量。
The Bayes Rule is a way of going from P(X|Y), known from the training dataset, to find P(Y|X).
現(xiàn)實中我們會有很多的x,我們會想著直接將多個貝葉斯公式相乘來處理,這么做就暗含了一個樸素的假設(shè)就是所有的x都是獨立的,這么一種樸素假設(shè)加持的貝葉斯就是樸素貝葉斯:
這個名字只是因為它有這么一個樸素的假設(shè):
The name naive is used because it assumes the features that go into the model is independent of each other. That is changing the value of one feature, does not directly influence or change the value of any of the other features used in the algorithm.
就這么一個簡單的假設(shè),可以讓這個算法可以處理很多個x的高維數(shù)據(jù)。很強(qiáng)大。
成為正規(guī)算法之后,就得有一些高大上的名詞:
我們把特征理解為證據(jù),因變量理解為結(jié)局,那么P(Y|X)就叫做后驗概率posterior probability,意思是一組證據(jù)情況下結(jié)局是什么的概率,也是我們要預(yù)測的感興趣的東西。
P(X|Y)叫做證據(jù)的似然概率,意思是某個結(jié)局存在的情況下相應(yīng)證據(jù)出現(xiàn)的概率。
P(Y)叫做先驗,意思是某個結(jié)局的相應(yīng)概率。
P(X)叫做證據(jù)概率,意思是某些特征(證據(jù)),特征組合的相應(yīng)概率。
總結(jié)一下:樸素貝葉斯就是后驗概率等于證據(jù)似然概率乘以先驗概率除以證據(jù)概率。
實例
我們現(xiàn)在想通過3個證據(jù)組合x1,x2,x3來預(yù)測水果種類,數(shù)據(jù)大概格式如下:
對這么個數(shù)據(jù)我們需要換個格式才能計算樸素貝葉斯算法對應(yīng)的各種概率:
統(tǒng)共有3個、首先是先驗概率:
Compute the ‘Prior’ probabilities for each of the class of fruits
首先就是計算先驗,就是每個種類水果的概率,可以看到在1000個水果中有800個香蕉,300個橘子,200個其他,那么我們可以得到各種水果的先驗分別為0.5,0.3,0.2.
P(Y=Banana) = 500 / 1000 = 0.50 P(Y=Orange) = 300 / 1000 = 0.30 P(Y=Other) = 200 / 1000 = 0.20
再是證據(jù)概率
Compute the probability of evidence that goes in the denominator.
第二步就是計算證據(jù)的概率,也就是所有特征出現(xiàn)的概率,我們的特征有3個,x1到x3的證據(jù)概率分別為0.5,0.65,0.8。
P(x1=Long) = 500 / 1000 = 0.50 P(x2=Sweet) = 650 / 1000 = 0.65 P(x3=Yellow) = 800 / 1000 = 0.80
Compute the probability of likelihood of evidences that goes in the numerator.
第三步是計算證據(jù)似然的概率,比如說香蕉long這個特征為真的概率就為P(Long | Banana) = 400/500 = 0.8。
Substitute all the 3 equations into the Naive Bayes formula, to get the probability that it is a banana.
最后一步就是將前三步的結(jié)果帶入樸素貝葉斯公式就可以得到在某組特征下水果分別為香蕉,為橘子,為其他水果的概率。例如在特征long、sweet、yellow為真的情況下,水果為香蕉的概率為0.252,為橘子的概率為0,為其他水果的概率為0.01875.
那么這個時候算法就會告訴我們這個水果就是香蕉。
上面就是算法的整個過程,細(xì)心的同學(xué)估計會有疑問橘子的概率為0,只是因為所有訓(xùn)練數(shù)據(jù)中結(jié)局為橘子的個案long這個特征沒有出現(xiàn)真(某一個證據(jù)似然概率為0),樸素貝葉斯算法涉及到相乘的話造成了結(jié)果為0。在這個只有3個特征的數(shù)據(jù)集中看起來這個結(jié)果無可厚非,長橘子本身好像現(xiàn)實中也不存在。但是想象一下我們面對一個陌生的數(shù)據(jù)集,特征很多,所有特征其實都有影響的,結(jié)局的某個類別中某個特征為0導(dǎo)致算法結(jié)果排除了該類別,這樣肯定存在不合適,為0的特征影響實在太大了,相當(dāng)于某一個特征有了一票否決。
所以有必要進(jìn)行校正。校正的方法就叫做Laplace Correction,就是給每個為零的格子加一個數(shù)(通常為1),這樣保證不出現(xiàn)概率為0的情況。
實操只要理解了背后的邏輯,實操就很簡單了,我們以iris數(shù)據(jù)集作為例子。原始數(shù)據(jù)長這樣:
共有5個變量,4個是特征,最后一個是結(jié)局(花的種類,有3類)。對于上面的數(shù)據(jù)集我們按照7:3劃分好訓(xùn)練集和測試集。
iris_split <- initial_split(iris, prop = 0.70)iris_train <- training(iris_split)iris_test <- testing(iris_split)然后我們用klaR包進(jìn)行貝葉斯算法訓(xùn)練,同時用訓(xùn)練好的模型預(yù)測測試集數(shù)據(jù),代碼如下:
nb_mod <- NaiveBayes(Species ~ ., data=training)pred <- predict(nb_mod, test)得到的pred對象就是預(yù)測的結(jié)果,對每一個個案預(yù)測模型都會輸出的成為各個類別應(yīng)變量的后驗概率:
后驗概率最大的類別就是最終的模型輸出類別。
再得到混淆矩陣,代碼如下:
tab <- table(pred$class, iris_test$Species)caret::confusionMatrix(tab)可以看到我們的模型在測試集中表現(xiàn)還是很好的,只有2個個案分類錯了。請點擊上方的批量上傳發(fā)帖按鈕