:::

貝氏網路的結果預測與原因推理:基於專家知識建構的網路結構 / Prediction and Inference with Bayesian Networks Model: Based on Expert Knowledge

image

前面我將貝氏網路的分類與預測投影片放到blog上,這一篇則是用圖文解說的方式來說明如何在Weka中使用貝氏網路。貝氏網路是一種機器學習預測的方法,其做法大概跟之前所介紹的用Weka分類模型來預測未知案例差不多。貝氏網路分類器本身的正確率通常不高,但是它能夠結合專家知識或領域知識(domain/prior knowledge)來建立預測模型,使得預測結果比較符合人類的思維。另一方面,貝氏網路也可以根據任何已知結果來推理發生的原因,讓我們更容易解釋最後結果。跟類神經網路、支持向量機難以解釋的黑箱演算法相比,貝氏網路這種白箱(white-box)演算法雖然正確率較差,但卻更容易用在任何研究中,協助我們推測研究結果、解釋造成原因。


資料集 / Data set

image

這次使用的資料是來自於我在教授「分類與預測:貝氏網路」所舉的簡單例子。這10位來看診案例中,4位有病、6位沒病,醫生收集了他們的性別跟是否吸菸的背景資料,我們就以此來建立預測模型。必須注意的是,資料類型必須為類別形態(nominal)。如果是連續資料(numeric),那就得用裝箱法來切割資料。

image

請下載CSV格式檔案,待會會使用。

環境配置:Weka 3.8 / Environment: Weka 3.8

image

這個例子是在Windows中使用了Weka 3.8版。如果你還沒有Weka的話,請到下面的網址下載並安裝。

因為這個資料集使用了中文,所以要調整Weka的設定,使其能夠接納中文。

資料跟環境都準備好了之後,接下來我們就要來開始操作囉。


Step 1. 建立專家知識的網路結構 / Create bayesian network structure using export knowledge

image

前面的資料集中有提到,醫生手邊的病患資料有三種特徵:

  • 性別:男 / 女
  • 吸菸:有吸 / 沒吸
  • 生病 (欄位名稱為class):有病 / 沒病

根據醫生的專業判斷,她認為「性別」跟「吸菸」可能會影響「生病」。因此我們接下來要根據醫生的專業判斷,手動建立貝氏網路結構。

雖然Weka本身也有貝氏網路編輯器(Bayes Network Editor),但難用程度超過我的忍耐極限。所以我另外開發了貝氏網路結構編輯器供大家使用。

image

請在「選擇檔案輸入」的地方,上傳剛剛取得的資料集「看診者樣本資料集 - data.csv」。

image

右邊貝氏網路結構會根據輸入的資料集來決定網路結構。預設的情況下,它會將最後一個特徵class,也就是「生病」,視為最後的結果,而其他特徵是造成此結果的原因。這裡可以看到「class」為子節點,也就是箭頭的結尾,而「性別」跟「吸菸」被放在父節點,也就是箭頭的開頭。這個意思就是「性別跟吸菸會影響class (生病)」。

這裡你也可以根據專家的意見來修改網路結構。為了簡單起見,所有的編輯功能都僅是編輯各個特徵的父節點。請使用「新增」跟「x」(刪除)來新增或刪除父節點吧。

image

一旦貝氏網路結構確定之後,就可以按下「下載貝氏網路結構檔」來取得貝氏網路結構檔。

image

貝氏網路結構檔會是以「xmlbif-」開頭、xml格式的檔案。請記得它的檔案路徑,如果是儲存在C磁碟根目錄下,那它的路徑就是「C:\xmlbif-看診者樣本資料集 - data.xml」。稍後我們會用到這個路徑。

附帶一提,XML BIL是貝氏網路模型的標準交換格式。早期貝氏網路被視為蘊含專家知識的專家決策系統核心,發展蓬勃到連資料交換格式都制訂完成。可惜現在貝氏網路沒落之後,現在很少看到有人在使用了。

這個階段的操作就到這邊為止。有了貝氏網路結構檔,我們就能夠基於專家知識之上來進行預測跟推理囉。


Step 2. 準備資料集 / Get train data set

接下來我們要將CSV格式轉換成ARFF格式,請使用我開發的試算表轉ARFF工具

image

請在試算表轉ARFF的左側上傳檔案處選擇CSV檔案 (注意,不是選擇貝氏網路結構檔喔,是CSV格式的檔案),接著在右邊Result的地方按下「Train Data Set」下載訓練集ARFF格式檔案。

image

這樣就準備好訓練集,至此為止這一階段也完成了。


Step 3. 開啟檔案 / Open ARFF file

接下來我們進入Weka中操作。

image

開啟Explorer。

image

在Preprocess頁籤中,按下「Open file」,開啟ARFF格式的訓練集。(注意不要開錯了,是ARFF格式的訓練集喔!)

如果順利開啟檔案的話,應該可以看到下面已經載入了三個特徵(attributes),各別是「性別」、「吸菸」跟「class」(代表「生病」)。如果你在這裡看到的是亂碼,那請回頭看看如何在Weka中顯示中文

至此為止,這個階段的操作完成囉。


Step 4. 設定貝氏網路分類器 / Setup BayesNet

image

再來切換到「Classify」頁籤,在Classifier底下按下「Choose」,選擇「weka.classifiers.bayes.BayesNet」。

image

用滑鼠左鍵點一下粗體字「BayesNet」,進入設定。

image

在貝氏網路結構學習演算法searchAlgorithm中,按下「Choose」,選擇「weka.classifiers.bayes.net.search.fixed.FromFile」。

image

用滑鼠左鍵點一下粗體字「FromFile」,進入設定。

image

在BIFFile欄位裡面輸入先前建立的貝氏網路結構檔檔案路徑,例如「C:\xmlbif-看診者樣本資料集 - data.xml」,然後按下OK。

image

按下OK來結束貝氏網路設定。

image

好,這樣就設定好貝氏網路了。這個階段的操作也就到此為止。


Step 5. 建立貝氏網路模型 / Building BayesNet Model

回到Explorer主界面,讓我們繼續操作。

image

按下「Start」按鈕,Weka會根據貝氏網路結構檔建立CPT (條件機率表格),產生貝氏網路模型。這邊可以看到模型的正確率僅有50%,換句話說,從專家知識所建構的貝氏網路結構來預測資料,最後大概會有一半預測錯誤。

image

在左下角「Result list」的結果上按右鍵,選擇「Visualize graph」。

image

按下左上角的「Save Graph」。

image

把這個檔案名稱File Name命名為「貝氏網路模型」,檔案類型Files of Type選擇「XML BIF files」,儲存在桌面吧。

image

這樣我們就取得貝氏網路模型的檔案,這個階段的操作也就到此為止。


Step 6. 檢視貝氏網路模型 / View the BayesNet Model

我們取得貝氏網路模型檔案之後,接下來就要在貝氏網路模型檢視器裡面使用它。

image

首先在「請上傳XML BIF檔案」的地方上傳剛剛取得的「貝氏網路模型.xml」檔案。

image

下面就會顯示整個貝氏網路模型了。由於演算法計算的關係,小數點第二位之後可能會不太一樣。

image

我們可以拖曳節點,讓整個貝氏網路更容易閱讀。

貝氏網路模型的使用是透過是否取得「已知證據」的情況,來推測可能的結果,或是可能造成結果的原因。以下我們用這個貝氏網路模型來看看幾種可能的用法。

證據未知的情況:事前機率(先驗機率) / Prior probability

image

如果門口進來一位看診者,在什麼情況都不知道的時候,醫生根據訓練集建立的條件機率表,觀察「class」(也就是「生病」)節點,這時候顯示的是事前機率(又稱為「先驗機率」),可以得知這人有病的機率是42.39%,沒病的機率是57.61%,因此這人沒病的機率比較大。

證據已知的情況:事後機率(條件機率) / Conditional probability

image

經醫生仔細觀察,發現這個看診者是位「男性」。我們可以在貝氏網路模型的「性別」節點中的「男」左邊的勾選方塊打勾,表示這是一個已知證據。

這時候你可以注意到其他節點的機率受到已知證據的影響,從事前機率變成了事後機率(又稱為「條件機率」)。特別是「class」(生病)的節點中,「有病」的機率提升到55.62%,比「沒病」的機率為高。因此這位男性的看診者可能有病。

image

醫生詢問看診者的抽菸習慣,發現他並沒有抽菸。這時候我們就在貝氏網路模型的「吸菸」節點中的「沒吸」上把它打勾,設定為已知證據。好了,現在我們已經知道這位看診者是男性、沒有吸菸,那麼他得病的機率是多少呢?

這時候右邊的「class」(生病)節點的機率又發生了變化,可以看到「沒病」的機率上升到了62.6%,可知這位看診者沒病的機率比較高。

只要我們取得更多已知的資料(也就是證據),我們就越能肯定預測的結果。這就是貝氏網路的結果預測。

推理原因 / Inference

貝氏網路除了預測結果之外,還能夠反過來,從結果來推測可能造成的原因。我們先將前面打勾的已知證據統統取消打勾,然後再來進行原因的推理。

image

醫生想知道「有病」的原因可能是來自於那些證據。這時候我們就把「class」(生病)節點中的「有病」打勾,表示知道這位看診者已經生病。

這時候「性別」跟「吸菸」節點的機率都發生了變化,可以看到「性別」中「男」的機率為66.5%,「吸菸」中的「有吸」為64.75%。推理的結果顯示,如果看診者有病的話,那他可能是男性,而且有吸菸習慣。其中是男性的機率高於吸菸的機率。

這樣子就可以協助我們推測可能造成此結果的原因。這就是貝氏網路的推理原因。

以下我就用GIF動畫來展示貝氏網路模型的操作過程吧:

anime

到這邊為止,我們就完成了貝氏網路的結果預測與原因推理囉。


奇怪的機率數字?似然加權 / Likehood weighting

image

如果讀者很細心地回頭比較原始資料跟上面貝氏網路模型所計算的機率,你會發現模型給的機率非常的奇怪。class (生病)為「有病」的4位案例中,男性跟有吸菸的人都佔了3個,也就是66.7%。可是為什麼前面「吸菸」為有吸的機率只有64.75%呢?

image

這是因為Weka在建立貝氏網路模型中學習條件機率表(CPT)的時候,使用了似然加權(likelihood weighting)的方法。這個方法是將不太可能出現證據的事件給予較低的權重。回到資料來看,在所有人數中,男性佔了50%,但吸菸人數只佔了40%,因此吸菸事件被給予了較低的權重。這也是為什麼用「有病」來推理原因時,「有吸」的機率只有64.75%,而不是66.7%的原因。


結語 / In closing

這篇方法介紹了貝氏網路的預測與推理的做法。儘管貝氏網路在這個時代已經逐漸被人遺忘,但是它仍然是一個結合專家與領域知識的方便工具。

我們可以用貝氏網路來為以下問題進行預測:

  • 學生在數位學習課程中4個單元內只看完了A、C二個單元,他最後通過期末考的機率是多少?
  • 客戶在5個產品中選擇了A、B兩個產品,那他會買C產品的機率是多少?
  • 昨天下雨、今天也下雨,那麼明天下雨的機率是?(這種做法叫做動態貝氏網路)

反過來說,我們也可以用貝氏網路來推理原因:

  • 對於通過期末考的學生,他們通常在數位學習課程中閱讀的單元是那些?
  • 客戶買了C產品,那他同時比較可能會購買其他那些產品?

如何?貝氏網路的用途是不是很廣泛呢?

這篇文章只有介紹了我在「分類與預測:貝氏網路」中講述的2/3的內容,後面還有預測測試集結果的方法,就請有興趣的讀者回頭去看投影片囉。

其他推理技術 / Related Inference Analyze Methods

如果有讀者注意到的話,推理原因的做法就很像我之前介紹過的「那個才是影響依變項最多的自變項?以SPSS實作解釋型多元迴歸」跟「聚焦於你感興趣的關聯規則:Weka的HotSpot演算法」。這兩種技術也都是找尋原因的好方法,但適用的資料類型並不同。多元迴歸跟貝氏網路相反,僅能處理連續資料。HotSpot只有目標屬性(最後一欄)限制要用類別資料,其他特徵的資料類型不限制,而且HotSpot可以提供更多指標,以讓我們對原因的分析有更多線索。

個人認為,若是只要推理原因的話,HotSpot可能會比貝氏網路更容易使用。其實我一開始是先整理好貝氏網路的技術,但還是深感只有單純的條件機率可能不太足夠,進一步深究之後才發現還有HotSpot演算法可以用。

不過,如果要簡單地實作預測跟推理,而且用非常直覺的方式來展示預測結果,我想可能很少方法能夠比貝氏網路還要直覺了吧。

自動建立貝氏網路結構檔 / Learning network structure from data

image

此外,貝氏網路還有一個用途,那就是由機器學習來自動建立網路結構。本篇文章中使用的資料僅有「性別」、「吸菸」、「生病」三個特徵,但如果特徵數量一多的時候,專家通常也很難確定到底是什麼特徵影響什麼特徵。這時候該怎麽辦好呢?

就跟許多機器學習是以「黑箱」(black-box)的方式學習最佳化的模型一樣,貝氏網路也有資料中自動學習並建立貝氏網路結構的K2演算法。若我們在Step 4. 設定貝氏網路時,searchAlgorithm使用預設的K2,並進一步設定他的最大父節點上限maxNrOfParents為10個,這樣K2就能從資料中學到想當複雜的網路結構。

image

上圖是以K2學習加拿大工作條件的結果,可以看到網路結構非常的複雜,基本上大多時候我們也不能解釋為何網路會長成這樣,這就是一種「黑箱」的表現。然而,我們以無法解釋網路結構的代價所換來的,卻是正確率從可以從預設的87.23%大幅提升至91.49%,這個預測正確率甚至比機器學習常見的類神經網路MLP、支持向量機SMO、決策樹J48都還要高呢!

由此可見,貝氏網路仍然是相當有潛力的一門技術。不僅可以以白箱的條件機率來預測結果跟推理原因,還能用黑箱的K2建立最佳化網路結構來大幅提升預測正確率,讓預測結果的準確性可跟其他分類演算法一較高下。可說是能屈能伸、用途廣泛的方法啊!

希望未來大家可別再以為貝氏演算法只有「假設特徵之間相互獨立,算起來很快,但不符合現實,不夠準確」的樸素貝氏,其實還有貝氏網路這個強大的分類演算法喔!


寫完貝氏網路的用法之後,我很好奇您對於這篇文章的看法。許多學生都被Weka操作的複雜流程搞得昏頭轉向,你是否也是如此呢?上面最後提到了貝氏網路的應用中,那個做法讓你覺得躍躍欲試,或是會想要試試看用在什麼其他的應用上呢?歡迎在下面留言寫下你的意見,也請你幫我在AddThis分享工具上按個讚、分享到Facebook或其他社群媒體。謝謝你的閱讀,我會在下一篇文章中繼續探討貝氏演算法的進階應用。

總共5 則留言 ( 我要發問 , 隱藏留言 顯示留言 )

  1. 下載您開發的"貝氏網路結構編輯器"後
    直接開啟下載的檔案
    無法在電腦使用
    倒是網路連結的可以使用

    回覆刪除
    回覆
    1. https://pulipulichen.github.io/HTML5-BayesNet-Tools/bayesnet-structure-editor/
      我試了一下,直接下載成單一網頁mhtml後,的確不能開啟

      不過你可以下載整個GitHub專案回去使用就是了
      https://github.com/pulipulichen/HTML5-BayesNet-Tools

      如何下載GitHub專案呢?請看這篇:
      http://blog.pulipuli.info/2016/05/github-how-to-download-files-in-github.html

      刪除
  2. 整個下載回來後還是不能使用

    https://imgur.com/tB9G5w4
    這是下載後開啟的畫面
    網路上的是上傳檔案(input)後, 就會貝氏網路結構就大致完成
    至於下載下來的卻不會有任何動作
    其他的也是如此
    一開始以為是作業系統或瀏覽器的關係
    換了win XP/ 10, Firefox/ Edge/ Chrome 也是一樣不會動 ^^||

    回覆刪除
    回覆
    1. 你好,

      https://github.com/pulipulichen/HTML5-BayesNet-Tools
      已經更新了 貝氏網路模型檢視器 的這個部分,現在只有這個功能可以以「檔案」形式使用

      http://3.bp.blogspot.com/-PGvQbXK1Av8/XXj7u4LdYwI/AAAAAAAEX0A/BMlpVDPB12Ikk_OdR5wuslqUF5rqakDlQCK4BGAYYCw/s1600/2019-09-11_214816.png

      這是因為這個程式從一開始就只是以「網頁線上使用」為目的開發
      沒有考慮到離線或是以檔案使用的情況

      以前寫程式思慮不夠周延啊,不夠成熟

      總之只要是以前的程式都有這個問題
      有人反映的話,我看情況再修吧

      刪除
  3. 近來有網友詢問「Step 1. 建立專家知識的網路結構」中取得的以「xmlbif-」開頭、xml格式的檔案,無法用在「Step 4. 設定貝氏網路分類器」中的「在BIFFile欄位裡面輸入先前建立的貝氏網路結構檔檔案路徑」裡面

    這原因可能是沒有將Weka的編碼改為UTF-8,詳細操作請看「如何在Weka中顯示中文:調整檔案編碼為UTF8」這篇:
    http://blog.pulipuli.info/2017/06/wekautf8-how-to-process-chinese-data-in.html

    回覆刪除