# 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$