# Machine Learning Models - Naive Bayes
> [name=謝朋諺]
> [time=Wed, Nov 24, 2021 2:30 PM]
> [[Python]實作單純貝氏分類器(Naive Bayes Classifier),並應用於垃圾訊息分類](https://medium.com/qiubingcheng/%E5%AF%A6%E4%BD%9C%E5%96%AE%E7%B4%94%E8%B2%9D%E6%B0%8F%E5%88%86%E9%A1%9E%E5%99%A8-%E4%B8%A6%E6%87%89%E7%94%A8%E6%96%BC%E5%9E%83%E5%9C%BE%E8%A8%8A%E6%81%AF%E5%88%86%E9%A1%9E-6b26834c4fd8)
> [AI - Ch15 機器學習(3), 樸素貝葉斯分類器 Naive Bayes classifier](https://mropengate.blogspot.com/2015/06/ai-ch14-3-naive-bayes-classifier.html)
###### tags: `Machine Learning`
---
## 貝氏定理核心公式
- 事件 B 發生的條件下,事件 A 也發生的機率是多少:
$P(A|B)=\dfrac{P(B|A)P(A)}{P(B)}$
- 以分類問題的話可以直接定義成:
$P(class|data) = \dfrac{P(data|class) * P(class)}{P(data)}$
但實際上我們只關心分式中的分子部分,因為分母不依賴於 $class$ 而且特徵 $data$ 的值是給定的於是分母可以認為是一個常數,這樣分子就等價於聯合分部模型:$P(class|F_1,...,F_n)$,$F$ 代表的是 Feature。
重複使用 chain rule 可將條件機率寫成:$$\begin{array}{lcl}
P(class|F_1,...,F_n) \\
\propto P(class)P(F_1,...,F_n|class) \\
\propto P(class)P(F_1|class)P(F_2,...,F_n|class,F_1) \\
\propto P(class)P(F_1|class)P(F_2|class,F_1)P(F_3,...,F_n|class,F_1,F_2) \\
\propto P(class)P(F_1|class)P(F_2|class,F_1)P(F_3|class,F_1,F_2)P(F_4,...,F_n|class,F_1,F_2,F_3) \\
\propto P(class)P(F_1|class)P(F_2|class,F_1)P(F_3|class,F_1,F_2)...P(F_n|class,F_1,F_2,F_3,...,F_{n-1}) \\
\end{array}$$
另外對於 Naive 的條件獨立假設,每個 $F_i$ 對於 $F_j$ 且 $i\not= j$ 是條件獨立的,這意思就是: ==$P(F_i|class,F_j)=P(F_i|class)$==
所以就可把上述的結果變成 $$\begin{align}
P(class|F_1,...,F_n)&\propto P(class)P(F_1|class)P(F_2|class)P(F_3|class)\cdot\cdot\cdot \\
&\propto P(class)\prod^n_{i=1}p(F_i|class)
\end{align}$$
## 貝氏定理常用公式
$P(A|B)=\dfrac{P(A\cap B)}{P(B)}$
$P(B|A)=\dfrac{P(A\cap B)}{P(A)}$
$P(A\cap B)=\dfrac{P(B|A)}{P(A)}$
$P(A|B)=\dfrac{P(B|A)P(A)}{P(B)}$
## 使用條件機率做分類
- ==貝式分類器就是透過貝氏定理計算樣本在不同類別條件下的機率,並取得條件機率最大者作為預測類別!==
- 如果假設今天想做的是一個二分類問題,$C_p$ 代表 Postitive Case,$C_n$ 代表 Negative Case,假設兩個類別的出現機率相同皆為 **50%**,因此可以直接去掉 $C_p$、$C_n$,當我想找出 $C_p$ 類別的機率公式可得:
$$\begin{align}P(C_p|\vec x) &= \dfrac{P(\vec x|C_p)P(C_p)}{P(C_p)P(\vec x|C_p)+P(C_n)P(\vec x|C_n)} \\ &= \dfrac{P(\vec x|C_p)}{P(\vec x|C_p)+P(\vec x|C_n)}\end{align}$$
- 假設使用這兩句話當作各兩個類別:
```
(1) 今天 天氣 真好,明天 天氣 依然 是 晴天。
(2) 今天 媽媽 沒 生氣 真好,希望 明天 她 依然 不 生氣。
```
我們針對這兩句話來做 Bag-of-words 可得:
```
["今天"、"天氣"、"真好"、"明天"、"依然"、"是"、"晴天"、"媽媽"、"沒"、"生氣"、"希望"、"她"、"不"]
```
可得的 Bag-of-Words 如以下陣列:
```
(1) [1,2,1,1,1,1,1,0,0,0,0,0,0]
(2) [1,0,1,1,1,0,0,1,1,2,1,1,1]
```
假設我只用 "今天"、"天氣" 這兩個詞來判斷第一句的分類可以得出以下表示式:
$P(1st|今天=1,天氣=1)=\dfrac{P(今天=1,天氣=1|1st)P(1st)}{P(今天=1,天氣=1)}$
等式右邊的分子表示==第一類別中含有"今天"和"天氣"兩個單詞的機率==,分母則是==所有句子中同時含有"今天"和"天氣"兩個單詞的機率==,因此就等同於左邊等式的==同時含有"今天"和"天氣"兩個單詞的句子中,分為第一類的比例==。
以我們最上面的公式可以算出第一類別機率為:$$1=\dfrac{1*0.5}{0.5}$$
第二類別機率則為:$$0=\dfrac{0*0.5}{0.5}$$
當然這是非常爛的例子,我們在看另一個會不會捐款的例子:
| ID | Age | Gender | Job | Credit? | Label |
|:---:|:-----:|:------:|:-------:|:-------:|:-----:|
| 1 | 16~21 | M | Student | N | N |
| 2 | <16 | F | No | Y | Y |
| 3 | 21~30 | F | No | Y | Y |
| 4 | 21~30 | F | Worker | Y | N |
| 5 | 21~30 | F | Worker | Y | Y |
| 6 | 16~21 | M | Worker | Y | Y |
假設現在有個新的 Sample X 「Female、21~30、Worker、有辦過信用卡」,然後我們來算"會捐款的類別"跟"不會捐款的類別":
$P(Y)P(Female|Y)P(21~30|Y)P(Worker|Y)P(Credit|Y)=\dfrac{4}{6}\times\dfrac{3}{4}\times\dfrac{2}{4}\times\dfrac{2}{4}\times\dfrac{4}{4}=0.125$
$P(N)P(Female|N)P(21~30|N)P(Worker|N)P(Credit|N)=\dfrac{2}{6}\times\dfrac{1}{2}\times\dfrac{1}{2}\times\dfrac{1}{2}\times\dfrac{1}{2}=0.021$
由 Naive Bayes 可以求得此 Sample X 會捐款,因為 $P(Y|F_n)>P(N|F_n)$ -> $0.125>0.021$