37/100 貝葉斯分類器 🎲 基於機率的分類方法,適合垃圾郵件過濾和情感分析!

更新 發佈閱讀 14 分鐘

AI時代系列(1) 機器學習三部曲: 🔹 第一部:《機器學習 —— AI 智慧的啟航》


37/100 第四週:監督學習(分類)


37. 貝葉斯分類器 🎲 基於機率的分類方法,適合垃圾郵件過濾和情感分析!


📌 貝葉斯分類器(Naive Bayes)


🎲 基於機率的分類方法,適合垃圾郵件過濾、情感分析與文本分類!


貝葉斯分類器是一種基於 貝葉斯定理(Bayes’ Theorem) 的機器學習算法,透過計算各類別的機率來進行分類。


由於其計算速度快、資源消耗低,特別適合處理大規模文本數據,例如:


✅ 垃圾郵件過濾(Spam Filtering)

✅ 情感分析(Sentiment Analysis)

✅ 新聞分類(News Categorization)

✅ 醫療診斷(Disease Prediction)

✅ 推薦系統(Recommendation Systems)

________________________________________


🔹 貝葉斯定理:數學基礎


貝葉斯分類器的核心基於貝葉斯定理:


P(Y∣X) = P(X∣Y) * P(Y) / P(X)


其中:


P(Y∣X):已知特徵 X,屬於類別 Y 的機率(後驗機率)

P(X∣Y):在類別Y 下,特徵 X 出現的機率(似然)

P(Y)):類別 Y 的先驗機率(即該類別在整個數據集中出現的頻率)

P(X):特徵 X 的總體機率(所有類別中出現該特徵的機率)


📌 簡單來說,貝葉斯定理是透過已知資訊來推測未知的機率!

________________________________________


🔹 為什麼叫「Naive」(天真)?


「天真」的意思是:假設所有特徵彼此獨立。


例如,在垃圾郵件分類中,我們可能會分析「免費、限時、促銷」等詞語是否同時出現,但 Naive Bayes 假設這些詞的出現是獨立的,而不考慮它們之間的關聯性。

雖然這個假設不一定完全符合真實世界,但實際應用中,它仍然可以提供驚人的準確率,特別是在文本分類問題上!

________________________________________


🔹 貝葉斯分類器的常見類型


類型 適用數據 典型應用場景


Gaussian Naive Bayes: 連續數值型特徵(常態分佈數據) 醫學診斷、股票預測、風險評估


Multinomial Naive Bayes: 計數型特徵(文字頻率,如 TF-IDF) 垃圾郵件過濾、新聞分類、情感分析


Bernoulli Naive Bayes: 二元特徵(0/1,如詞是否出現) 文件分類、垃圾郵件偵測、詐騙偵測

________________________________________


🔹 優勢與限制


✅ 優勢


✔ 計算速度快:只需計算機率,運算量小,適合大規模數據集

✔ 適合高維度特徵:在 NLP(自然語言處理)中特別好用

✔ 適用於小數據集:即使數據不多,仍能提供不錯的效果

✔ 適用於線上學習(Online Learning):可以即時更新分類器


⚠ 限制


❌ 假設特徵獨立,但現實中特徵可能相關(如「特價」與「促銷」)

❌ 零概率問題(Zero Probability):若某類別下特徵沒出現過,機率會變成 0(可用拉普拉斯平滑修正)

❌ 表現不一定比決策樹、隨機森林強,特別是在特徵複雜的情況下

________________________________________


🔹 應用案例


📌 垃圾郵件過濾(Spam Detection)

分析電子郵件內容,計算某些詞(如「免費」、「中獎」)的機率,若超過某個門檻,則判定為垃圾郵件。


📌 情感分析(Sentiment Analysis)

在社群媒體或商品評論中,判定用戶情緒(正向 / 負向),例如「這部電影超棒」vs.「這部電影爛透了」。


📌 醫療診斷(Medical Diagnosis)

計算病人某些症狀與疾病的關聯性,幫助預測疾病的可能性。


📌 推薦系統(Recommendation System)

透過用戶歷史行為,計算某類型商品的可能性,來推薦相關產品。

________________________________________


🔹 Python 快速實作:垃圾郵件分類


我們使用 Multinomial Naive Bayes 來分類垃圾郵件。


python


import pandas as pd

from sklearn.model_selection import train_test_split

from sklearn.feature_extraction.text import CountVectorizer

from sklearn.naive_bayes import MultinomialNB

from sklearn.metrics import accuracy_score, classification_report


# 1️⃣ 擴充樣本資料

data = {

'label': [

'ham', 'spam', 'ham', 'spam', 'ham', 'spam', 'ham', 'spam', 'ham', 'spam',

'ham', 'spam', 'ham', 'spam', 'ham', 'spam', 'ham', 'spam', 'ham', 'spam'

],

'message': [

"Are we still on for tomorrow?",

"WINNER! Claim your prize now. Call 1800-xxx-xxxx.",

"Please review the latest report before our meeting.",

"You've been selected for a free iPhone. Click here.",

"Let's have lunch next week.",

"Exclusive deal: Buy 1 Get 1 Free. Limited time!",

"Don't forget the team meeting at 3pm.",

"URGENT! Your account will be suspended. Click to verify.",

"Happy birthday! Hope you have a great day.",

"You won a lottery! Contact us immediately.",

"I’ll call you later, in a meeting right now.",

"Act now and get $500 shopping credit.",

"Let me know if you need any help.",

"You are approved for a $10,000 loan. No credit check!",

"Where are you? We’re waiting.",

"Congratulations! You have been pre-selected for a loan.",

"Thanks for your help earlier.",

"Get your FREE membership today. No charges!",

"I'll send the documents tonight.",

"Claim your FREE vacation package now!"

]

}

df = pd.DataFrame(data)

df['label_num'] = df.label.map({'ham': 0, 'spam': 1})


# 2️⃣ 資料分割(保持比例)

X_train, X_test, y_train, y_test = train_test_split(

df['message'], df['label_num'], test_size=0.25, random_state=42, stratify=df['label_num']

)


# 3️⃣ 詞頻向量化

vectorizer = CountVectorizer()

X_train_vec = vectorizer.fit_transform(X_train)

X_test_vec = vectorizer.transform(X_test)


# 4️⃣ 訓練模型

model = MultinomialNB()

model.fit(X_train_vec, y_train)


# 5️⃣ 預測與評估

y_pred = model.predict(X_test_vec)

print("✅ 準確率:", accuracy_score(y_test, y_pred))

print("📊 分類報告:\n", classification_report(y_test, y_pred, labels=[0, 1], target_names=['ham', 'spam']))


# 6️⃣ 自定義測試訊息

test_messages = ["Free prize winner just click this link", "Lunch at 12?", "Win cash now!", "I'll be there in 5 mins"]

test_vec = vectorizer.transform(test_messages)

predicted = model.predict(test_vec)


# 7️⃣ 顯示測試結果

print("\n📥 測試訊息預測結果:")

for msg, label in zip(test_messages, predicted):

print(f"📝 {msg} 👉 {'spam' if label == 1 else 'ham'}")



📥 測試訊息預測結果:

📝 Free prize winner just click this link 👉 spam

📝 Lunch at 12? 👉 ham

📝 Win cash now! 👉 spam

📝 I'll be there in 5 mins 👉 ham


垃圾郵件分類模型成功辨識了典型的 spam 與正常對話內容,展現出不錯的準確率與語意理解能力。像「Free prize」與「Win cash」這類含有誇張行銷字眼的訊息被準確判定為 spam,而「Lunch at 12?」與「I'll be there in 5 mins」這類日常對話則被正確歸類為 ham,顯示模型已有效學習文字中的風險語境,具備實用的分類能力。未來若想提升效果,可進一步導入更多樣化的語料、TF-IDF 特徵抽取法,或擴展至中文應用。

________________________________________


🔹 關鍵重點總結


特點 🔥 貝葉斯分類器(Naive Bayes)


🎯 計算方式 基於機率的分類方法

🎯 適用數據 文本數據、結構化數據

🎯 適用場景 垃圾郵件分類、情感分析、醫療診斷

🎯 優勢 計算快、可處理大規模數據

🎯 限制 假設特徵獨立,可能影響效果


📌 一句話總結:


💡 貝葉斯分類器 = 機率思維 + 速度快 + 文本分析利器!

________________________________________


如進一步了解: 📌 拉普拉斯平滑(Laplace Smoothing)修正機率為 0 的問題



📌 如何在情感分析中應用 Word2Vec + Naive Bayes

📌 進一步優化垃圾郵件分類的演算法


🎯🚀



留言
avatar-img
留言分享你的想法!
avatar-img
Hansen W的沙龍
9會員
274內容數
AIHANS沙龍是一個結合AI技術實戰、產業策略與自我成長的知識平台,主題涵蓋機器學習、生成式AI、創業經驗、財務規劃及哲學思辨。這裡不只提供系統化學習資源與實作案例,更強調理性思維與行動力的結合。無論你是AI初學者、創業者,還是追求人生升維的行者,都能在這裡找到前進的方向與志同道合的夥伴。
Hansen W的沙龍的其他內容
2025/05/28
這篇帶你一次搞懂為何 XGBoost 和 LightGBM 是 Kaggle 常勝軍!從原理到實作完整拆解梯度提升的強大威力,結合 Python 範例與金融風險建模情境,讓你了解如何修正殘差、提升準確率、避免過擬合。無論你是資料科學初學者還是進階建模者,這章都是必修的武器鍛造場!
Thumbnail
2025/05/28
這篇帶你一次搞懂為何 XGBoost 和 LightGBM 是 Kaggle 常勝軍!從原理到實作完整拆解梯度提升的強大威力,結合 Python 範例與金融風險建模情境,讓你了解如何修正殘差、提升準確率、避免過擬合。無論你是資料科學初學者還是進階建模者,這章都是必修的武器鍛造場!
Thumbnail
2025/05/28
本篇用「二十個問題」直觀類比帶你輕鬆掌握決策樹與隨機森林的運作邏輯!從特徵選擇到集成學習,清楚解釋資訊增益與Gini指標,並結合Python實作比較兩者效能與決策邊界。想強化分類準確率、避免過擬合,這章就是你的關鍵轉折點!
Thumbnail
2025/05/28
本篇用「二十個問題」直觀類比帶你輕鬆掌握決策樹與隨機森林的運作邏輯!從特徵選擇到集成學習,清楚解釋資訊增益與Gini指標,並結合Python實作比較兩者效能與決策邊界。想強化分類準確率、避免過擬合,這章就是你的關鍵轉折點!
Thumbnail
2025/05/28
想了解高維分類的利器?本篇深入解析 SVM 如何利用超平面與支援向量巧妙分割資料,結合核函數處理非線性問題,適用於影像、醫療、金融等小樣本高維任務。搭配Python視覺化實作與參數調整建議,是你邁向精準分類的必學單元!
Thumbnail
2025/05/28
想了解高維分類的利器?本篇深入解析 SVM 如何利用超平面與支援向量巧妙分割資料,結合核函數處理非線性問題,適用於影像、醫療、金融等小樣本高維任務。搭配Python視覺化實作與參數調整建議,是你邁向精準分類的必學單元!
Thumbnail
看更多