當前位置:
首頁 > 最新 > 機器學習基礎之樸素貝葉斯(2)

機器學習基礎之樸素貝葉斯(2)

標題:

  • 文本分類問題

  • 垃圾郵件分類器

  • 辭彙表

  • 模型建立

  • 極大似然估計函數

  • 構造分類器

  • 測試

  • 本章主要講解關於樸素貝葉斯模型的簡單實現,以及如何利用這個模型完成一個簡單的英文垃圾郵件分類器。

    文中一部分代碼的樣式風格出現差異是因為大部分代碼我直接摘自自己的博客,但因為有一部分代碼在博客上如果摘過來會因為公眾號編輯器的問題超出顯示範圍,因此需要用編輯器重新排版後再截過來

    1. 文本分類問題

    假設,我們要做一個垃圾郵件分類器。

    我們知道,我們收到的郵件可以粗略地分為兩類,「垃圾」(spam)或者「非垃圾」(ham),而體現一個郵件是否垃圾的特徵不像是我們邏輯回歸所遇見的那樣,只有少量的特徵值。事實上,郵件中的每一個詞都會是這封郵件的特徵(當然我們可以排除掉一些沒有實際內涵的詞),如果我們還是使用邏輯回歸,那麼我們可能就需要非常非常多的參數,這會導致計算機的開銷過大。因此,對於這種特殊的文本分類問題,我們需要有比邏輯回歸模型更合適的分類器。

    2. 垃圾郵件分類器

    樸素貝葉斯演算法便是用於文本分類的一個比較好的模型,不同於判別學習演算法(像是邏輯回歸)它是一種生成學習演算法,它的原理是先分別對possitive class和negative class建立模型,然後再通過這兩個模型對測試集中的未知郵件進行判斷。

    這次我們使用的數據集依然是來自Peter Harrington《機器學習實戰》Ch04中提供的數據,裡面包含了數封英文郵件,並被分類到兩個文件夾中,其中名為「spam」的文件夾裡面存儲的是垃圾郵件,「ham」文件夾裡面存儲的是非垃圾郵件,之所以使用英文郵件而不是中文郵件作訓練,是因為英文郵件中的詞更容易提取,因為詞與詞之間有空格,而中文的話,還需要對文段進行分詞,這些不相干的麻煩不利於我們進行學習。

    a. 辭彙表

    首先,我們需要創建一個詞典,它的內容是這些所有郵件可能包含的辭彙,有時候我們可以從網上或者別的什麼地方獲得,但最常見的方法是遍歷訓練集然後將訓練集中的每一個詞加入詞典:

    列印返回的結果我們可以得到詞典的內容:

    我們這裡遍歷了每個樣本採集辭彙,然後通過正則去除掉詞語中的特殊字元,例如「,」或者「.」,因為很顯然這些詞語沒有什麼用,並且會干擾到我們收集的辭彙。舉個例子,像是」school?」和」school」,我們如果不用正則合理匹配,那麼他們就會被當成兩個不同的詞放在辭彙表中,這是相當不合理的。並且,每個辭彙都在辭彙表中都必須保證是唯一有序的,因此我們加了判斷條件並用list類保存。

    形象的說,詞典就是一個包含所有郵件中可能出現的辭彙的有序序列。

    b. 模型建立

    模型建立的第一步是讀取數據:

    操作與取辭彙表類似,但是我們不能將這個函數和前面那個取詞函數整合,因為在讀取訓練集樣本時我們還要讓每一個樣本內的辭彙與辭彙集中的詞比對,因此在擁有辭彙表之前我們是無法讀取數據的。

    c. 極大似然估計函數

    然後我們可以根據得到的兩個表建立計算參數極大似然估計的模型:

    計算參數的公式如下:

    不過我們可以看到,與這個公式相比,我們做了一點小小的改動:在分子加上1,分母加上2。這是因為我們還應用了拉普拉斯平滑(可以在我記錄的關於樸素貝葉斯的同一章筆記中找到關於拉普拉斯平滑的內容,這裡就不再贅述),因此,改動後的極大似然估計應為:

    d. 構造分類器

    藉由這個函數得到參數之後,我們就可以進一步構造分類器,分類器的公式:

    因此我們有:

    參數接受一個』file』類對象,這個對象便可以是任意的一個測試郵件。

    e. 測試

    分類器構造完成後,我們可以讓它在我們自己的訓練集中遍歷一遍,測試誤差:

    不過當然了,在自己的訓練集上如果誤差都很大,那肯定是編寫時出問題了,因此一般來說在自己的訓練集上訓練的模型誤差都不會過大,所以我們還可以簡單地加入一些測試數據來進行測試,看看模型的泛化性能。

    這是我自己的郵箱中的一封郵件,他沒有包含在訓練集中:

    我們把它放入』test.txt』文件中,然後用代碼測試:

    當然,有興趣的話還可以用其它的郵件試一試,不過這裡當然是僅限英文郵件,若是中文郵件我們還需要應用對中文分詞的功能,那又會有一些區別了。

    不過你在看了訓練集中的一些郵件之後,或許會覺得這個模型的計算還是不夠嚴謹,這是自然的。畢竟這只是一個較為簡單粗糙的模型,而且訓練集的內容也很少(事實上,我們用的訓練集可能不到實際可能會用的訓練集的大小的百分之一),有很多辭彙辭彙表也都是不包含的(像上述例子就有「github」,「jekyll」等等辭彙),還有對一些特殊句子的處理(像是url鏈接),這些都會對我們的模型造成很嚴重的影響。

    資料來源參考:

    人民郵電出版社 Peter Harrington《機器學習實戰》第四章

    數據集來源 Github:Peter Harrington (https://github.com/pbharrin/machinelearninginaction)

    本章數據集來源:Ch4

    AI遇見機器學習

    mltoai


    喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

    本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


    請您繼續閱讀更多來自 機器學習 的精彩文章:

    「AI技術」泛濫之下 真正的機器學習在改變世界

    TAG:機器學習 |