分類與預測:貝氏網路 / Classification and Prediction: BayesNet
這是巨量資料探勘與統計應用課程的投影片「分類與預測:貝氏網路」。本單元是屬於系列課程中「資料預測級」的第一個單元,處理資料類型是從「類別」來預測「類別」類型的資料。貝式網路(BayesNet)是一種能夠表示變項間因果關係的機率模型,原理簡單、計算速度快,不僅可以用來預測結果,還能推理可能的原因。貝式網路是早期專家決策支持系統最常使用的模型,例如可以用來協助醫生找尋病因。本單元先用簡單「吸菸可能造成生病」的例子來說明貝式網路的運作方式,再來使用Weka來建立貝式網路結構、準備訓練集跟測試集、顯示貝式網路模型以及預測結果。本單元使用了四個我自製的工具來搭配Weka實作貝式網路預測,單元內包含了三個實作學習單跟一份測驗,供同學邊看邊練習。
單元大綱 / Outline
- 貝氏網路
- 實作:貝氏網路
- 進階評估模型:交互驗證10疊
- 實作:預測測試集
- 課堂練習:這是好工作嗎?
投影片 / Slide
- 教學投影片: Google Presentation
- 教學投影片其他格式: Power Point、 PDF、 OpenDocument Presnetation
我以Google簡報的檔案匯出成PPTX,再備份到以下位置:
- SlideShare 、 GitHub 、 OneDrive 、 Box 、 Mega 、 MediaFire 、 Google Drive
學習單 / Worksheets
本單元包含了以下的學習單,請搭配課程投影片一起練習吧。
測驗 / Examine
本單元整理了一份測驗,供同學驗證所學:
資料集 / Dataset
本單元用到了以下資料:
- 看診者樣本資料集:這是我編撰的範例。
- 看診者樣本資料集(含測試集):這同樣是我編撰的範例。
- 加拿大工作條件(含測試集):這是從Weka提供的範例資料labor.arff中,抽取部分樣本的例子。這是1988年11月在加拿大調查各項工作情況的資料。
- 小麥種子類型資料集:這份是修改自UCI機器學習保存庫中提供的種子資料集。這份資料集是Charytanowicz等人在2010發表的書籍「Information Techonologies in Biomedicine」中的例子。
線上操作平臺 / Online Workplace
本單元的實作需要使用部分雲端服務、我自己開發的工具,以及安裝在本機端的Weka搭配使用。以下的雲端服務建議使用Google Chrome瀏覽器開啟:
- 資料來源
- 布丁開發的雲端工具
- Weka
-
- Weka下載 (本單元不需要安裝套件)
- 如何在Weka中顯示中文:調整檔案編碼為UTF8
貝式網路工具 / BayesNet Tools
這次貝式網路使用到的工具蠻多的,而且操作也蠻複雜的,一不小心就可能會做錯。我試著做了四個雲端工具來讓整個操作簡單一點,它們必須搭配Weka一起使用。所有的程式碼都已經放在GitHub保存庫,網址如下:
貝式網路結構編輯器 / BayesNet structure editor
試算表轉ARFF / Spreadsheet to ARFF
貝式網路模型檢視器 / BayesNet model viewer
ARFF轉CSV / ARFF to CSV
小結 / In closing
使用貝式模型來做分類器演算法的原理非常容易理解。就像上圖一樣,要預測這個籃子是「蘋果籃」還是「香蕉籃」,那就只要看這個籃子中到底是蘋果比較多、還是香蕉比較多,這樣就可以進行「預測」。是的,將特徵出現的模式歸納成可供判斷的模型,這就是所有資料預測技術最基本的道理。而能夠具體體現這個道理的演算法,正是貝式演算法,這也是我選擇貝式演算法作為資料預測的主要原因。
除了容易理解之外,貝式演算法本身還有一項特質:模型本身可讓人類直接解釋,也就是白箱演算法(white-box algorithm)。而貝式網路更具備了可向後預測結果、可向前推理原因的靈活性。以上圖來說,如果我們知道看診者的性別與吸菸習慣,我們就能預測他生病的機率。反過來說,如果發現看診者已經生病,那我們也可以反過來推理他可能的性別跟吸菸習慣的不同機率。後者這種推理做法特別適合用於各種診斷,像是學習問題診斷(到底是那個單元沒學好)、生產線問題診斷(到底是那個環節出問題),或是關聯規則的分析,像是分析喜歡本公司產品的消費所具備的共同背景(反之,若是要預測的話,就可以從消費者的背景來預測他會不會喜歡本公司的產品)。
由於貝式演算法運算簡單、用途靈活,早期在人工智慧領域與專家決策支援系統大受歡迎,甚至也出現能夠結合時間因素進行動態預測的動態貝式演算法(我也在動態生成模型裡面做過類似的做法)。但是這種白箱演算法在預測能力上比不過黑箱演算法,在變項的推理能力上也比不過關聯規則分析或統計的多元迴歸和路徑分析,這可能造成了貝式演算法逐漸不受人關注的原因。時至今日,資料探勘對貝式演算法的介紹就只剩下樸素貝式(Naive Bayes),而對它的描述也只有機率模型、運算很快、但是有著假設變項之間獨立的缺點。熟不知樸素貝式對變項間獨立的假設是提升演算法效率的前提,而貝式網路可用於預測和推理的靈活性也逐漸被人遺忘。
看著現在大家在大數據、人工智慧、深度學習領域一直追求著高準確度的預測演算法,用複雜的數學算式建構出人類所無法解讀的黑箱模型,我決定在這個課程中一反常態,教同學這個簡單、同樣能做到預測、而且容易解釋的貝式網路。
除此之外,貝式演算法還具備可更新性(updatable)。如果有新的資料要納入預測模型中的時候,可更新的貝式演算法是不需要從新建立模型,而是可以在既有的模型之上加入新資料、以此更新模型。加上貝式演算法本身就容易計算、效率高的特性,這都讓貝式演算法很適合用於需要即時輸入資料、即時更新的網頁應用程式。這些種種特性,都讓我對貝式演算法情有獨鍾。
貝式網路的延伸閱讀 / Reference for BayesNet
(圖片來源:Google Book)
在我讀過關於機器學習與資料探勘的書籍中,大部分作者對貝式演算法的介紹都不多,唯一深入闡釋貝式網路原理與應用的書籍,就是「人工智慧:現代方法」。我閱讀的是圖書館借來的第二版,該書在第四部分「不確定知識與推理」裡面講解了機率模型對於推理的意義,更進一步的進展到加入時間因素的動態貝式網路,許多篇幅都在講解貝式網路與機率模型。跟這本書相比,我這篇介紹貝式網路的方式可像是國小教材一樣入門啊。
但是「人工智慧:現代方法」第二版的中文書翻譯得不是很好,不僅許多用詞一看就知道是中國大陸那邊轉換過來的,書中大量的邏輯推導也不是很好閱讀。不知道第三版有沒有改善呢?
話說回來,這本書對於人工智慧AI有嚴謹且全面的介紹,可以一窺設計具有人工智慧機器人所需考慮的各種面向。反觀今日,大家多把人工智慧跟深度學習綁在一起(實際上,這只是人工智慧的「學習」這一塊),或是把能跟人類互動的自然語言處理視為人工智慧 (看這篇「LINE:AI 不只是機器學習,而應該是生活中的虛擬助理」),但這些都只是人工智慧底下的其中一個面向而已。
雖然時代在進步、技術在發展,但我們只對新技術的吹捧,卻不見前人的成果,不禁令人感嘆。
關於教學的反思 / Reflection on teaching
在本單元中的三個學習單中,同學需要循序漸進地學習四個貝氏網路預測的各項功能:
- 用自訂的貝氏網路結構,對訓練集建立貝氏網路模型,並用訓練集評估模型。
- 承上,改用交互驗證10疊評估模型。
- 承上,加入測試集之後,預測未知的結果。
- 承上,改用自動產生貝氏網路結構的K2演算法。
我很喜歡這種循序漸進的方式,一點一點揭露完整作法的過程。深入淺出系列的書籍裡面也很常採用這種教學方式,作者會在教學的過程中帶領讀者思考為什麼要這樣作,以及為什麼會有更好的作法。
但顯然的,這個單元的安排還沒有到深入淺出系列書籍這樣高竿。大部分同學在經過這四個階段的不同操作方式後,許多人都露出了困惑的表情。
「為什麼不要一口氣教最完整的流程呢?」這是許多同學都有的疑惑。也許很多理由可以回答這個問題,像是細節太多了,沒辦法一次講完;操作流程太長了,所以要分段教。但同學說的對,不管怎樣,我在最後的確應該再把完整的操作流程整理一次。所以我之後會再另外在blog介紹貝氏網路的預測與推理,到時候會就完整操作流程做個好好的說明。
要精簡操作流程嗎? / How about simplify the preocess?
雖然本單元的操作簡直長的不像話,但比起原本在Weka的操作比起來,它其實已經簡單了許多。
Weka雖然具備了貝氏網路編輯器,可以用來制訂貝氏網路結構,或是檢視最後產生的貝氏網路模型,但老實說那個實在是有夠難用。因此我額外開發了貝氏網路結構編輯器來產生貝氏網路結構,也做了貝氏網路模型檢視器,以此取代了原本Weka的貝氏網路編輯器功能。
此外,Weka主要使用的ARFF格式並不像試算表CSV這樣容易編輯,因此我還得做一個試算表轉換ARFF、以及ARFF轉CSV這兩種轉換器。
再加上本來就必須在Weka裡面的操作,這真的是有夠複雜了,不是嗎?
是事實上,這整個流程還可以更加簡化。那就是使用Weka提供的命令列功能來執行預測的動作。雖然他也許不能產生貝氏網路模型,但至少拿來預測未知案例倒是可以確定的事情。詳情可以看我之前寫的另一篇「使用Weka指令列實作預測功能」。
不過,連Weka的操作都省略了,這樣好嗎?Weka提供了大量的過濾器和演算法,可以讓使用者自由選擇、比較,藉以找出最佳方案。如果略過這些操作,直接就用命令列輸出結果,這樣子是不是就喪失了學習的機會呢?
但反過來說,這不就跟學習統計,學到最後都是SPSS操作,反而模糊了統計分析技術本身的重點嗎?如果做個像前幾篇一樣的計算器,讓同學省略大量的操作步驟,不就更能著重在應用上了嗎?
不過,貝氏網路的建模技術並沒有統計工具這樣熱門,一時找不到好用的函式庫。光這個貝氏網路模型檢視器背後的函式庫就讓我煞費苦心了,要做到像K2那樣自動建立貝氏網路的計算器,至少在這次授課我是不太可能完成。
總之,越多的操作步驟,到底是幫助同學有學習其他功能的機會,還是讓同學減少學習其他應用的時間,我至今還是沒有一個比較好的答案。不過,如果真的能夠順利做出簡單就能夠建立貝氏網路的方法的話,也許在大學時先用簡單方法來實作貝氏網路分類器,上研究所之後再深入探究演算法的細節,這可能是比較好的做法吧。
本單元介紹的貝氏網路分類器就到這邊為止,之後有機會的話我會再將Weka使用貝氏網路建模的做法好好說明一下。不知道看到這邊的你,對機器學習的分類與預測有什麼看法呢?你以前是否也學過貝氏演算法?至少高中學機率的時候都聽過貝氏定理吧?你對於貝氏演算法有什麼想法呢?歡迎在下面的留言處跟我分享你的看法,或是用AddThis分享工具上分享我的文章,幫我按個讚吧!那我們下次見囉!
你好,請問勾選證據後,各項機率值是如何計算的呢?
回覆刪除請見計算條件機率的方式
刪除簡單的例子:
https://docs.google.com/presentation/d/1KV3j9n9ApOo8bOitZ9S50C_vGzy18DhQJGoKNG_MKlY/edit#slide=id.g21cec636b4_4_187
從條件機率表CPT計算條件機率的方式:
https://docs.google.com/presentation/d/1KV3j9n9ApOo8bOitZ9S50C_vGzy18DhQJGoKNG_MKlY/edit#slide=id.g21cec636b4_4_579