使用機器學習算法完成垃圾郵件檢測:Python實戰

引言

隨着互聯網的發展,電子郵件已成爲人們日常溝通的重要工具。然而,垃圾郵件的泛濫不僅浪費了用戶的時間,還可能帶來安全隱患,如惡意軟件傳播和網絡釣魚等。爲了有效過濾垃圾郵件,本文將介紹如何使用機器學習算法,特別是樸素貝葉斯(Naive Bayes)算法,結合Python進行垃圾郵件檢測。

原理 樸素貝葉斯算法

樸素貝葉斯算法是一種基於貝葉斯定理的簡單概率分類器,它假設特徵之間相互獨立。在垃圾郵件檢測中,特徵通常是郵件中的單詞或單詞組合,目標變量是郵件是否爲垃圾郵件(是/否)。算法通過計算郵件中每個單詞在垃圾郵件和非垃圾郵件中出現的概率,來預測新郵件的類別。

數據預處理

在將郵件數據輸入到機器學習模型之前,需要進行一系列預處理步驟,包括:

確保安裝了Python和必要的庫,如pandas、numpy、scikit-learn等。可以使用pip命令安裝:

pip install pandas numpy scikit-learn nltk matplotlib seaborn

數據集

這裡我們使用一個假設的數據集,包含郵件的文本內容和標籤('ham'或'spam')。在實際應用中,你可以使用如Kaggle上的公開數據集。

導入庫和數據

import pandas as pd

import numpy as np

from sklearn.feature_extraction.text import TfidfVectorizer

from sklearn.model_selection import train_test_split

from sklearn.naive_bayes import MultinomialNB

from sklearn.metrics import classification_report, confusion_matrix

from sklearn.pipeline import Pipeline

# 加載數據

df = pd.read_csv('spam_ham.csv', encoding='latin1')

df.head()

數據預處理

import re

from nltk.corpus import stopwords

from nltk.stem.porter import PorterStemmer

from nltk.tokenize import word_tokenize

# 文本清洗

def clean_text(text):

text = re.sub(r'<[^>]+>', '', text) # 去除HTML標籤

text = re.sub(r'\\W+', ' ', text).lower() # 去除特殊字符並轉爲小寫

words = word_tokenize(text)

stop_words = set(stopwords.words('english'))

stemmer = PorterStemmer()

clean_words = [stemmer.stem(word) for word in words if word not in stop_words]

return ' '.join(clean_words)

df['Text'] = df['Text'].apply(clean_text)

# 特徵提取

vectorizer = TfidfVectorizer()

X = vectorizer.fit_transform(df['Text'])

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

# 劃分數據集

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

構建模型

# 創建樸素貝葉斯模型

model = MultinomialNB()

# 訓練模型

model.fit(X_train, y_train)

# 預測測試集

y_pred = model.predict(X_test)

# 評估模型

print(confusion_matrix(y_test, y_pred))

print(classification_report(y_test, y_pred))

結果分析

通過混淆矩陣和分類報告,我們可以評估模型的性能。混淆矩陣顯示了模型預測的正確和錯誤分類的數量,而分類報告則提供了精確度、召回率、F1分數等詳細指標。

進一步優化

通過本文,我們瞭解瞭如何使用樸素貝葉斯算法結合Python進行垃圾郵件檢測。從數據預處理