概率--學習朴素貝葉斯分布


概率是一種基於事件發生可能性來描述未來趨勢的數學工具。其本質就是通過過去已經發生的事情來推斷未來事件,並且將這種推斷放在一系列的公理化的數學空間當中進行考慮。例如,拋一枚均質硬幣,正面向上的可能性多大?概率值是一個0-1之間的數字,用來衡量一個事件發生可能性的大小。概率值越接近於1,事件發生的可能性越大,概率值越接近於0,事件越不可能發生。天氣預報員通常會使用像"明天80%的可能性會下雨"這樣的術語來對降雨進行預測,這里70%或者0.7就是下雨的概率。在現實生活中,要么下雨,要么不下雨。用數學來進行描述,就是事件發生的結果要么是1(下雨),要么是0(不下雨),但是,由於我們需要預測的事件尚未發生,我們就只能通過測量類似大氣條件的方法得到的前幾天下雨的概率。因此,70%下雨的可能性意味着,在過去有類似天氣特征的10個例子中,有7次在該地區的某個地方下雨。

到目前為止,對於多個因素影響的動力學過程,並沒有一種方法能夠完全精確模擬。在十八世紀,當科學家們開始研究三個或者三個以上的物體在空間的運動規律的時候就發現。對於這些物體的運動軌跡進行描述和預測,需要大量的迭代運算。運算過程中的微小誤差在后期會被迅速放大,從而使得物體的運動狀態和實際運動結果出現明顯偏差。包括龐加萊,吉布斯等數學家對這一現象的研究表明,這種復雜演化的結果不可能被精確模擬。但是這些運動的內在的規律又必然通過一定的表面偶然性表現出來。數學家門用概率來描述這種偶然性。概率從它被提出開始,這種模糊與精確之間關系一直困擾着各種概率現象的研究者。最終,柯爾莫格羅夫等人將概率理論公理化,將概率現象轉化為了在測度空間中發生的幾何學問題。讓概率論這種基於類比的模糊研究轉化為了一套邏輯嚴密的數學體系。

類似現象也存在於大量的生物學和醫學現象當中。本章將會講述一種基於概率理論的機器學習算法,即根據概率原則進行分類的朴素貝葉斯算法。朴素貝葉斯算法就是應用先前事件的有關數據來估計未來事件發生的概率。舉個例子,朴素貝葉斯的一個常見應用就是根據過去的病案文檔中的單詞使用的頻率來識別新的病案文檔。並且對病案文檔的描述疾病種類進行預測。

為了讓讀者更容易的理解貝葉斯分析,本章中一開始會對統計學和概率論的知識進行回顧。即幫助讀者重新整理一些概率論的知識。然后再進入貝葉斯分析的學習。

4.1. 知識的回顧

古典的概率

最早關於概率的思考是有關賭博的。賭徒們總是通過各種帶有隨機性的游戲來獲得更多的利益。在這些游戲當中,賭徒們總是在思考兩類問題:

1.在特定規則下,輸贏的概率分別是多少。這個問題實際上是想推測各種出現情況的總體分布。賭徒們很早就知道,抽三張撲克牌,拿到同樣花色(術語叫做同花)的概率比拿到不考慮花色只考慮點數的345(術語叫做雜順)這樣連續的點數要困難。各種排列組合的難易程度的估計有助於賭徒判斷自己牌型的好壞。

2.在已經出現了特定結果的情況下,繼續發生特定事件的概率是多少。如某人已經在5局賭博當中勝利了4次,他是否應該繼續讀下去獲得更大的戰果,還是應該根據現有的局面見好就收。

對於上述第一類問題的思考,可以發現,第一類問題的答案取決於賭博的規則。而第二類問題不但取決於賭博的規則,還取決於你現在已經發生的狀態。比如手氣是否足夠好,以往的人們在類似的情況下不同選擇獲得的不同結局。

對於這兩類問題的進一步思考最終導致了兩種不同的統計學研究范式:前者認為,所有的隨機過程的概率分布取決於過程的內部特性。我們把這類統計學研究范式稱為古典概率統計學。而對於第二類問題的研究,則帶來了另外一個類型的統計學研究--基於貝葉斯方法的統計學。

古典概率通常又叫事前概率,是指當隨機事件中各種可能發生的結果及其出現的次數都可以由演繹或外推法得知,而無需經過任何統計試驗即可計算各種可能發生結果的概率。比如我們拋硬幣的時候,如果硬幣質地均勻,拋硬幣手法規范,那么正面和反面的出現概率就一定是各占50%。哪怕是連續拋出了100次正面,第101次出現正面的概率也還是50%。

而基於貝葉斯方法的統計學則不然,如果我們只觀察到了100次拋硬幣,哪怕是我們承認硬幣沒有問題,拋硬幣的手法也非常規范,但是連續出現100次正面這一現象本身就足以讓我們考慮是否有硬幣之外的原因在影響拋硬幣的結果。因此,我們再考慮接下來拋硬幣的結果的時候,需要引入另外一種被稱為"主觀概率"的概念。也就是說前面100次的正面讓我們必須考慮到一些其它的類似"手氣"的因素。

主觀概率的引入看起來在數學上不太規范,有一種在問題解決到一半的情況下強行增加條件的感覺。但是實際上,在實際工作中,很多問題並不會像投硬幣一樣簡單,以至於我們可以對其概率產生的原理進行充分分析。如我我們對某種現象的觀測的次數有限,此時的確需要通過已經發生的事情來對未發生的事情進行進一步判斷。

古典概率雖然更嚴謹,但是只適合對那些已經充分掌握了發生機理的隨機過程,擁有幾乎無限次觀測經驗的事件進行總結。而如果要通過已知的有限觀測結果來預測未發生的事情,則需要引入貝葉斯方法。

4.2 理解朴素貝葉斯和分類

朴素貝葉斯算法起源於18世紀數學家托馬斯·貝葉斯(Thomas Bayes)的工作,貝葉斯發明了用於描述事件在已知的一系列事件發生的情況下發生的概率以及如何根據各種增加的附加信息修正概率的基本數學原理(現稱為貝葉斯方法)。

利用貝葉斯算法可以通過已知條件來預測未知發生的事情。如果把已知條件理解為貝葉斯的先驗概率分布,需要預測的結局看成是一種分類結果。那么利用貝葉斯算法對樣本進行分類就被成為貝葉斯分類。朴素貝葉斯分類器(Naive Bayes classifier),是一種簡單有效的常用分類算法。

分類問題本質上都是構造某種映射規則,即通過已經發生的變量建立一個映射函數來預測未知變量。一般情況下的分類問題缺少足夠的信息來構造100%正確的映射規則,而是通過對經驗數據的學習從而實現一定概率意義上正確的分類,因此所訓練出的分類器並不是一定能將每個待分類項准確映射到其分類,分類器的質量與分類器構造方法、待分類數據的特性以及訓練樣本數量等諸多因素有關。例如,醫生對病人進行診斷就是一個典型的分類過程,任何一個醫生都無法直接看到病人的病情,只能觀察病人表現出的症狀和各種化驗檢測數據來推斷病情,這時醫生就好比一個分類器,而這個醫生診斷的准確率,與他當初受到的教育方式(構造方法)、病人的症狀是否突出(待分類數據的特性)以及醫生的經驗多少(訓練樣本數量)都有密切關系。

基於貝葉斯方法的分類器是利用訓練數據並根據特征的取值來計算每個類別被觀察到的概率。當分類器之后被應用到無標簽數據時,分類器就會根據觀測到的概率來預測新的特征最有可能屬於哪個類。這是簡單的想法,但根據這種想法就產生了一種方法,這種方法得到的結果與很多復雜算法得到的結果是等價的。在醫學上貝葉斯分類器已用於以下方面:

  • 文本分類,比如垃圾郵件過濾、作者識別和主題分類等。
  • 在計算機網絡中進行入侵檢測或者異常檢測。
  • 根據一組觀察到的症狀,診斷身體狀況。

通常情況下,貝葉斯分類器最適用於解決這樣一類問題:在這類問題中,為了估計一個結果的概率,從眾多屬性中提取的信息應該被同時考慮。盡管很多算法忽略了具有弱影像的一些特征,但是貝葉斯方法利用了所有可以獲得的證據來巧妙地修正預測。如果有大量特征產生的影響較小,但將它們放在一起,它們的組合影響可能會相當大。

4.2.1 貝葉斯定理

在進入朴素貝葉斯算法學習之前,我們值得花一些時間來定義一些概念,這些概念在貝葉斯方法中經常用到。用一句話概括,貝葉斯概率理論植根於這樣一個思想,即一個事件的似然估計應建立在手中已有證據的基礎上。事件(event)就是可能的結果,比如晴天和陰天、拋擲一枚硬幣得到的正面或者反面、垃圾電子郵件和非垃圾電子郵件等。試驗(trial)就是事件發生一次的機會,比如某天的天氣、拋擲一枚硬幣、一封電子郵件等。

貝葉斯分類的基礎是貝葉斯定理,這個定理解決了現實生活里經常遇到的問題:已知某條件概率,如何得到兩個事件交換后的概率,也就是在已知P(A|B)的情況下如何求得P(B|A)。這里先解釋什么是條件概率:

P(A|B)表示事件B已經發生的前提下,事件A發生的概率,叫做事件B發生下事件A的條件概率。其基本求解公式為:

這個公式是貝葉斯分布的最基本也是最好理解的公式。比如我們想知道被醫學檢驗結果診斷為陽性(事件B)的條件下,某人真的是某種疾病(事件A)的幾率。就需要考慮所有診斷為陽性的人當中,的確是某疾病的人有多少。而這個比例實際上就是所有診斷為陽性並且的確是某疾病的概率和所有診斷為陽性的人之比。所有診斷為陽性,且的確是某種疾病的人,則可以理解為診斷陽性(B)和患病(A)同時發生表示為P(AB)。

更進一步,兩件事情同事發生的概率P(AB),實際上等於某一件事情獨立發生的概率(P(A))和在A發生的情況下B發生的概率(P(B|A))的乘積,因此有貝葉斯定理是關於條件概率的定理,其公式如下:

公式中P(A|B)是已知B發生后A的條件概率,也由於得自B的取值而被稱作A的后驗概率。

P(A)是A的先驗概率或邊緣概率(Prior probability)。代表着我們想考察事件在自然界中的一般分布。

P(B)是B的先驗概率或邊緣概率,又稱為標准化常量(Normalized constant)。代表着我們已經知道的條件B在自然界當中的一般分布。

P(B|A) 是已知A發生后B的條件概率,叫做似然函數(likelihood)也由於得自A的取值而被稱作B的后驗概率。代表在已經發生的各種情況中,我們想考察的事件A是否經常伴隨着條件B出現。

必須指出,即使事件A經常伴隨着條件B出現,也不能說明條件B的出現一定意味着A會出現。因為如果條件B是一種非常常見的現象,那么條件B出現與否和A事件發生的關系也不會太大,因此我們可以將P(B|A)/ P(B)理解為調整因子,也被稱為標准化似然度(standardised likelihood)。此時公式可以變為:

通過上述的推導可以看出,如果我們想考慮條件B發生之后事件A會發生的概率,我們可以通過觀察以前每次事件A發生的時候B伴隨的概率以及估計B和A發生的獨立概率來 對上述問題進行判斷。

貝葉斯推斷中有幾個關鍵的概念需要說明下:

  • 第一個是先驗概率,先驗概率是一種分布,可以理解為我們一般條件下我們認為某件事情是不是經常發生。
  • 第二個是似然函數,似然函數是對某件事發生的可能性的判斷,與條件概率正好相反。似然函數是給定某一參數值,求某一結果的可能性。可以理解為以前長期觀察得到的兩者相關概率。例如:概率是拋一枚勻質硬幣,拋10次,問6次正面向上的可能性多大?而似然函數是問拋一枚硬幣,拋10次,結果6次正面向上,問其是勻質的可能性多大?
  • 第三個是調整因子:調整因子是似然函數與先驗概率的比值,這個比值相當於一個權重,用來調整后驗概率的值,使后驗概率更接近於真實概率。

貝葉斯定理之所以有用,是因為我們在生活中經常遇到這種情況:我們可以很容易通過對以往的事情觀測直接得出P(A|B),而P(B|A)則很難直接得出,但我們更關心P(B|A),貝葉斯定理就為我們打通從P(A|B)獲得P(B|A)的道路。貝葉斯推斷可以理解為通過先驗概率和調整因子來獲得后驗概率。

后驗概率 = 先驗概率 × 調整因子

舉個例子:

某青年人在參加單位組織的體檢時,被檢出HIV呈陽性。這自然會讓這人感到極度震驚。

假設整個人群感染HIV的概率是0.08%。這家醫院使用的檢測方法正確率是99%(也就是對已經確診攜帶HIV病毒的病人檢測出陽性的概率是99%(true positive rate),對沒有攜帶HIV病毒的人檢測呈陰性的概率也是是99%(true negative rate))。那么我們用貝葉斯定理可以計算出計算一下小李的患病概率。假設A表示攜帶HIV病毒事件,B表示檢測結果呈陽性事件,那么我們要求解的就是在檢測結果呈陽性的情況下的真實患病概率,即 P(A|B)。P(A)表示患病概率,在我們的例子里是0.08%。P(B|A)表示一個人已確診患病,檢測呈陽性的概率是多少,從例子里知道P(B|A)=99%。P(B)表示隨機一個人被檢測呈陽性的概率是多少,這包括兩部分的數據,一部分是患病且被檢測呈陽性的概率,它的數值是0.08%×99%,另一部分沒患病但被檢測呈陽性的概率,它的數值是(1-0.08%)×(1-99%)。根據貝葉斯定理:

=7.34%

從中我們可以看出,如果人群中HIV感染率很低,那么即使是用一種正確率為99%的方法來檢測,此人感染了HIV的概率並不高。

而感染概率並不高的原因則是因為我們假設的人群中HIV感染艾滋病的概率僅僅為0.08%。如果我們假設此人屬於某個感染率為10%的高危群體,那么此時此人感染的概率就會高達91%。讀者不妨可以根據上面的公式自己計算。

同樣原理,如果此人為了確診自己是否真的患病,用同樣方法再檢測了一次,依然是陽性,那么根據上面的公式:

此時我們可以看出,不做任何其它調查,如果再一次檢驗同樣也是陽性,那么該患者感染了HIV的可能性則會急劇上升到88.9%。因此在臨床上我們也經常會看到,對於某些重大疾病的診斷和確診,增加一次檢測,就可以得到准確得多的結果。而通過問診、查體等一般性的活動,采集一些不能確診的病案信息,對於最后的確診也是大有好處。

4.2.2 朴素貝葉斯算法

朴素貝葉斯(Naive Bayes,NB)算法描述應用貝葉斯定理進行分類的一個簡單應用。它的思想基礎是這樣的:對於給出的待分類項,求解在此項出現的條件下各個類別出現的概率,哪個最大,就認為此待分類項屬於哪個類別。通俗來說,我們可以舉這樣一個例子:你在校醫院的門診看到一個學生有點發燒,一般狀況尚可。此時在不做其它臨床檢測的情況下判斷該學生最有可能是什么疾病。作為一名有一定臨床經驗的醫生,你十有八九會猜是普通感冒。為什么呢?因為常識告訴我們,到校醫院來看病的患者最常見的就是普通感冒。當然患者也有可能是流感甚至腫瘤這樣的發熱性疾病,但在沒有其它可用信息下,我們會選擇條件概率最大的類別,這就是朴素貝葉斯的思想基礎。

特別地,朴素貝葉斯假設數據集的所有特征都具有相同的重要性和獨立性,而在大多數的實際應用中,這些假設是鮮有成立的。然而,在大多數情況下,當違背這些假設時,朴素貝葉斯依然可以很好地應用,甚至在極端事件中,特征之間具有很強的依賴性,朴素貝葉斯也可以用。由於該算法的通用性和准確性,適用於很多類型的條件,所以在分類學習任務中,朴素貝葉斯算法往往是很強大的,排在候選算法的第一位。

利用貝葉斯原理當連續的幾個獨立變量出現在一個患者身上的時候,貝葉斯算法能夠幫助我們以相對簡單的方法獲得患者的重要患病概率。

連續貝葉斯

連續朴素貝葉斯分類的定義如下:

  1. 設X={a1,a2,...,am}為一個待分類項目,而每個a為X的一個特征屬性值。我們可以把X理解為一個新的病人,我們已經采集到了他的身高,職業,年齡等各種不相關的臨床參數。
  2. 有分類集合C={y1,y2,...,yn},這個分類集合可以看成病人需要診斷的臨床結局,比如可以假定y1=感冒,y2=腦震盪
  3. 計算先驗概率:P(y1|x),P(y2|x),...,P(yn|x).也就是各種參數在該病人身上的發生概率。也就是條件概率
  4. 如果P(yk|x)=max{P(y1|x),P(y2|x),...,P(yn|x)},則x∈yk.

    要計算第三步的條件概率,可以通過建立一些已經知道分類情況的樣本來形成訓練樣本集。然后根據公式

    來計算條件概率。在這個公式里面Px是發病率,對於所有類別都是常數,所以我們只需要將分子設法最大化皆可。又因為各特征屬性是條件獨立的。所以有:

    也就是說,只需要把特定臨床結局下各症狀的概率用連乘乘起來,再乘以該特定臨床結局的先驗分布,就可以獲得在特定一系列症狀下該臨床結局的概率。

     

    4.3.1 第一步,收集數據

    為了使用貝葉斯分類器來對生物數據分類,我們采用最經典的生物學數據集iris來考察貝葉斯分析如何對不同性狀的生物進行分類,該數據集可以在MATLAB自帶的工具包中找到,也可以在網站()上下載。Iris數據集是1936年由FISHER通過測量鳶尾花的是一類多重變量分析的數據集。數據集總共有5個變量,前面四個變量分別為:花萼長度,花萼寬度,花瓣長度,花瓣寬度4個屬性,最有一個變量說明花朵來自:山鳶尾Setosa,雜色鳶尾Versicolour和 弗吉尼亞鳶尾Virginica三個種類中的哪一類。在默認模式下安裝的matlab可以通過在命令行直接輸入load fisheriris命令獲得:

    load fisheriris

    數據集總共有兩組數據,一組命名為meas分別是花朵屬性,另外一組命名為species是cell類型的變量,用文字說明每組鳶尾花的歸屬。總共有150組數據。三種鳶尾花每種測量了50朵。運行結束之后可以看到workspace窗口當中多出這兩個變量

    4.3.2 第二步 探索和准備數據

    構建分類器的第一步涉及到原始數據的分析和處理。作為一種成熟的分析的數據集,首先需要對數據分布進行了解。Matlab有很多可以對數據分布進行觀測的函數或者工具對本身的數據。例如你可以在命令行輸入plot matrix

    Plot matrix

    此時獲得的圖形表示變量meas當中四列數據相互之間的的關系,如第一行第二列的數據表示的就是meas當中,花萼長度和花萼寬度之間的關系。從數據的分布來看,相關性並不算太強。而第一行第三列表示的則是花萼寬度和花瓣長度之間的關系,點呈線狀分布表明這兩個變量之間的關系相對較為密切。整個圖上對角線上的小圖表示每個變量的分布頻率。從中我們可以看出花萼的長度和寬度基本符合正態分布,而花瓣的長度和寬度則不符合正態分布。

    4.3.3 第三步 基於數據對模型進行訓練

    Matlab有多種統計學模型的訓練方法。但是總體上說,所有的統計學模型的訓練都可以分為兩個步驟,訓練和預測。具體到貝葉斯判別分析,這兩個部分可以解釋為:

    1. 訓練:利用已有的數據,估計出基於貝葉斯分布的概率分布參數
    1. 預測:在新的數據加入之后,根據上述估計出的分布概率參數,計算出新樣本屬於某一個類別的先驗概率。對於判別分析來說則可以計算出新來的樣本屬於哪一類分類的概率。隨着條件分布的不斷改變,標本屬於特定分類的概率也會不斷改變。

    在matlab命令行中輸入如下代碼

    load fisheriris

    X = meas

    Y = species;

    Mdl = fitcnb(X,Y,'ClassNames',{'setosa','versicolor','virginica'})

    可以對數據集進行貝葉斯判斷建模,建模生成的Mdl是一個分類對象,這個對象的屬性如下:

    Matlab是一種面向對象的編程語言,我們獲得的變量Mdl就是一個貝葉斯模型分類對象(ClassificationNaiveBayes object),這個對象有很多屬性。例如屬性PredictiorNames屬性代表用於建模的變量名字,而DistributionParameters代表的是每分類花朵的兩個變量的平均值和樣本標准差。利用Mdl.DistributionParameters Mdl.ClassNames這樣在對象后面加點的方法可以引出這些對象的屬性值。而輸入method(lassificationNaiveBayes)則可以查看對上述對象可以使用何種方法進行處理。利用MDL對象,可以對整個貝葉斯分類器的數據分布進行估計。

    在默認情況下,朴素貝葉斯分類模型會認為模型當中的每個分類都是正態分布。每個分布都有一個平均值和樣本標准差。我們可以在Mdl對象的DistributionParameters屬性當中獲得這些分布值,例如可以用:

    Mdl.DistributionParameters{1,2}

    ans =

     

    3.4280

    0.3791

    來引入第一個分類第二個變量的分布,也就是說'setosa'的分類的變量的花萼寬度平均值是3.428和標准差0.379.根據統計學知識我們可以知道,如果我們知道了一個正態分布變量的均質和標准差,實際上也就知道了這個變量的分布規律,甚至可以估計出特定長度的花蕊屬於這個分布的百分比。因此根據該變量的分布知道了特定變量的分布,實際上就獲得了貝葉斯原理非常重要的概率似然率:P(h|D)。

    Mdl1是一個對象,這個對象叫做分類對象。通過對第一章關於面向對象編程的相關知識學習可以知道,可以用methods('ClassificationNaiveBayes')來查看這個對象可以使用各種方法:

    methods('ClassificationNaiveBayes')

    Methods for class ClassificationNaiveBayes:

    compact crossval logP margin resubEdge resubMargin compareHoldout edge loss predict resubLoss resubPredict

    其中resubPredict方法可以用分類器來對數據進行分類。例如我們用

    Ypredict = resubPredict(Mdl);

    Ypredict

    就可以獲得在上述模型判別下面所有的Y分類變量數值。更進一步,如果我們用

    [label,Posterior,Cost] = resubPredict(Mdl)

    語句,就可以獲得整個模型的分類標記,后驗概率,和期望的錯誤分類代價數值,如果我們輸入

    >> Cost(52,:)

     

    ans =

     

    1.0000 0.0571 0.9429

    這就表示第52個樣本屬於setosa錯誤的可能性是100%,屬於versicolor錯誤的可能是0.05%,屬於virginca 錯誤的可能是94%,很明顯,這個樣本最可能的是屬於versicolor. 但是也有一定可能屬於virginca.利用類似的的方法,我們不但可以對樣本進行分類預測,還可以給出每一類預測犯錯誤或者正確的概率。

    我們甚至可以對整個模型數據分布進行預測。模型數據分布進行估計,輸入以下語句:

    figure

    gscatter(X(:,1),X(:,2),Y);

    h = gca;

    xylim = [h.XLim h.YLim]; % 找出作圖X軸和Y軸的合理最大值

    hold on

    Params = cell2mat(Mdl.DistributionParameters);

    Mu = Params(2*(1:3)-1,1:2); % Extract the means

    Sigma = zeros(2,2,3);

    for j = 1:3

    Sigma(:,:,j) = diag(Params(2*j,:)); % Extract the standard deviations

    ezcontour(@(x1,x2)mvnpdf([x1,x2],Mu(j,:),Sigma(:,:,j)),...

    xylim+0.5*[-1,1,-1,1]) ...

    % Draw contours for the multivariate normal distributions

    end

    title('Naive Bayes Classifier -- Fisher''s Iris Data')

    xlabel('Petal Length (cm)')

    ylabel('Petal Width (cm)')

    hold off

    可以獲得貝葉斯分布當中每一類變量的置信區間。

    從上圖可以看出不同種類的鳶尾花,其花瓣長度和寬度分布各不相同,其中versicolor和virginica的花瓣長寬分布有重疊,而setosa的分布自成一體。橢圓形勾勒出的是假設長度和寬度都呈正態分布的時候的95%的置信區間。一朵未知的花,它的花瓣長寬分別為1.5,0.5從圖上我們可可以看出,它有90%以上的可能屬於setosa區間。完成朴素貝葉斯分類學習之后,就可以利用上面這幅圖的分布情況對未知的特定樣本分類進行預判。

     

    4.3.4 評估模型性能

    為了評估分類器的效能,正常的做法是采集一些新的鳶尾花樣本來測試模型能否正確的進行分類。不過這樣做往往會增加實驗成本,甚至有時候對於一些采集較難的數據,完全不可能新增數據,這是就需要用一種叫做交叉驗證(cross validation)來處理數據。

    交叉驗證是一種能夠對模型分類效果進行測試的方法。其思想就是將大部分數據作為訓練集進行建模,然后看剩余數據是否符合模型。例如10折交叉驗證(10-fold cross validation),將數據集分成十份,輪流將其中9份做訓練1份做驗證,10次的結果的均值作為對算法精度的估計。如果我們每次都建模獲得的結果都可以對剩下的1份歸屬做精確驗證。那么我們就有理由相信這個模型的分類方法是靠譜的。

    可以用如下的方法檢驗交叉驗證的結果:

     

    CVMdl = crossval(Mdl);

    Loss = kfoldLoss(CVMdl)

    Loss =

     

    0.0467

     

    從中可以看出,利用了交叉驗證之后,總共有占比為0.0467的樣本發生了分類錯誤。最后,為了看出哪些部分的樣本分類發生錯誤,可以用:

    P=kfoldMargin(CVMdl);

    stem(P);

    來觀察驗證的結果。其中stem(P)表示對交叉驗證的結果進行作圖,我們可以看出,在150個樣本當中,大部分的樣本可以獲得較為良好的分類結果(可靠性接近100%,但是也有少數樣本無法通過交叉驗證。對於這些樣本的識別,基於貝葉斯分類的判斷結果可能出錯。

    還可以使用下面的語句來觀察交叉驗證的結果

    isLabels1 = kfoldPredict(CVMdl);

    ConfusionMat1 = confusionmat(Y,isLabels1)

    >> ConfusionMat1

     

     

     

     

    ConfusionMat1 =

    50 0 0

    0 47 3

    4 46

    由此可以看出有7個樣本交叉驗證結果和原始分類的結果不一樣。

    4.3.5 提升模型性能

    貝葉斯分析是基於先驗概率分布來判斷后驗概率分布的一種方法。我們甚至可以用:

    后驗概率 = 標准似然度 * 先驗概率

    的公式來描述貝葉斯分布的基本特征。從前面所講的HIV感染的例子中可以看出,先驗概率對於后驗概率的計算結果至關重要。換句話說,如果要正確判斷出一組數據是否屬於特定的鳶尾花種類,三種特定鳶尾花的基本分布也就非常重要。在我們先前的分析當中,我們可以通過語句:

    Mdl.ClassNames

    Mdl.Prior

    ans =

    'setosa'

    'versicolor'

    'virginica'

    ans =

    0.3333 0.3333 0.3333

    來查看模型的先驗概率分布。可以看出,在進行貝葉斯建模的時候,模型Mdl的先驗概率分布實際上就是三種花在樣本中的分布,各占1/3。然而,在現實生活中,很可能三種花的分布並不相等。比如,可以假設virginica鳶尾花在中國就非常少見,如果我們在中國找到的一株鮮花樣本,那么先驗概率就確定了這株花是virginica鳶尾花的概率會降低。在建立上述模型的時候,可以通過:

    prior = [0.5 0.4 0.1];

    Mdlnew = fitcnb(X,Y,'Prior',prior)

    來對建立好模型的鳶尾花進行賦值。然后可以通過下面的語句分別對模型進行交叉驗證:

    defaultCVMdl = crossval(Mdlnew);

    defaultLoss = kfoldLoss(defaultCVMdl)

    CVMdl = crossval(Mdl);

    Loss = kfoldLoss(CVMdl)

    最后獲得結果:

    defaultLoss =

    0.0533

    Loss =

    0.0467

    可以看出先驗概率的改變可以讓交叉驗證的訓練結果發生改變。

    Tip:由於交叉驗證每次是隨機抽出一些數據來進行驗證,因此每次運行的結果可能和筆者展示的結果不一樣。可以在crossvalidation之前先用rng(1) 來使結果可以重復。

    4.4 總結

    貝葉斯分類是所有分類算法中最直觀最基礎的算法,這種算法本質上是通過已經發生的事件來對未發生的事件進行預測。而當我們把已發生的事件當成人工智能的訓練集的時候,根據訓練集中的數據分布就有可能對未知樣本進行判別。貝葉斯算法不但可以對未知樣本的類別進行歸類,還可以通過簡單的計算給出特定樣本屬於未知類別的概率,甚至給出樣本的每一個特征對於判別的貢獻,因此,這種算法有助於人類對於樣本的各種數據分布的理解。

     

     

     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM