在2006年12月召開的 IEEE 數據挖掘國際會議上(ICDM, International Conference on Data Mining),與會的各位專家選出了當時的十大數據挖掘算法( top 10 data mining algorithms ),可以參見文獻【1】。本博客已經介紹過的位列十大算法之中的算法包括:
- [1] k-means算法(http://blog.csdn.net/baimafujinji/article/details/50570824)
- [2] 支持向量機SVM(http://blog.csdn.net/baimafujinji/article/details/49885481)
- [3] EM算法(http://blog.csdn.net/baimafujinji/article/details/50626088)
- [4] 朴素貝葉斯算法(http://blog.csdn.net/baimafujinji/article/details/50441927)
- [5] kNN算法(http://blog.csdn.net/baimafujinji/article/details/6496222)
因為原文較長,我嘗試把它們分散成幾篇。本文是決策樹模型系列中的第二篇,希望你在閱讀本文之前已經對《數據挖掘十大算法之決策樹詳解(1)》中之內容有較深入理解。決策樹模型是一類算法的集合,在數據挖掘十大算法中,具體的決策樹算法占有兩席位置,即C4.5和CART算法,本文都會介紹到它們。
歡迎關注白馬負金羈的博客 http://blog.csdn.net/baimafujinji,為保證公式、圖表得以正確顯示,強烈建議你從該地址上查看原版博文。本博客主要關注方向包括:數字圖像處理、算法設計與分析、數據結構、機器學習、數據挖掘、統計分析方法、自然語言處理。
ID3算法
ID3和C4.5都是由澳大利亞計算機科學家Ross Quinlan開發的決策樹構建算法,其中C4.5是在ID3上發展而來的。下面的算法描述主要出自文獻【3】。
ID3算法的核心是在決策樹各個結點上應用信息增益准則選擇特征,遞歸地構建決策樹。具體方法是:從根結點(root node)開始,對結點計算所有可能的特征的信息增益,選擇信息增益最大的特征作為結點的特征,由該特征的不同取值建立子結點;再對子結點遞歸地調用以上方法,構建決策樹;直到所有特征的信息增益均很小或沒有特征可以選擇為止。最后得到一棵決策樹。ID3相當於用極大似然法進行概率模型的選擇。 下面我們給出一個更加正式的ID3算法的描述:
輸入:訓練數據集D,特征集A,閾值ϵ;
輸出:決策樹T。
-
若D中所有實例屬於同一類Ck,則T為單結點樹,並將類Ck作為該結點的類標記,返回T;
-
若A=∅,則T為單結點樹,並將D中實例數最大的類Ck作為該結點的類標記,返回T;
-
否則,計算A中各特征對D的信息增益,選擇信息增益最大的特征Ag;
(1) 如果Ag的信息增益小於閾值ϵ,則置T為單結點樹,並將D中實例數最大的類Ck作為該結點的類標記,返回T;
(2) 否則,對Ag的每一可能值ai,依Ag=ai將D分割為若干非空子集Di,將Di中實例數最大的類作為標記,構建子結點,由結點及其子結點構成樹T,返回T; -
對第i個子結點,以Di為訓練集,以A−{Ag}為特征集,遞歸地調用步驟(1)~(3),得到子樹Ti,返回Ti。
下面我們來看一個具體的例子,我們的任務是根據天氣情況計划是否要外出打球:
首先來算一下根節點的熵:
然后再分別計算每一種划分的信息熵,比方說我們選擇Outlook這個特征來做划分,那么得到的信息熵為
據此可計算采用Outlook這個特征來做划分時的信息增益為
同理,選用其他划分時所得到之信息增益如下:
取其中具有最大信息增益的特征來作為划分的標准,然后你會發現其中一個分支的熵為零(時間中閾值可以設定來懲罰過擬合),所以把它變成葉子,即得
對於其他熵不為零(或者大於預先設定的閾值)的分支,那么則需要做進一步的划分
根據上述的規則繼續遞歸地執行下去。最終,我們得到了如下一棵決策樹。
C4.5算法
C4.5是2006年國際數據挖掘大會票選出來的十大數據挖掘算法之首,可見它應該是非常powerful的!不僅如此,事實上,C4.5的執行也相當的straightforward。
C4.5算法與ID3算法相似,C4.5算法是由ID3算法演進而來的。C4.5在生成的過程中,用信息增益比來選擇特征。下面我們給出一個更加正式的C4.5算法的描述:
輸入:訓練數據集D,特征集A,閾值ϵ;
輸出:決策樹T。
- 如果D中所有實例屬於同一類Ck,則置T為單結點樹,並將Ck作為該結點的類,返回T;
- 如果A=∅,則置T為單結點樹,並將D中實例數最大的類Ck作為該結點的類,返回T;
- 否則,計算A中各特征對D的信息增益比,選擇信息增益比最大的特征Ag;
(1) 如果Ag的信息增益比小於閾值ϵ,則置T為單結點樹,並將D中實例數最大的類Ck作為該結點的類,返回T;
(2) 否則,對Ag的每一可能值ai,依Ag=ai將D分割為若干非空子集Di,將Di中實例數最大的類作為標記,構建子結點,由結點及其子結點構成樹T,返回T; - 對結點i,以Di為訓練集,以A−{Ag}為特征集,遞歸地調用步驟(1)~(3),得到子樹Ti,返回Ti。
How to do it in practice?
易見,C4.5跟ID3的執行步驟非常類似,只是在划分時所采用的准則不同。我們這里不再贅述。但是這里可以來看看在實際的數據分析中,該如何操作。我們所使用的數據是如下所示的一個csv文件,文件內容同本文最初給出的Play Ball例子中的數據是完全一致的。
本博客之前介紹的實例中,已經分別演示過用R語言、Python,或者Matlab進行數據挖掘的方法,這里將演示另外一種常用的數據挖掘工具Weka的使用。Weka是由新西蘭懷卡托大學開發的一款基於Java的免費的數據挖掘工具,你可以從下面的鏈接中下載得到它:
使用Weka進行數據挖掘是非常容易的,你不再需要像R語言或者MATLAB那樣編寫代碼或者調用函數。基於GUI界面,在Weka中你只需要點點鼠標即可!首先我們單擊“Explorer”按鈕來打開操作的主界面,如下圖所示。
然后我們單擊“Open File…”,並從相應的目錄下選擇你要用來進行模型訓練的數據文件,如下圖所示。
Weka提供了非常易於操作的各種數據預處理功能,你可以自己嘗試探索一下。注意到屬性Day其實在構建決策樹時是不需要的,我選中該屬性,並將其移除,如下圖所示。
完成數據預處理后,我們就可以開始進行模型訓練了。因為我們是要建立決策樹,所以選擇“Classify”選項卡,然后在“Classifier”中選擇J48。你可以能會疑惑我們不是要使用C4.5算法建立決策樹嗎?為什么要選擇J48呢?其實J48是一個開源的C4.5的Java實現版本(J48 is an open source Java implementation of the C4.5 algorithm),所以J48就是C4.5。
然后你可以自定義的選擇“Test options”中的一些測試選項,這里我們不做過多說明。然后單擊“Start”按鈕,Weka就為我們建立了一棵決策樹,你可以從“Classifier output”欄目中看到模型訓練的一些結果。但是對於決策樹而言,你可以覺得文字看起來還不夠直觀。不要緊,Weka還為你提供了可視化的決策樹建模呈現。為此,你需要右鍵單擊剛剛訓練好的模型,然后從右鍵菜單中選擇“Visualize tree”,如下圖所示。
最后我們得到了一棵與前面例子中相一致的決策樹,如下圖所示。
在后續的決策樹系列文章中,我們將繼續深入探討CART算法等相關話題。
(未完,待續…)
參考文獻
【1】Wu, X., Kumar, V., Quinlan, J.R., Ghosh, J., Yang, Q., Motoda, H., McLachlan, G.J., Ng, A., Liu, B., Philip, S.Y. and Zhou, Z.H., 2008. Top 10 algorithms in data mining. Knowledge and information systems, 14(1), pp.1-37. (http://www.cs.uvm.edu/~icdm/algorithms/10Algorithms-08.pdf)
【2】Pang-Ning Tan, Michael Steinbach, Vipin Kumar, 數據挖掘導論,人民郵電出版社
【3】李航,統計學習方法,清華大學出版社
【4】http://www.saedsayad.com/decision_tree.htm
【5】https://www.cise.ufl.edu/~ddd/cap6635/Fall-97/Short-papers/2.htm
如果你對機器學習和數據挖掘感興趣,你還可以參考我的高能資源帖:
【6】機器學習與數據挖掘網上資源搜羅
【7】機器學習與數據挖掘的學習路線圖
