iT邦幫忙

2024 iThome 鐵人賽

DAY 30
0
AI/ ML & Data

深度學習的學習之旅:從理論到實作系列 第 30

[Day 30] 垃圾郵件分類完整測試結果 - 人工智慧最終篇章

  • 分享至 

  • xImage
  •  

結果展示

我透過GPT替我生成幾封垃圾郵件來做測試,並輸入進我們的程式內。

1. Dear valued customer,You have been selected as the lucky winner of an all-expenses-paid trip to Hawaii! This exclusive offer includes:- 5 nights in a luxury hotel- Free round-trip airfare- Access to exclusive island toursAll you have to do is click the link below and claim your prize. Hurry, this offer expires in 24 hours![Click here to claim your FREE vacation]Best regards,The Travel Experts Team*T&C apply. Offer valid for a limited time. Must be 18+ to participate. Charges may apply for additional services.*
2. Dear customer, click the link below to claim your $1,000 gift card now! This is a limited-time offer, don’t miss out. Just verify your account information and enjoy your reward!

可以看到他能夠清楚地辨別是不是垃圾郵件囉~
image
接著我們也能看到訓練的ROC曲線
image

  • 圖片說明:
    • X軸(False Positive Rate, FPR):假陽性率,表示被錯誤分類為正類的比例,即實際為負類卻被預測為正類的比率。
    • Y軸(True Positive Rate, TPR):真正率,表示被正確分類為正類的比例,即實際為正類且被正確預測為正類的比率。
    • 橙色實線:這條橙色曲線表示模型的ROC曲線。這條曲線顯示了模型在不同的閾值下的性能,曲線越靠近左上角,模型的分類能力越好。
    • 藍色虛線:這條虛線代表隨機猜測的分類器的ROC曲線,這條線的AUC值是0.5,代表隨機分類。
    • 圖例(ROC curve (area = 0.99)):圖例顯示這個ROC曲線的 AUC值(Area Under the Curve) 是0.99,表示模型的性能非常好,接近完美分類。

AUC 值接近 1,表明該模型在區分正類和負類時非常精確。當 AUC 值為 0.99 時,這意味著模型有 99% 的機率能夠正確區分垃圾郵件和正常郵件。

另外也能測試正常郵件

Hello everyone, here is the agenda for our upcoming weekly meeting. Please review the topics and come prepared with any questions or updates. See you all on Monday at 10 AM.

image

Naive Bayes

昨天的程式用到了MultinomialNB,Multinomial Naive Bayes 是 Naive Bayes 分類器的一種,特別適合處理離散型數據,例如詞頻數據或分類數據,因此在文本分類任務中非常常見,尤其是垃圾郵件分類、情感分析等應用。

Naive Bayes 分類器基於「條件獨立假設」,即假設特徵之間是相互獨立的,這樣可以大大簡化複雜的問題。儘管這個假設在現實中並不總是成立,Naive Bayes 在實踐中通常仍然能產生相當好的結果。

他主要有幾個特點:

  1. 專門處理詞頻數據
  2. 簡單且高效
  3. 適合高維數據

而他的公式可以表示如下:
img

番外篇

這次我是以Naive Bayes做為演示,而實際上我也有透過RNN建立一個來做操作,而我在測試時以上面的內容的一小部分做為測試資料時發現他們預測的結果是不同的。

Dear valued customer,You have been selected as the lucky winner of an all-expenses-paid trip to Hawaii!

以下為個人猜測

  • Naive Bayes 認為它是正常的
    • Naive Bayes 基於詞頻進行分類,對每個詞的出現頻率進行計算。如果訓練數據集中,像「Dear valued customer」、「winner」、「trip」這些詞語的總體出現頻率在正常郵件中較高,那麼 Naive Bayes 可能會傾向於將這樣的訊息分類為正常郵件,因為它並不會考慮詞之間的上下文關係或語句的整體語義。這就意味著某些與垃圾郵件相關的詞,若在正常郵件中也經常出現,可能會讓 Naive Bayes 誤以為該訊息是正常的。
  • RNN 認為它是不正常的
    • 上下文的影響:RNN(或 LSTM)擅長捕捉文本的上下文和詞序。該模型不僅僅關注單個詞,而是會學習整段文字的語境和語義。因此,它可能會感知到「Dear valued customer」這種開頭、以及「winner」、「all-expenses-paid trip」這類典型的垃圾郵件用語組合在一起時,可能帶有欺詐或營銷的語氣。由於 RNN 能夠學習這些詞語之間的關聯,它更容易認為這段話是不正常的或是垃圾郵件。

RNN部分程式碼

這部份是我的訓練,有興趣的也可以試試看喔~

def train_model():
    messages = pd.read_csv('spam.csv', encoding='ISO-8859-1')
    
    messages = messages[['v1', 'v2']].rename(columns={'v1': 'label', 'v2': 'message'})
    
    corpus = [preprocess_text(message) for message in messages['message']]
    
    tokenizer = Tokenizer(num_words=5000)
    tokenizer.fit_on_texts(corpus)
    X = tokenizer.texts_to_sequences(corpus)
    
    X = pad_sequences(X, maxlen=100)
    
    y = pd.get_dummies(messages['label'], drop_first=True).values.ravel()
    
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
    
    model = Sequential()
    model.add(Embedding(input_dim=5000, output_dim=128, input_length=100))
    model.add(LSTM(units=128, return_sequences=False))
    model.add(Dense(units=1, activation='sigmoid'))

    model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
    
    model.fit(X_train, y_train, epochs=5, batch_size=64, validation_data=(X_test, y_test))
    
    model.save(MODEL_FILE)
    with open(TOKENIZER_FILE, 'wb') as f:
        pickle.dump(tokenizer, f)
    
    y_pred = (model.predict(X_test) > 0.5).astype("int32")
    accuracy = accuracy_score(y_test, y_pred)
    precision, recall, fscore, _ = precision_recall_fscore_support(y_test, y_pred, average='binary')
    print(f"Model training completed, accuracy: {accuracy * 100:.2f}%")
    print(f"Precision: {precision:.3f}, Recall: {recall:.3f}, F1-Score: {fscore:.3f}")

完賽感想

終於到了最後一天了,希望這30天的分享能夠讓大家對人工智慧有更深入的了解,也能更清楚地知道如何將其應用到實際生活中。這次的鐵人賽,我提前將近兩個月開始準備,但由於中途有一些突發事情,再加上有許多理論是我不太熟悉的,因此花了大量的時間來準備這次的文章,而且寫到最後真的是每天都被推甄跟鐵人賽還有廠商的專案工項轟炸,真的是身心俱疲...,好險我有很扛的隊友阿,先跪了。至於為什麼會選擇這個主題其實也帶有一點個人私心,不僅只是我想更了解這個領域,也是因為我怕推研的面試會被問到AI相關問題,等等被電爆xD

希望大家讀完一系列的文章之後,能更清楚地理解這些理論,這次的介紹連編排介紹順序都花了一番苦心來準備呢。

最後,感謝大家在這30天中的陪伴和支持。這段時間的分享對我來說是一個巨大的挑戰,但也讓我學到了許多新的知識和技能。希望這些內容能對大家有所幫助,並激發你們對人工智慧的興趣和熱情。

如果大家對這次的內容有任何疑問或建議又或是發現我在文章的說明有錯誤的,歡迎隨時在下方留言或是私訊我。我會盡力解答大家的問題,並繼續努力創作更多優質的內容。

謝謝大家,我們不知道會不會下次再見(?


上一篇
[Day29] 運用 Naive Bayes 建立垃圾郵件分類模型:從訓練到預測
系列文
深度學習的學習之旅:從理論到實作30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言