樸素貝葉斯分類器
樸素貝葉斯分類器(Naive Bayes Classifier)是一種基于貝葉斯定理和特征條件獨立假設的分類方法。它適用于分類任務,特別是文本分類、垃圾郵件識別等領域。
原理
樸素貝葉斯分類器基于以下兩個主要假設:
- 特征條件獨立:給定類別,特征之間是相互獨立的。這意味著一個特征的出現不依賴于其他特征的出現。雖然這在現實世界中往往不成立,但這個假設大大簡化了計算,使得樸素貝葉斯分類器在實際應用中表現良好。
- 貝葉斯定理:用于計算給定特征時某個類別出現的概率。
貝葉斯定理
對于兩個隨機變量X和Y,貝葉斯定理可以表示為:
[ P(Y|X) = \frac{P(X|Y) \cdot P(Y)}{P(X)} ]
其中:
- ( P(Y|X) ) 是給定X時Y的后驗概率。
- ( P(X|Y) ) 是給定Y時X的條件概率。
- ( P(Y) ) 是Y的先驗概率。
- ( P(X) ) 是X的邊際概率。
在分類任務中,X代表特征向量,Y代表類別。
樸素貝葉斯分類器的步驟
- 數據準備:收集帶有類別標簽的訓練數據。
- 計算先驗概率:計算每個類別的先驗概率 ( P(Y) )。
- 計算條件概率:對于每個類別和每個特征,計算給定類別時該特征的條件概率 ( P(X_i|Y) )。由于樸素貝葉斯假設特征條件獨立,這些計算可以獨立進行。
- 分類:對于新的、未標記的數據點,計算其在每個類別下的后驗概率 ( P(Y|X) )。選擇具有最大后驗概率的類別作為預測結果。
類型
- 高斯樸素貝葉斯:當特征連續并且假設它們遵循高斯(正態)分布時使用。
- 多項式樸素貝葉斯:用于離散特征,常用于文本分類任務,其中特征表示文檔中單詞的出現次數。
- 伯努利樸素貝葉斯:也用于離散特征,但假設特征是二元的(例如,單詞是否出現)。
優點
- 實現簡單且高效。
- 對缺失和噪聲數據相對魯棒。
- 在小數據集上表現良好。
缺點
- 特征條件獨立假設往往不成立,這可能會影響分類性能。
- 需要大量的訓練數據來估計概率。
- 對于輸入數據的預處理很敏感(例如,文本中的停用詞和詞干提取)。
應用
樸素貝葉斯分類器在文本分類、垃圾郵件過濾、情感分析、新聞分類等領域有廣泛應用。
- 數據
Universal Bank 是一家業績快速增長的銀行。為了增加貸款業務,該銀行探索將儲蓄客戶轉變成個人貸款客戶的方式。銀行收集了5000條客戶數據,包括客戶特征(age、experience、income、family、 CCAvg、education、Zip Code)、客戶對上一次貸款營銷活動的響應( Personal Loan )、客戶和銀行的關系( mortgage,securities account.online.CD account、credit card)共13個特征,目標值是 Personal Loan,即客戶是否接受了個人貸款。
ID | Age | Experience | Income | ZIP?Code |
賬戶 | 年齡 | 經驗 | 收入 | 郵政編碼 |
Family | CCAvg | Education | Mortgage | Securities Account |
家庭成員人數 | 信用卡月平均消費 | 教育水平 | 按揭貸款數目 | 證券賬戶 |
CD Account | Online | CreditCard | Personal Loan | |
定期存款 | 在線 | 信用卡 | 個人貸款 (目標值) |
在5000個客戶中,僅480個客戶接受了提供給他們的個人貸款。
數據實例:
ID | Age | Experience | Income | ZIP Code | Family | CCAvg | Education | Mortgage | Personal Loan | Securities Account | CD Account | Online | CreditCard |
1 | 25 | 1 | 49 | 91107 | 4 | 1.6 | 1 | 0 | 0 | 1 | 0 | 0 | 0 |
2 | 45 | 19 | 34 | 90089 | 3 | 1.5 | 1 | 0 | 0 | 1 | 0 | 0 | 0 |
3 | 39 | 15 | 11 | 94720 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
4 | 35 | 9 | 100 | 94112 | 1 | 2.7 | 2 | 0 | 0 | 0 | 0 | 0 | 0 |
5 | 35 | 8 | 45 | 91330 | 4 | 1 | 2 | 0 | 0 | 0 | 0 | 0 | 1 |
6 | 37 | 13 | 29 | 92121 | 4 | 0.4 | 2 | 155 | 0 | 0 | 0 | 1 | 0 |
7 | 53 | 27 | 72 | 91711 | 2 | 1.5 | 2 | 0 | 0 | 0 | 0 | 1 | 0 |
8 | 50 | 24 | 22 | 93943 | 1 | 0.3 | 3 | 0 | 0 | 0 | 0 | 0 | 1 |
9 | 35 | 10 | 81 | 90089 | 3 | 0.6 | 2 | 104 | 0 | 0 | 0 | 1 | 0 |
10 | 34 | 9 | 180 | 93023 | 1 | 8.9 | 3 | 0 | 1 | 0 | 0 | 0 | 0 |
11 | 65 | 39 | 105 | 94710 | 4 | 2.4 | 3 | 0 | 0 | 0 | 0 | 0 | 0 |
12 | 29 | 5 | 45 | 90277 | 3 | 0.1 | 2 | 0 | 0 | 0 | 0 | 1 | 0 |
13 | 48 | 23 | 114 | 93106 | 2 | 3.8 | 3 | 0 | 0 | 1 | 0 | 0 | 0 |
14 | 59 | 32 | 40 | 94920 | 4 | 2.5 | 2 | 0 | 0 | 0 | 0 | 1 | 0 |
15 | 67 | 41 | 112 | 91741 | 1 | 2 | 1 | 0 | 0 | 1 | 0 | 0 | 0 |
16 | 60 | 30 | 22 | 95054 | 1 | 1.5 | 3 | 0 | 0 | 0 | 0 | 1 | 1 |
17 | 38 | 14 | 130 | 95010 | 4 | 4.7 | 3 | 134 | 1 | 0 | 0 | 0 | 0 |
18 | 42 | 18 | 81 | 94305 | 4 | 2.4 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
19 | 46 | 21 | 193 | 91604 | 2 | 8.1 | 3 | 0 | 1 | 0 | 0 | 0 | 0 |
20 | 55 | 28 | 21 | 94720 | 1 | 0.5 | 2 | 0 | 0 | 1 | 0 | 0 | 1 |
21 | 56 | 31 | 25 | 94015 | 4 | 0.9 | 2 | 111 | 0 | 0 | 0 | 1 | 0 |
22 | 57 | 27 | 63 | 90095 | 3 | 2 | 3 | 0 | 0 | 0 | 0 | 1 | 0 |
23 | 29 | 5 | 62 | 90277 | 1 | 1.2 | 1 | 260 | 0 | 0 | 0 | 1 | 0 |
24 | 44 | 18 | 43 | 91320 | 2 | 0.7 | 1 | 163 | 0 | 1 | 0 | 0 | 0 |
25 | 36 | 11 | 152 | 95521 | 2 | 3.9 | 1 | 159 | 0 | 0 | 0 | 0 | 1 |
26 | 43 | 19 | 29 | 94305 | 3 | 0.5 | 1 | 97 | 0 | 0 | 0 | 1 | 0 |
27 | 40 | 16 | 83 | 95064 | 4 | 0.2 | 3 | 0 | 0 | 0 | 0 | 0 | 0 |
注意:數據集中的編號(ID)和郵政編碼(ZIP CODE)特征因為在分類模型中無意義,所以在數據預處理階段將它們刪除。
- 使用高斯樸素貝葉斯分類器(特征為連續型變量)對數據進行分類
- 使用留出法劃分數據集,訓練集:測試集為7:3
-
#1. 讀入數據 df = pd.read_csv('universalbank.csv') y = df['Personal Loan'] X = df.drop(['ID', 'ZIP Code', 'Personal Loan'], axis = 1) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state = 0)
- 使用高斯樸素貝葉斯分類器對訓練集進行訓練
-
#2. 訓練高斯樸素貝葉斯模型 gnb = GaussianNB() gnb.fit(X_train, y_train)
- 使用訓練好的模型對測試數據集進行預測并輸出預測結果和模型準確度
-
# 3. 評估模型 y_pred = gnb.predict(X_test) print('測試數據的預測結果:', y_pred)acc = gnb.score(X_test, y_test) print('GaussianNB模型的準確度:',acc)
- 使用多項式樸素貝葉斯(特征為離散型變量)對數據進行分類
- 篩選出數據中的離散型特征
-
# 1. 讀入數據 y = df['Personal Loan'] X = df[['Family', 'Education', 'Securities Account', 'CD Account', 'Online', 'CreditCard']] #只選用6個特征 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 0)
- 使用留出法劃分數據集,訓練集:測試集為7:3。
-
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 0)
- 使用多項式樸素貝葉斯分類器對訓練集進行訓練
-
#2. 訓練多項式樸素貝葉斯模型 mnb = MultinomialNB() mnb.fit(X_train, y_train)
- 使用訓練好的模型對測試數據集進行預測并輸出預測結果和模型準確度
-
y_pred = mnb.predict(X_test) print('測試數據的預測結果:', y_pred)acc = mnb.score(X_test, y_test) print('MultinomialNB模型的準確度:',acc)
代碼:
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn.naive_bayes import MultinomialNB#1. 讀入數據
df = pd.read_csv('universalbank.csv')
y = df['Personal Loan']
X = df.drop(['ID', 'ZIP Code', 'Personal Loan'], axis = 1)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state = 0)#2. 訓練高斯樸素貝葉斯模型
gnb = GaussianNB()
gnb.fit(X_train, y_train)# 3. 評估模型
y_pred = gnb.predict(X_test)
print('測試數據的預測結果:', y_pred)acc = gnb.score(X_test, y_test)
print('GaussianNB模型的準確度:',acc)# 1. 讀入數據
y = df['Personal Loan']
X = df[['Family', 'Education', 'Securities Account',
'CD Account', 'Online', 'CreditCard']] #只選用6個特征
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 0)#2. 訓練多項式樸素貝葉斯模型
mnb = MultinomialNB()
mnb.fit(X_train, y_train)y_pred = mnb.predict(X_test)
print('測試數據的預測結果:', y_pred)acc = mnb.score(X_test, y_test)
print('MultinomialNB模型的準確度:',acc)