機器學習A-Z~樸素貝葉斯

本文要講述一個古老的機器學習算法,叫做樸素貝葉斯。這個算法比較簡單明瞭,沒有使用非常複雜的數學定理。用到的核心的數學理論就是概率中的一個定理,叫做貝葉斯定理(Bayes' Theorem)。

貝葉斯定理

現在我們看一個例子,假設有一個生產扳手的工廠,有兩臺機器。這兩臺機器分別生產了很多扳手,而且每個扳手都能看出是哪個機器生產的。現在有了很多很多生產出的扳手,並且這些扳手裏面有達標的正品和不達標的次品。現在要解決的問題是:我們想知道,2號機器它生產的產品是次品的概率是多少。解決這個問題要用到的定理就是貝葉斯定理。

$$ P(A|B) = \frac{P(B|A)*P(A)}{P(B)} $$

學過概率論的朋友應該對它有點了解,這裏也稍微解釋下。我們給上面的問題提供一些條件:

  • 1號機器每小時生產30個扳手
  • 2號機器每小時生產30個扳手
  • 所有的產品中有1%的次品
  • 所有次品中有50%來自機器1,50%來自機器2

問題是:機器2生產的產品是次品的概率是多少?

現在一步步往下計算,首先計算最後生產的產品是機器1生產的概率P(Mach1)=30/50=0.6,最後生產的產品是機器1生產的概率P(Mach2)=20/50=0.4。然後所有產品中有1%的次品表示P(Defect) = 1%。接下來的條件表示要用到條件概率P(Mach1 | Defect) = 50%。這句話的意思就是如果一個產品是次品,那麼它是機器1生產的概率是50%。同理P(Mach2 | Defect) = 50%。我們要求的是P(Defect | Mach2)= ?。帶入貝葉斯定理公式:

$$ P(Defect|Mach2) = \frac{P(Mach2|Defect)*P(Defect)}{P(Mach2)} $$

結果爲0.5*0.01/0.4=1.25%。顯然,使用貝葉斯定理可以通過一些很容易獲得的概率來得出不容易獲得的概率結果,可以節省我們很多的精力。這就是貝葉斯定理的應用。

樸素貝葉斯

接下來來講樸素貝葉斯分類器,我們要用到的就是上述的貝葉斯定理。其中P(A|B)被稱作後驗概率,P(B|A)和P(B)這兩個概率並不完全是概率,因爲樸素貝葉斯分類器中,B代表特徵,所以說這兩個概率我們稱作似然

來看看下面的例子,有兩組數據綠組和藍組,x1代表人羣的年齡,x2代表他們的收入。所有的紅組代表所有步行上班的人,綠組代表開車上班的人。現在如果出現一個新的點,我們要對它進行分類,確定是分到紅色組中還是綠色組中。

我們要使用樸素貝葉斯來解決這個分類問題,首先來看看我們需要經過的三個步驟。

第一步,看看這個貝葉斯公式:

$$ P(Walks|X) = \frac{P(X|Walks)*P(Walks)}{P(X)} $$

這裏的X就是它的特徵。對於新的點,它有對應的年紀和收入就是這個新用戶的特徵,我們要求的就是已知這些特徵,要得到它分到紅組或者綠組的概率。這裏的P(Walks)就是隨機抽一個人,它是走路上班的概率,這個也被稱作先驗概率,對應的就是後驗。P(X)指的是隨機抽一個人,他所顯示的特徵和新用戶的特徵的似然或者可能性。這裏的似然也是個概率,它是對數據特徵的概率,因此我們把它叫做似然。再然後,這裏的P(X|)指的是對這個數據特徵的概率,因此叫做似然。接下來第三部要求的也是個似然P(X|Walks),或者叫做邊際的似然,邊際的可能性。這樣我們就能求出後驗概率P(Walks|X)。

求解完步行部分的再求開車部分的:

$$ P(Drives|X) = \frac{P(X|Drives)*P(Drives)}{P(X)} $$

然後我們就可以比較P(Walks|X)和P(Drives|X),也就是已知用戶的特徵,其步行或者開車的概率。這兩個概率哪個比較大,那麼就可以將這個用戶分類到那個分組中。

那麼開始按照上面說的流程進行計算,首先比較簡單,P(Walks)=Number of Walkers/Total Observations=10/30。接下來,計算P(X),也就是似然。這個是樸素貝葉斯中核心的一步。這裏的X指的是新用戶他所代表的特徵,即年紀和收入。我們可以圍繞這個新用戶畫一個圈,那麼這個圈就代表着在這個二維數據空間中的所有用戶,他們的特徵和新用戶非常相似。要求的P(X)就是我們原先數據空間中的所有數據,它的特徵坐落在這個圈中的概率。那麼我們要計算的就是原先數據中與新用戶擁有相似特徵的個數除以總的人數。P(X)=Number of Similar Observations/Total Observations=4/30.

再然後求P(X}Walks),也就是邊際似然,那麼就是如果一個人是步行上班,那麼它坐落在這個圈中的概率。那麼這裏的計算公式很簡單,就是P(X|Walks) = Among those who Walk/Total number of Walkers=3/10。這樣,我們就可以求得後驗概率P(Walks|X) = 0.75。同樣的方法可以得到P(Drives|X)=0.25。

由於0.75>0.25,因此這個用戶分配到步行上班組的概率大於分配到開車上班組的概率。

樸素貝葉斯的一些補充說明

接下來我們來看看幾個問題,首先第一個,爲什麼把它做樸素貝葉斯?或者爲什麼樸素?當我們使用樸素貝葉斯方法的時候已經做過一個假設,這個假設就是數據的所有特徵都是獨立的。在上述的例子裏的兩個特徵,年齡和薪水,實際上這兩者是可能有關係的,一般來說年齡越大可能薪水就越大。但這裏假設年齡和薪水兩者沒有相關性。因此在一個機器學習的問題中,我們經常會做一些假設,這些假設並不一定都是對的,但這些假設可以幫助我們更高效快捷的解決問題。我們允許有一點誤差,因爲我們的終極問題是解決問題。

接下來第二個問題,似然函數P(X),上面計算這個函數的方法是先在新數據周圍畫了個圈,表示在這個圈裏的數據點,都表示和這個新數據點有相似的特徵,那麼接下來這個似然就是指如果有一個新的點,那麼它坐落在這個圈中的概率。那麼這個P(X)你會發現,它跟我們想要計算的後驗概率是和紅組相關還是綠組相關是沒有關係的。我們最後要計算的兩個後驗概率的公式中的分母都是P(X),那麼我們比較這兩者實際上可以把這個P(X)個消掉,也就是說可以直接比較兩者的分子P(X|Walks)P(Walks)和P(X|Drives)P(Drives)。

最後一個問題,若我們已知的組超過兩組怎麼辦?目前已經有兩組的情況下,比較兩者的後驗概率,那麼我們將新數據分配到更大的概率的分組中。那麼同理如果有三組的話,就是比較三者的後驗概率,哪個更大就分配到其分組中。

代碼實現

這裏的代碼實現實際上也只是講之前的文章中將分類器改成樸素貝葉斯即可:

from sklearn.naive_bayes import GaussianNB
classifier = GaussianNB()
classifier.fit(X_train, y_train)

以上,就是樸素貝葉斯算法的相關知識。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章