6步驟帶你瞭解樸素貝葉斯分類器(含Python和R語言代碼)

本文最初由Sunil Ray發表於2015年9月13日,作者於2017年9月進行了更新。

假設你正在處理一個分類問題,你已經形成了一些假設,建立了一套特徵並且確定了各變量的重要性。你的數據集中有一大堆數據點,但是隻有很少的變量,而你的上司希望你能在一小時內給出預測數據,你會怎麼辦?

如果我是你,我會用樸素貝葉斯分類器。相比較其他分類方法,樸素貝葉斯簡單高效,適合預測未知類數據集。

在這篇文章中,我將解釋該算法的基礎知識,如果你是Python和R語言的新手,下次你遇到大型數據集,你就能學以致用。

什麼是樸素貝葉斯算法?

樸素貝葉斯分類器是一種基於貝葉斯定理的弱分類器,所有樸素貝葉斯分類器都假定樣本每個特徵與其他特徵都不相關。舉個例子,如果一種水果其具有紅,圓,直徑大概3英寸等特徵,該水果可以被判定為是蘋果。儘管這些特徵相互依賴或者有些特徵由其他特徵決定,然而樸素貝葉斯分類器認為這些屬性在判定該水果是否為蘋果的概率分佈上獨立的。

樸素貝葉斯分類器很容易建立,特別適合用於大型數據集,眾所周知,這是一種勝過許多複雜算法的高效分類方法。

貝葉斯公式提供了計算後驗概率P(X|Y)的方式:

6步驟帶你瞭解樸素貝葉斯分類器(含Python和R語言代碼)

其中,

  • P(c|x)是已知某樣本(c,目標),(x,屬性)的概率。稱後驗概率。

  • P(c)是該樣本“c”的概率。稱先驗概率。

  • P(x|c)是已知該樣本“x”,該樣本“c”的概率。

  • P(x)是該樣本“x”的概率。

樸素貝葉斯算法的分類流程

讓我舉一個例子。下面我設計了一個天氣和響應目標變量“玩”的訓練數據集(計算“玩”的可能性)。我們需要根據天氣條件進行分類,判斷這個人能不能出去玩,以下是步驟:

步驟1:將數據集轉換成頻率表;

步驟2:計算不同天氣出去玩的概率,並創建似然表,如陰天的概率是0.29;

6步驟帶你瞭解樸素貝葉斯分類器(含Python和R語言代碼)

步驟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,具有較高的概率。

樸素貝葉斯適合預測基於各屬性的不同類的概率,因此在文本分類上有廣泛應用。

樸素貝葉斯的優缺點

優點:

  • 既簡單又快速,預測表現良好;

  • 如果變量獨立這個條件成立,相比Logistic迴歸等其他分類方法,樸素貝葉斯分類器性能更優,且只需少量訓練數據;

  • 相較於數值變量,樸素貝葉斯分類器在多個分類變量的情況下表現更好。若是數值變量,需要正態分佈假設。

缺點:

  • 如果分類變量的類別(測試數據集)沒有在訓練數據集總被觀察到,那這個模型會分配一個0(零)概率給它,同時也會無法進行預測。這通常被稱為“零頻率”。為了解決這個問題,我們可以使用平滑技術,拉普拉斯估計是其中最基礎的技術。

  • 樸素貝葉斯也被稱為bad estimator,所以它的概率輸出predict_proba不應被太認真對待。

  • 樸素貝葉斯的另一個限制是獨立預測的假設。在現實生活中,這幾乎是不可能的,各變量間或多或少都會存在相互影響。

樸素貝葉斯的4種應用

實時預測:毫無疑問,樸素貝葉斯很快。

多類預測:這個算法以多類別預測功能聞名,因此可以用來預測多類目標變量的概率。

文本分類/垃圾郵件過濾/情感分析:相比較其他算法,樸素貝葉斯的應用主要集中在文本分類(變量類型多,且更獨立),具有較高的成功率。因此被廣泛應用於垃圾郵件過濾(識別垃圾郵件)和情感分析(在社交媒體平臺分辨積極情緒和消極情緒的用戶)。

推薦系統:樸素貝葉斯分類器和協同過濾結合使用可以過濾出用戶想看到的和不想看到的東西。

如何建立樸素貝葉斯的基本模型(Python和R)

scikit learn裡有3種樸素貝葉斯的模型:

高斯模型:適用於多個類型變量,假設特徵符合高斯分佈。

多項式模型:用於離散計數。如一個句子中某個詞語重複出現,我們視它們每個都是獨立的,所以統計多次,概率指數上出現了次方。

伯努利模型:如果特徵向量是二進制(即0和1),那這個模型是非常有用的。不同於多項式,伯努利把出現多次的詞語視為只出現一次,更加簡單方便。

你可以根據特定數據集選取上述3個模型中的合適模型。下面我們以高斯模型為例,談談怎麼建立:

  • 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)

關於樸素貝葉斯分類器的幾個黑科技

以下是一些小方法,可以提升樸素貝葉斯分類器的性能:

  • 如果連續特徵不是正態分佈的,我們應該使用各種不同的方法將其轉換正態分佈。

  • 如果測試數據集具有“零頻率”的問題,應用平滑技術“拉普拉斯估計”修正數據集。

  • 刪除重複出現的高度相關的特徵,可能會丟失頻率信息,影響效果。

  • 樸素貝葉斯分類在參數調整上選擇有限。我建議把重點放在數據的預處理和特徵選擇。

  • 大家可能想應用一些分類組合技術 如ensembling、bagging和boosting,但這些方法都於事無補。因為它們的目的是為了減少差異,樸素貝葉斯沒有需要最小化的差異。

小結

感謝你耐心讀到了這裡,如果已經瞭解了文章內容,接下來你需要的是實踐。在使用樸素貝葉斯分類器前,希望你能在數據預處理和特徵選擇上多花一些精力。

相關推薦

推薦中...