Naive Bayes
概率和統計裏有哪些需要掌握的概念?
- 隨機變量(Random Variable)來描述事件所有可能出現的狀態
- 離散型隨機變量(Discrete Random Variable)
- 連續型隨機變量(Continuous Random Variable)
- 概率分佈(Probability Distribution)來描述每個狀態出現的可能性
- 聯合概率(Joint Probability)
- 邊緣概率(Marginal Probability)
- 條件概率
說了這麼多,不知道你有沒有一種感覺,其實概率論研究的就是這些概率之間相互轉化的關係,比如聯合概率、條件概率和邊緣概率。通過這些關係,概率論中產生了著名的貝葉斯定理(Bayes’ theorem)。加上變量的獨立性,我們就可以構建樸素貝葉斯(Naive Bayes)分類算法。
此外,基於概率發展而來的信息論,提出了很多重要的概率,例如信息熵(Entropy)、香農熵(Shannon Entropy)、信息增益(Information Gain)、基尼指數(Gini)等。這些概念都被運用到了決策樹(Decision Tree)的算法中。
通過這些概念之間的相互推導,我們可以得到貝葉斯定理,這是樸素貝葉斯等系列算法的核心。而在概率基礎之上發展而來的信息論,定義了信息熵、信息增益和基尼指數等,構成了決策樹等系列算法的核心。
概率研究的是模型如何產生數據,統計研究的是如何通過數據來推導其背後的模型。所以說,概率和統計其實是互逆的。
概率和統計可以幫我們做什麼?
- 第一,概率可以幫助我們進行更精準的複雜度分析;
- 第二,概率統計更多的是用在機器學習和大數據分析中;
- 第三,概率統計還可以用在各種機器學習的算法中。
離散 & 連續
隨機變量根據其取值是否連續,可分爲離散型隨機變量和連續型隨機變量。舉幾個例子,拋硬幣出現正反面的次數以及每週下雨的天數,都是離散的值,所以對應的隨機變量爲離散型。而汽車每小時行駛的速度和銀行排隊的時間,都是連續的值,對應的隨機變量爲連續型。換句話,從計算的角度來說,我們可以直接求和得出的,就是“離散的”,需要用積分計算的,就是“連續的”。
概率分佈
- 離散
拋硬幣事件來看
離散分佈模型:常用的離散分佈有伯努利分佈、分類分佈、二項分佈、泊松分佈
- 連續
汽車每小時行駛的公里數
連續分佈模型:比較經典的連續分佈有正態分佈、均勻分佈、指數分佈、拉普拉斯分佈
期望值
期望值,也叫數學期望,是每次隨機結果的出現概率乘以其結果的總和。如果我們把每種結果的概率看作權重,那麼期望值就是所有結果的加權平均值。它在我們的生活中十分常見,例如計算多個數值的平均值,其實就是求期望值,只不過我們假設每個數值出現的概率是相同的。
在我看來,一個問題只要滿足兩個要素,我們就可以考慮使用期望值:
- 第一個要素,在這個問題中可能出現不同的情況,而且各種情況的出現滿足了一定的概率分佈;
- 第二個要素,每種情況都對應一個數值,這個數值代表了具體的應用含義。
那麼,對於連續型的隨機變量,這種期望值應該如何計算呢?我們需要使用下面的積分公式:
面積
聯合概率、條件概率和邊緣概率
解釋清楚了條件概率,我就可以列出概率、條件概率和聯合概率之間的“三角”關係了。簡單的說,聯合概率是條件概率和概率的乘積,採用通用的公式來表達就是:
貝葉斯定理
這就是非常經典的貝葉斯法則。爲什麼說經典呢?是因爲它有很多應用的場景,比如樸素貝葉斯,你可以多多熟悉一下這個公式。在這個公式中,還包含了先驗概率(Prior Probability)、似然函數(Likelihood)、邊緣概率(Marginal Probability)和後驗概率(Posterior Probability)的概念。
在這裏面,我們把 P(x) 稱爲先驗概率。之所以稱爲“先驗”,是因爲它是從數據資料統計得到的,不需要經過貝葉斯定理的推算。
P(y | x) 是給定 x 之後 y 出現的條件概率。在統計學中,我們也把 P(y | x) 寫作似然函數 L(x | y)。在數學裏,似然函數和概率是有區別的。概率是指已經知道模型的參數來預測結果,而似然函數是根據觀測到的結果數據,來預估模型的參數。不過,當 y 值給定的時候,兩者在數值上是相等的,在應用中我們可以不用細究。
另外,我們沒有必要事先知道 P(y)。P(y) 可以通過聯合概率 P(x, y) 計算邊緣概率得來,而聯合概率 P(x, y) 可以由 P(y|x) * P(x) 推出。針對離散型和連續型的邊緣概率推導分別如下:
最主要的應用場景:通過先驗概率,推導出後驗概率,這就是貝葉斯定理神奇的地方。
隨機變量之間的獨立性
說到多個隨機變量的聯合和條件概率,你可能會產生一個問題:這些隨機變量是否會相互影響呢?比如,性別和分數之間有怎樣的關係?性別是否會影響分數的概率分佈?
相互獨立會產生一些有趣的現象,剛剛我們提到:
另外,將 p(x | y) = p(x) 帶入貝葉斯公式,就可以得出:
如何將原始信息轉化爲計算機能看懂的數據?
最常用的方式就是提取現實世界中的對象之屬性,並將這些轉化爲數字。
樸素貝葉斯的核心思想
貝葉斯定理的核心思想:用先驗概率和條件概率估計後驗概率
那具體到這裏的分類問題,我們該如何運用這個公式呢?爲了便於理解,我們可以將上述公式改寫成這樣:
其中,c 表示一個分類(class),f 表示屬性對應的數據字段(field)。如此一來,等號左邊的 P(c|f) 就是待分類樣本中,出現屬性值 f 時,樣本屬於類別 c 的概率。而等號右邊的 P(f|c) 是根據訓練數據統計,得到分類 c 中出現屬性 f 的概率。P© 是分類 c 在訓練數據中出現的概率,P(f) 是屬性 f 在訓練樣本中出現的概率。
看到這裏,你可能要問了,這裏的貝葉斯公式只描述了單個屬性值屬於某個分類的概率,可是我們要分析的水果每個都有很多屬性啊,這該怎麼辦呢?
別急,樸素貝葉斯在這裏就要發揮作用了。這是基於一個簡單假設建立的一種貝葉斯方法,並假定數據對象的不同屬性對其歸類影響時是相互獨立的。此時若數據對象 o 中同時出現屬性 fi 與 fj,則對象 o 屬於類別 c 的概率就是這樣:
對於出現的 0.00 概率,在做貝葉斯公式中的乘積計算時,會出現結果爲 0 的情況,因此我們通常取一個比這個數據集裏最小統計概率還要小的極小值,來代替“零概率”。比如,我們這裏取 0.01。在填充訓練數據中從來沒有出現過的屬性值的時候,我們就會使用這種技巧,我們給這種技巧起個名字就叫作平滑(Smoothing)。
你可能已經注意到了,這幾個公式裏的概率乘積通常都非常小,在物品的屬性非常多的時候,這個乘積可能就小到計算機無法處理的地步。因此,在實際運用中,我們還會採用一些數學手法進行轉換(比如取 log 將小數轉換爲絕對值大於 1 的負數),原理都是一樣的。
內容比較多,我稍微總結一下。樸素貝葉斯分類主要包括這幾個步驟:
- 準備數據:針對水果分類這個案例,我們收集了若干水果的實例,並從水果的常見屬性入手,將其轉化爲計算機所能理解的數據。這種數據也被稱爲訓練樣本。
- 建立模型:通過手頭上水果的實例,我們讓計算機統計每種水果、屬性出現的先驗概率,以及在某個水果分類下某種屬性出現的條件概率。這個過程也被稱爲基於樣本的訓練。
- 分類新數據:對於一顆新水果的屬性數據,計算機根據已經建立的模型進行推導計算,得到該水果屬於每個分類的概率,實現了分類的目的。這個過程也被稱爲預測。
通用的貝葉斯公式
樸素貝葉斯
它是一種簡單但極爲強大的預測建模算法。
之所以稱爲樸素貝葉斯,是因爲它假設每個輸入變量是獨立的。這是一個強硬的假設,實際情況並不一定,但是這項技術對於絕大部分的複雜問題仍然非常有效。
樸素貝葉斯模型由兩種類型的概率組成:
- 每個類別的概率P(Cj);
假設我有 7 個棋子,其中 3 個是白色的,4 個是黑色的。那麼棋子是白色的概率就是 3/7,黑色的概率就是 4/7,這個就是類別概率。
- 每個屬性的條件概率P(Ai|Cj)。
假設我把這 7 個棋子放到了兩個盒子裏,其中盒子 A 裏面有 2 個白棋,2 個黑棋;盒子 B 裏面有 1 個白棋,2 個黑棋。那麼在盒子 A 中抓到白棋的概率就是 1/2,抓到黑棋的概率也是 1/2,這個就是條件概率,也就是在某個條件(比如在盒子 A 中)下的概率。
在樸素貝葉斯中,我們要統計的是屬性的條件概率,也就是假設取出來的是白色的棋子,那麼它屬於盒子 A 的概率是 2/3。
爲了訓練樸素貝葉斯模型,我們需要先給出訓練數據,以及這些數據對應的分類。那麼上面這兩個概率,也就是類別概率和條件概率。他們都可以從給出的訓練數據中計算出來。一旦計算出來,概率模型就可以使用貝葉斯原理對新數據進行預測。
另外我想告訴你的是,貝葉斯原理、貝葉斯分類和樸素貝葉斯這三者之間是有區別的。
貝葉斯原理是最大的概念,它解決了概率論中“逆向概率”的問題,在這個理論基礎上,人們設計出了貝葉斯分類器,樸素貝葉斯分類是貝葉斯分類器中的一種,也是最簡單,最常用的分類器。樸素貝葉斯之所以樸素是因爲它假設屬性是相互獨立的,因此對實際情況有所約束,如果屬性之間存在關聯,分類準確率會降低。不過好在對於大部分情況下,樸素貝葉斯的分類效果都不錯。
樸素貝葉斯分類工作原理
樸素貝葉斯分類是常用的貝葉斯分類方法。我們日常生活中看到一個陌生人,要做的第一件事情就是判斷 TA 的性別,判斷性別的過程就是一個分類的過程。根據以往的經驗,我們通常會從身高、體重、鞋碼、頭髮長短、服飾、聲音等角度進行判斷。這裏的“經驗”就是一個訓練好的關於性別判斷的模型,其訓練數據是日常中遇到的各式各樣的人,以及這些人實際的性別數據。
- 離散數據案例
針對這個問題,我們先確定一共有 3 個屬性,假設我們用 A 代表屬性,用 A1, A2, A3 分別爲身高 = 高、體重 = 中、鞋碼 = 中。一共有兩個類別,假設用 C 代表類別,那麼 C1,C2 分別是:男、女,在未知的情況下我們用 Cj 表示。
那麼我們想求在 A1、A2、A3 屬性下,Cj 的概率,用條件概率表示就是 P(Cj|A1A2A3)。根據上面講的貝葉斯的公式,我們可以得出:
- 連續數據案例
那麼如果給你一個新的數據,身高 180、體重 120,鞋碼 41,請問該人是男是女呢?
這時,可以假設男性和女性的身高、體重、鞋碼都是正態分佈,通過樣本計算出均值和方差,也就是得到正態分佈的密度函數。有了密度函數,就可以把值代入,算出某一點的密度函數的值。比如,男性的身高是均值 179.5、標準差爲 3.697 的正態分佈。所以男性的身高爲 180 的概率爲 0.1069。怎麼計算得出的呢? 你可以使用 EXCEL 的 NORMDIST(x,mean,standard_dev,cumulative) 函數,一共有 4 個參數:
- x:正態分佈中,需要計算的數值;
- Mean:正態分佈的平均值;
- Standard_dev:正態分佈的標準差;
- Cumulative:取值爲邏輯值,即 False 或 True。它決定了函數的形式。當爲 TRUE 時,函數結果爲累積分佈;爲 False 時,函數結果爲概率密度。
樸素貝葉斯分類器工作流程
樸素貝葉斯分類 VS 其他分類算法
- 和KNN 最近鄰相比,樸素貝葉斯需要更多的時間進行模型的訓練,但是它在對新的數據進行分類預測的時候,通常效果更好、用時更短。
- 和決策樹相比,樸素貝葉斯並不能提供一套易於人類理解的規則,但是它可以提供決策樹通常無法支持的模糊分類(一個對象可以屬於多個分類)。決策樹算法採用樹形結構,使用層層推理來實現最終的分類。與貝葉斯分類器相比,決策樹的優勢在於構造過程無需使用任何先驗條件,因而適用於探索式的知識發現。
- 和SVM 支持向量機相比,樸素貝葉斯無法直接支持連續值的輸入。所以,在前面的案例中,我將連續值轉化成了離散值,便於樸素貝葉斯進行處理。
樸素貝葉斯的應用場景
如果一個分類的應用場景中,待分類對象的屬性值大部分都是離散的(或者很容易轉化爲離散的)、需要支持模糊分類,並且需要快速可靠的實時分類,那麼這種場景通常就非常適合使用樸素貝葉斯方法。
樸素貝葉斯分類最適合的場景就是文本分類、情感分析和垃圾郵件識別。其中情感分析和垃圾郵件識別都是通過文本來進行判斷。從這裏你能看出來,這三個場景本質上都是文本分類,這也是樸素貝葉斯最擅長的地方。所以樸素貝葉斯也常用於自然語言處理 NLP 的工具。
文本分類系統的基本框架
基於自然語言的預處理
和之前的水果案例相比,新聞這種文本數據最大的區別在於,它包含了大量的自然語言。那麼如何讓計算機理解自然語言呢?我們的計算機體系沒有思維,要理解人類的語言在現階段是不現實的。但是,我們仍然可以對自然語言進行適當的處理,將其變爲機器所能處理的數據。
首先,我們要知道,文本的的重要屬性是什麼,這樣我們才能提取出它的特徵。怎麼才能知道哪些屬性是重要的呢?
我舉個例子,假如說,有人給你一篇幾千字的文章,讓你在 10 秒鐘之內說出文章大意,你會怎麼辦?我想大部分人的解決方案是“找關鍵詞”!沒錯,我們也可以交給計算機用同樣的辦法。而計算機處理文本的基本單位就是字和單詞,這就是人們最常用的方法:詞袋(Bag of words)模型。
這種模型會忽略文本中的詞語出現的順序以及相應的語法,將整篇文章僅僅看做是一個大量單詞的組合。文本中每個詞的出現都是獨立的,不依賴於其他詞的出現情況。講到這裏,你有沒有發現在詞包模型中,所有單詞相互之間是獨立的,這個假設和樸素貝葉斯模型的獨立假設是不是一致呀?
沒錯!這裏我們就可以很巧妙地將樸素貝葉斯和文本處理結合起來了。不過先不要急,我們還要掌握一些方法,才能將文本中的長篇大論處理成關鍵詞。
- 分詞
介紹兩種目前比較主流的分詞模型,你只需要瞭解就行。
第一種是基於字符串匹配。其實就是掃描字符串。如果發現字符串的子串和詞相同,就算匹配成功。匹配規則通常是“正向最大匹配”、“逆向最大匹配”、“長詞優先”。這些算法的優點是隻需使用基於字典的匹配,因此計算複雜度低;缺點是處理歧義詞效果不佳。
第二種是基於統計和機器學習。這類分詞基於人工標註的詞性和統計特徵,對中文進行建模。訓練階段,根據標註好的語料對模型參數進行估計。 在分詞階段再通過模型計算各種分詞出現的概率,將概率最大的分詞作爲最終結果。常見的序列標註模型有隱馬爾科夫模型(HMM,Hidden Markov Model)和條件隨機場(CRF,Conditional Random Field),我們後面章節會講到,這裏我先不展開。
- 取詞幹和歸一化
我們剛纔說了,相對中文而言,英文完全不需要考慮分詞。不過它也有中文不具有的單複數、各種時態,因此它需要考慮取詞幹(stemming)。取詞幹的目標就是爲了減少詞的變化形式,將派生詞轉化爲基本形式。
最後,我們還要考慮大小寫轉化和多種拼寫(例如 color 和 colour)這樣的統一化,我們把這種做法稱爲歸一化。
- 停用詞
無論何種語言,都會存在一些不影響(或基本不影響)相關性的詞。有的時候乾脆可以指定一個叫停用詞(stop word)的字典,直接將這些詞過濾,不予以考慮。例如英文中的 a、an、the、that、is、good、bad 等。中文“的、個、你、我、他、好、壞”等。
如此一來,我們可以在基本不損失語義的情況下,減少數據文件的大小,提高計算機處理的效率。當然,也要注意停用詞的使用場景,例如用戶觀點分析,good 和 bad 這樣的形容詞反而成爲了關鍵。不僅不能過濾,反而要加大它們的權重。
- 同義詞和擴展詞
不同的地域或者不同時代,會導致人們對於同樣的物品叫法也不同。例如,在中國北方“番茄“應該叫“西紅柿”,而臺灣地區將“菠蘿”稱爲“鳳梨”。對於計算機而言,需要意識到這兩個詞是等價的。添加同義詞就是一個很好的手段。
有了這樣的詞典,當看到文本中出現“番茄”關鍵詞的時候,計算機系統就會將其等同於“西紅柿”這個詞。有的時候我們還需要擴展詞。如果簡單地將 Dove 分別和多芬、德芙簡單地等價,那麼多芬和德芙這兩個完全不同的品牌也變成了同義詞,這樣做明顯是有問題的。那麼我們可以採用擴展關係,當系統看到文本中的“多芬”時將其等同於“Dove”,看到“德芙”時將其等同於“Dove”。但是看到“Dove”的時候並不將其等同於“多芬”或“德芙”。
通過詞包模型的假設,以及上述這些自然語言處理的方法,我們可以將整篇的文字,切分爲一個個的單詞,這些是表示文章的關鍵屬性。你不難發現,每個單詞可以作爲文章的屬性,而通過這些單詞的詞頻(出現的頻率),我們很容易進行概率的統計。下面我對分類的先驗概率、單詞的先驗概率、某個分類下某個單詞的條件概率分別給出了示例。
如果發現某些單詞從未在某個分類中出現,例如“航母”這個詞從未在“體育”和“娛樂”這兩個分類中出現。對於這種情況,我們可以使用平滑(smoothing)的技術,將其詞頻或條件概率設置爲一個極小的值。這裏,我設置了最小的詞頻,也就是 1。
運用樸素貝葉斯模型
在新聞分類中,o 就表示一篇文章,而c表示新聞的種類(包括政治、軍事、財經等等)。而屬性字段f就是我們從文檔集而建立的各種單詞。公式等號左邊的 P(c|f) 就是待分類新聞中,出現單詞 f 時,該新聞屬於類別 c 的概率。而等號右邊的 P(f|c) 是根據訓練數據統計,得到分類 c 中出現單詞 f 的概率。P( c ) 是分類 c 在新聞訓練數據中出現的概率,P(f) 是單詞 f 在訓練樣本中出現的概率。
這裏需要注意一個很實際的問題:文章的篇幅很長,常常會導致非常多的 P(f|c) 連續乘積。而 P(f|c) 通常是非常小的數值,因此最後的乘積將快速趨近於 0 以至於計算機無法識別。這裏可以使用我們之前提到的一些數學手法進行轉換,比如取 log,將小數轉換爲絕對值大於 1 的負數。這樣的轉換,雖然會改變每篇文章屬於每個分類的概率之絕對值,但是並不會改變這些概率的相對大小。
sklearn 機器學習包
sklearn 的全稱叫 Scikit-learn,它給我們提供了 3 個樸素貝葉斯分類算法,分別是
- 高斯樸素貝葉斯(GaussianNB)
- 多項式樸素貝葉斯(MultinomialNB)
- 伯努利樸素貝葉斯(BernoulliNB)
這三種算法適合應用在不同的場景下,我們應該根據特徵變量的不同選擇不同的算法:
- 高斯樸素貝葉斯:特徵變量是連續變量,符合高斯分佈,比如說人的身高,物體的長度。
- 多項式樸素貝葉斯:特徵變量是離散變量,符合多項分佈,在文檔分類中特徵變量體現在一個單詞出現的次數,或者是單詞的 TF-IDF 值等。
- 伯努利樸素貝葉斯:特徵變量是布爾變量,符合 0/1 分佈,在文檔分類中特徵是單詞是否出現。
伯努利樸素貝葉斯是以文件爲粒度,如果該單詞在某文件中出現了即爲 1,否則爲 0。而多項式樸素貝葉斯是以單詞爲粒度,會計算在某個文件中的具體次數。而高斯樸素貝葉斯適合處理特徵變量是連續變量,且符合正態分佈(高斯分佈)的情況。比如身高、體重這種自然界的現象就比較適合用高斯樸素貝葉斯來處理。而文本分類是使用多項式樸素貝葉斯或者伯努利樸素貝葉斯。
什麼是 TF-IDF 值呢?
TF-IDF 是一個統計方法,用來評估某個詞語對於一個文件集或文檔庫中的其中一份文件的重要程度。
詞頻 TF:計算了一個單詞在文檔中出現的次數,它認爲一個單詞的重要性和它在文檔中出現的次數呈正比。
逆向文檔頻率 IDF:指一個單詞在文檔中的區分度。它認爲一個單詞出現在的文檔數越少,就越能通過這個單詞把該文檔和其他文檔區分開。IDF 越大就代表該單詞的區分度越大。
所以 TF-IDF 實際上是詞頻 TF 和逆向文檔頻率 IDF 的乘積。這樣我們傾向於找到 TF 和 IDF 取值都高的單詞作爲區分,即這個單詞在一個文檔中出現的次數多,同時又很少出現在其他文檔中。這樣的單詞適合用於分類。
TF-IDF 如何計算
爲什麼 IDF 的分母中,單詞出現的文檔數要加 1 呢?因爲有些單詞可能不會存在文檔中,爲了避免分母爲 0,統一給單詞出現的文檔數都加 1。
TF-IDF=TF*IDF。
如何求 TF-IDF
在 sklearn 中我們直接使用 TfidfVectorizer 類,它可以幫我們計算單詞 TF-IDF 向量的值。在這個類中,取 sklearn 計算的對數 log 時,底數是 e,不是 10。
什麼是停用詞?停用詞就是在分類中沒有用的詞,這些詞一般詞頻 TF 高,但是 IDF 很低,起不到分類的作用。爲了節省空間和計算時間,我們把這些詞作爲停用詞 stop words,告訴機器這些詞不需要幫我計算。
如何對文檔進行分類
- 基於分詞的數據準備:包括分詞、單詞權重計算、去掉停用詞;
- 應用樸素貝葉斯分類進行分類:首先通過訓練集得到樸素貝葉斯分類器,然後將分類器應用於測試集,並與實際結果做對比,最終得到測試集的分類準確率。
數據挖掘神器 sklearn
從數據挖掘的流程來看,一般包括了獲取數據、數據清洗、模型訓練、模型評估和模型部署這幾個過程。
sklearn 中包含了大量的數據挖掘算法,比如三種樸素貝葉斯算法,我們只需要瞭解不同算法的適用條件,以及創建時所需的參數,就可以用模型幫我們進行訓練。在模型評估中,sklearn 提供了 metrics 包,幫我們對預測結果與實際結果進行評估。
在文檔分類的項目中,我們針對文檔的特點,給出了基於分詞的準備流程。一般來說 NTLK 包適用於英文文檔,而 jieba 適用於中文文檔。我們可以根據文檔選擇不同的包,對文檔提取分詞。這些分詞就是貝葉斯分類中最重要的特徵屬性。基於這些分詞,我們得到分詞的權重,即特徵矩陣。
通過特徵矩陣與分類結果,我們就可以創建出樸素貝葉斯分類器,然後用分類器進行預測,最後預測結果與實際結果做對比即可以得到分類器在測試集上的準確率。
總結