Naive的貝葉斯說紅樓夢後40回不是曹雪芹寫的
最近剛剛開始看《機器學習實戰》,有講到用樸素貝葉斯方法分辨普通郵件和垃圾郵件。
樸素貝葉斯演算法的理論基礎來自於貝葉斯公式
知道B條件下A發生的概率、B發生的概率、A發生的概率,就可以求出A條件下是B的概率。
以分辨垃圾郵件為例,知道垃圾郵件中出現垃圾詞的概率p(A|B),收到垃圾郵件的概率p(B),收到的郵件中有垃圾詞的概率p(A),就可以求出收到的有垃圾詞的郵件屬於垃圾郵件的概率p(B|A)。
不得不說原來我大二學的概率論還有點用。
準備數據:從文本中構建詞向量。我手頭正好有劉慈欣、韓松、馬伯庸、遲卉的中短篇小說集,利用jieba模塊分詞處理後創建詞向量。
測試演算法:按理說結果應該分成 True positive/ False Postive/ True
Negative/ False Negative 四類情況,也就相當於機械互換性中說的誤收、誤廢這樣的概念。然而我目前無論哪種出錯都直接errorCount += 1 了事。測試程序中有個循環,每次循環都會打亂收錄文章的順序,做到隨機取得測試集和訓練集。錯誤數累計求平均值。
先放入劉慈欣和韓松的小說,訓練集各20篇,測試集各5篇,循環5次,分類結果如下圖。
再放入韓松和馬伯庸的小說,參數同上。
劉慈欣和馬伯庸的小說,參數同上。
程序的錯誤率基本上在5%以下了。
我個人感覺是因為三者偏好的用詞不太一樣。大劉的小說多有科技名詞,韓松的小說用詞偏怪誕,親王的文章多有歷史氣息。這三個人的風格其實都還挺分明的。
然後我放進去遲卉的小說,與劉慈欣的進行對比。
這就屬於比較gg了,把遲卉分別與韓松、親王對比一下,結果也很糟糕。
關於原因,我分析可能是遲卉小說的字數明顯比前三者的要少,導致遲卉小說詞語在詞向量中佔比不夠高。
也希望大家可以幫我分析一下為什麼遲卉小說難分類出來的原因~
然後我又想到了紅樓夢,相傳紅樓夢的後四十回執筆者乃高鶚。我感覺也可以用這個方法判斷一下前八十回和後四十回究竟是不是一個人寫的。
兩個文件夾分別保存了前八十回和後四十回,進行分析。訓練集各30篇,測試集各10篇,循環5次,分類結果如下圖。
我把前四十回和四十至八十回放到兩個文件夾,判斷這兩部分是否是一個人寫的。
結果似乎已經很明顯了。在區分前八十回和後四十回的時候,程序的錯誤率為4%,說明前後風格差距比較大,容易辨識出來。而區分前四十回和第四十回到第八十回的時候,程序的錯誤率為21%,說明前後兩者風格更加接近,不容易分辨清楚。
這樣比較之下,前八十回像是一個人寫的,而後四十回像是另一個人寫的。
不得不感慨樸素貝葉斯真是強大,我明明就是瞎JB找了幾篇文章,隨便拿jieba切分了一下辭彙,沒有做詞頻統計,也沒有去除無意義詞語,直接加進詞向量裡面,計算概率。就這樣這個分類器的錯誤率都在5%以下。。。。
所謂樸素(naive),指的是各個詞特徵之間相互獨立、每個特徵重要程度相同等等的假設。比如cake出現在delicious和nausea附近的概率相同云云。實際情況肯定不是這樣的,但是有了這種簡單原始的假設,運算速度會大大加快,而且分類準確率也不低。
當然了,要是不naive了說不定會更厲害。
就醬。
初次接觸機器學習,以及初次寫這種類似於博客的文章,請各位多指教!
推薦閱讀:
※新手學機器學習一個月後,一些第一手乾貨分享
※李宏毅機器學習2016 第十五講 無監督學習 生成模型之 VAE
※從Nesterov的角度看:我們為什麼要研究凸優化?
※想學習「機器學習」,需要學習哪些先導課程?
※目標檢測(5)-Faster RCNN