1. 程式人生 > >6步學會樸素貝葉斯演算法(包含python語言和R語言原始碼)

6步學會樸素貝葉斯演算法(包含python語言和R語言原始碼)

11

摘要

假設你遇到下面這種情況:
你正在研究分類問題,並且你已經生成了你的假設集,建立了特徵值,討論了變數的重要性。在一個小時內,利益相關者希望看到模型的第一個切割。

你會怎麼做?你有數以千計個數據點,只有少數變數在你的訓練集裡面。在這種情況下,如果我是你,我會使用“樸素貝葉斯分類(Navie Bayes)”,相對於其它分類演算法,它是非常快的。樸素貝葉斯分類依賴於貝葉斯概率定理來預測未知資料集的類別。
在本文中,我將介紹該演算法的基礎知識,以便在下次你遇到大型資料集的時候,你可以試用該演算法來處理。另外,如果你是Python或R的新手,你應該溫習一下這些語言,因為本文將會用這兩種語言來實現樸素貝葉斯演算法。
要理解貝葉斯推斷,必須先理解貝葉斯定理。後者實際上就是計算”條件概率”的公式。

貝葉斯定理

所謂”條件概率”(Conditional probability),就是指在事件B發生的情況下,事件A發生的概率,用P(A|B)來表示。
條件概率
根據文氏圖,可以很清楚地看到在事件B發生的情況下,事件A發生的概率就是P(A∩B)除以P(B)。
1
因此,
2
同理可得,
3
所以,
4

5
這就是條件概率的計算公式。

全概率公式

由於後面要用到,所以除了條件概率以外,這裡還要推導全概率公式。
假定樣本空間S,是兩個事件A與A’的和。
7
上圖中,紅色部分是事件A,綠色部分是事件A’,它們共同構成了樣本空間S。
在這種情況下,事件B可以劃分成兩個部分。
8



6

在上一節的推導當中,我們已知
7
所以,
8
這就是全概率公式。它的含義是,如果A和A’構成樣本空間的一個劃分,那麼事件B的概率,就等於A和A’的概率分別乘以B對這兩個事件的條件概率之和。
將這個公式代入上一節的條件概率公式,就得到了條件概率的另一種寫法:
9
對條件概率公式進行變形,可以得到如下形式:
10
我們把P(A)稱為”先驗概率”(Prior probability),即在B事件發生之前,我們對A事件概率的一個判斷。P(A|B)稱為”後驗概率”(Posterior probability),即在B事件發生之後,我們對A事件概率的重新評估。P(B|A)/P(B)稱為”可能性函式”(Likelyhood),這是一個調整因子,使得預估概率更接近真實概率。
所以,條件概率可以理解成下面的式子:

 後驗概率 = 先驗概率 x 調整因子

這就是貝葉斯推斷的含義。我們先預估一個”先驗概率”,然後加入實驗結果,看這個實驗到底是增強還是削弱了”先驗概率”,由此得到更接近事實的”後驗概率”。
在這裡,如果”可能性函式”P(B|A)/P(B)>1,意味著”先驗概率”被增強,事件A的發生的可能性變大;如果”可能性函式”=1,意味著B事件無助於判斷事件A的可能性;如果”可能性函式”<1,意味著”先驗概率”被削弱,事件A的可能性變小。

目錄

  1. 什麼是貝葉斯演算法?
  2. 貝葉斯演算法是如何工作的?
  3. 樸素貝葉斯演算法的優點和缺點是什麼?
  4. 樸素貝葉斯演算法的四種應用
  5. 用python語言構建基本的樸素貝葉斯模型的步驟
  6. 提高樸素貝葉斯模型的方法

什麼是貝葉斯演算法?

貝葉斯演算法一種基於貝葉斯定理的分類技術,具有獨立於預測因子的假設。簡而言之,樸素貝葉斯分類器假設類中特定特徵和其它特徵的存在無關。例如,一個水果如果是紅色,圓形的,並且直徑約3英尺,則這個水果可以被認為是紅色蘋果。即使這些特徵依賴於彼此或者依賴於其它特徵的存在,所有的這些特徵獨立的貢獻了這個水果是蘋果的可能性,這就是為什麼它被稱為“樸素”的原因。
樸素貝葉斯模型很容易構建,特別適用於非常大的資料集。除了簡單性,眾所周知,樸素貝葉斯甚至勝過高度複雜的分類方法。
貝葉斯定理提供了一種從P(c),P(x)和P(x|c)計算後驗概率P(c|x)的方法。看下面的公式:
bayes
以上:
- P(c|x)是給定預測變數(x,屬性)的類(c,target)的後驗概率。【即在看到新資料後,我們要計算的該假設的概率】
- P(c)是類的先驗概率。【即在得到新資料前某一假設的概率】
- P(x | c)是預測器給定類的概率的可能性。【該假設下得到這一資料的概率,稱為似然度】
- P(x)是預測器的先驗概率。【在任何假設下得到這一資料的概率,稱為標準化常量】

貝葉斯演算法是如何工作的?

讓我們用一個例子來理解它。下面我有一個天氣和相應的目標變數“玩”(建議玩的可能性)的訓練資料集。 現在,我們需要根據天氣狀況來分類玩家是否玩遊戲。 讓我們按照下面的步驟來執行它。

步驟1:將資料集轉換為頻率表

步驟2:通過查詢概率如“陰天的概率= 0.29”和“播放的概率為0.64”來建立“似然”表。
bayes2

步驟3:現在,使用樸素貝葉斯方程來計算每個類別的後驗概率。後驗概率最高的是預測的結果。
問題:如果天氣晴朗,玩家將會玩。這種說法是正確的嗎?

我們可以使用上面討論的後驗概率的方法來解決這個問題。

P(是|晴天)= P(晴天|是)*P(是)/ P(晴天)

這裡我們有P(晴天|是)= 3/9 = 0.33,P(晴天)= 5/14 = 0.36,P(是)= 9/14 = 0.64

現在,P(是| 晴天)= 0.33 * 0.64 / 0.36 = 0.60,其概率較高。

樸素貝葉斯使用類似的方法來預測基於各種屬性的不同類別的概率,這個演算法主要用於文字分類和多類問題。

樸素貝葉斯演算法的優點和缺點是什麼?

優點:
- 預測測試資料集的類別是容易且快速的,它在多分類預測中也表現良好
- 當獨立性假設成立時,樸素貝葉斯分類器與邏輯迴歸等其他模型相比表現更好,而且需要更少的訓練資料。
- 與數值變數(s)相比,它在分類輸入變數的情況下表現良好。數值變數是正態分佈假設(正態曲線圖,這是一個強有力的假設)。

缺點:
- 如果分類變數在測試資料集裡面有類別,但在訓練資料集中未觀察到該類別,則模型將分配0(零)概率,並且將不能進行預測。這通常被稱為“
零概率”。為了解決這個問題,我們可以使用平滑技術。最簡單的平滑技術之一被稱為拉普拉斯評估。
- 另一方面,樸素貝葉斯(Bayes)也被稱為不好的估計器,所以來自predict_proba的概率輸出不應該被過於重視。
- 樸素貝葉斯的另一個侷限是獨立預測因子的假設。在現實生活中,我們得到一組完全獨立的預測變數幾乎是不可能的。

樸素貝葉斯演算法的四種應用

  • 實時預測:樸素貝葉斯是一個熱切的學習分類器,它肯定是快速的。 因此,它可以用於實時預測。

  • 多類預測:這種演算法也是眾所周知的多類預測功能。這裡我們可以預測多個目標變數類別的概率。

  • 文字分類/垃圾郵件過濾/情感分析:主要用於文字分類的樸素貝葉斯分類器(由於更好的結果在多類問題和獨立性規則)比其他演算法具有更高的
    成功率。 因此,它被廣泛用於垃圾郵件過濾(識別垃圾郵件)和情感分析(在社交媒體分析中,識別客戶積極和消極的情緒)

  • 推薦系統:樸素貝葉斯分類器和協作過濾一起構建推薦系統,該系統使用機器學習和資料探勘技術來過濾看不見的資訊並預測使用者是否喜歡給定
    的資源。

用python語言構建基本的樸素貝葉斯模型的步驟

再次,scikit學習(python庫)將使用python語言在這裡幫助建立一個樸素貝葉斯模型。在scikit學習庫中有三種類型的樸素貝葉斯模型:

  • 高斯(Gaussian):它用於分類,它假設特徵遵循正態分佈。

  • 多項式(Multinomial):用於離散計數。比如說,我們有一個
    文字分類問題。在這裡,我們可以進一步考慮伯努利實驗,而不是“在檔案中出現的單詞”,而是“統計單詞在文件中出現的頻率”,你可以將其視
    為“觀察結果數x_i在n次試驗中的次數“。

  • 伯努利(Bernoulli):如果你的特徵向量是二進位制的(即零和一),二項式模型是有用的。一個應用是文字分類,詞袋模型,其中1s&0s分別是“單詞出現在文件中”和“單詞不出現在文件中”。

根據你的資料集,你可以選擇任何上面討論的模型。以下是高斯模型的例子。

Python 程式碼

#Import Library of Gaussian Naive Bayes model
from sklearn.naive_bayes import GaussianNB
import numpy as np

#assigning predictor and target variables
x= np.array([[-3,7],[1,5], [1,2], [-2,0], [2,3], [-4,0], [-1,1], [1,1], [-2,2], [2,7], [-4,1], [-2,7]])
Y = np.array([3, 3, 3, 3, 4, 3, 3, 4, 3, 4, 4, 4])
#Create a Gaussian Classifier
model = GaussianNB()

# Train the model using the training sets 
model.fit(x, y)

#Predict Output 
predicted= model.predict([[1,2],[3,4]])
print predicted

Output: ([3,4])

R 程式碼

require(e1071) #Holds the Naive Bayes Classifier
Train <- read.csv(file.choose())
Test <- read.csv(file.choose())

#Make sure the target variable is of a two-class classification problem only

levels(Train$Item_Fat_Content)

model <- naiveBayes(Item_Fat_Content~., data = Train)
class(model) 
pred <- predict(model,Test)
table(pred)

上面我們看了樸素貝葉斯模型,可以通過調整引數和智慧處理假設來提高這個基本模型的能力。 我們來看看改進樸素貝葉斯模型效能的方法。 我建議你閱讀這個文件,解關於使用樸素貝
葉斯的文字分類的更多細節。

提高樸素貝葉斯模型的方法

以下是提高Naive Bayes模型功能的一些建議:

  • 如果連續性特徵不具有正態分佈,則應採用變換或不同的方法將其轉換為正態分佈。
  • 如果測試資料集具有零頻率問題,則應用平滑技術“拉普拉斯修正”來預測測試資料集的類別。
  • 刪除相關特徵,因為高度相關的特徵在模型中被投票兩次,並且可能導致過度膨脹的重要性。
  • 樸素貝葉斯分類器引數調整的選項是有限的,比如alpha = 1來平滑,fit_prior = [True | False]來學習類別先驗概率,還有其他一些選項(請看這裡的細節)。我建議把重點放在資料的預處理和特徵選擇上。
  • 你可能會認為應用一些分類器組合技術,如集合,裝袋和提高,但這些方法將無濟於事。實際上,“集合,提升,裝袋”不會有幫助,因為它
    們的目的是減少變化。樸素貝葉斯沒有任何變化可以最小化。

結束筆記

在本文中,我們看了一個主要用於分類的監督機器學習演算法“樸素貝葉斯”。恭喜,如果你已經完全理解這篇文章,你已經邁入掌握這個演算法的第一步。從這裡開始,你需要的是練習。

此外,我建議您在應用樸素貝葉斯演算法之前更多地關注資料預處理和特徵選擇。

你覺得這篇文章有幫助嗎?請在下面的評論部分分享您的意見/想法。

原文