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
📌 進一步優化垃圾郵件分類的演算法
🎯🚀