? ? ?“什么是判定樹?”判定樹是一個類似于流程圖的樹結構;其中,每個內部結點表示在一個屬性上的測試,每個分枝代表一個測試輸出,而每個樹葉結點代表類或類分布。樹的最頂層結點是根結點。一棵典型的判定樹如圖 7.2 所示。它表示概念 buys_computer,即,它預測 AllElectronics的顧客是否可能購買計算機。內部結點用矩形表示,而樹葉用橢圓表示。
? ? ?為了對未知的樣本分類,樣本的屬性值在判定樹上測試。路徑由根到存放該樣本預測的葉結點。判定樹容易轉換成分類規則。
? ? ?在 7.3.1 小節, 我們介紹學習判定樹的基本算法。在判定樹構造時,許多分枝可能反映的是訓練數據中的噪音或局外者。樹剪枝試圖檢測和剪去這種分枝,以提高在未知數據上分類的準確性。樹剪枝在 7.3.2 小節介紹。由判定樹提取分類規則在 7.3.3 小節討論。基本判定樹算法的加強在7.3.4 小節給出。大型數據庫判定樹歸納的可規模性問題在 7.3.5 小節討論。7.3.6 小節介紹判定樹歸納與諸如數據方等數據倉庫機制的集成,允許多個粒度層的判定樹挖掘。判定樹已在由醫療到游戲理論和商務等應用領域廣泛使用。判定樹是一些商業規則歸納系統的基礎。
算法:Generate_decision_tree。由給定的訓練數據產生一棵判定樹。
輸入:訓練樣本 samples,由離散值屬性表示;候選屬性的集合 attribute_list。
輸出:一棵判定樹。
方法:由訓練樣本歸納判定樹的基本算法
(1) 創建結點 N;
(2) if samples 都在同一個類 C then
(3) return N 作為葉結點,以類 C 標記;
(4) if attribut_list 為空 then
(5) return N 作為葉結點,標記為 samples 中最普通的類; //majority voting
(6) 選擇 attribute_list 中具有最高信息增益的屬性 test_attribute;
(7) 標記結點 N 為 test_attribute;
(8) for each test_attribute 中的未知值 a i //partition the samples
(9) 由結點 N 長出一個條件為 test_attribute = a i的分枝;
(10) 設 si 是 samples 中 test_attribute = a i的樣本的集合;//a partition
(11) if si 為空 then
(12) 加上一個樹葉,標記為 samples 中最普通的類;
(13) else 加 上 一 個 由 Generate_decision_tree(si,attribute_list–test_attribute)返回的結點;
7.3.1 判定樹歸納
? ? ?判定樹歸納的基本算法是貪心算法,它以自頂向下遞歸的劃分-控制方式構造判定樹。由訓練樣本歸納判定樹的基本算法是一種著名的判定樹算法 ID3 版本。算法的擴展將在 7.3.2 到 7.3.6 小節討論。算法的基本策略如下:
i) 樹以代表訓練樣本的單個結點開始(步驟 1)。
ii) 如果樣本都在同一個類,則該結點成為樹葉,并用該類標號(步驟 2 和 3)。
iii) 否則,算法使用稱為信息增益的基于熵的度量作為啟發信息,選擇能夠最好地將樣本分類的屬性(步驟 6)。該屬性成為該結點的“測試”或“判定”屬性(步驟 7)。在算法的該版本中,所有的屬性都是分類的,即離散值。連續屬性必須離散化。
iv) 對測試屬性的每個已知的值,創建一個分枝,并據此劃分樣本(步驟 8-10)。
v) 算法使用同樣的過程,遞歸地形成每個劃分上的樣本判定樹。一旦一個屬性出現在一個結點上,就不必該結點的任何后代上考慮它(步驟 13)。
vi) 遞歸劃分步驟僅當下列條件之一成立停止:
? ? ?(a) 給定結點的所有樣本屬于同一類(步驟 2 和 3)。
? ? ?(b) 沒有剩余屬性可以用來進一步劃分樣本(步驟 4)。在此情況下,使用多數表決(步驟 5)。這涉及將給定的結點轉換成樹葉,并用樣本中的多數所在的類標它。替換地,可以存放結點樣本的類分布。
? ? ?(c) 分枝 test_attribute = a i沒有樣本(步驟 11)。在這種情況下,以 samples 中的多數類創建一個樹葉(步驟 12)。
屬性選擇度量
? ? ?在樹的每個結點上使用信息增益度量選擇測試屬性。這種度量稱作屬性選擇度量或分裂的優劣度量。選擇具有最高信息增益(或最大熵壓縮)的屬性作為當前結點的測試屬性。該屬性使得對結果劃分中的樣本分類所需的信息量最小,并反映劃分的最小隨機性或 “不純性”。這種信息理論方法使得對一個對象分類所需的期望測試數目最小,并確保找到一棵簡單的(但不必是最簡單的)樹。
? ? ? 設 S 是 s 個數據樣本的集合。假定類標號屬性具有 m 個不同值,定義 m 個不同類 Ci (i = 1,...,m)。設 si是類 Ci中的樣本數。對一個給定的樣本分類所需的期望信息由下式給出:
? ? ?其中,pi是任意樣本屬于 Ci的概率,并用 si /s 估計。注意,對數函數以 2 為底,因為信息用二進位編碼。設屬性 A 具有 v 個不同值{a1 ,..., av}。可以用屬性 A 將 S 劃分為 v 個子集{S1 ,..., Sv};其中,Sj包含 S 中這樣一些樣本,它們在 A 上具有值 aj。如果 A 選作測試屬性(即,最好的劃分屬性),則這些子集對應于由包含集合 S 的結點生長出來的分枝。設 sij是子集 Sj中類 Ci的樣本數。根據 A劃分子集的熵或期望信息由下式給出:
? ? ?換言之,Gain(A)是由于知道屬性 A 的值而導致的熵的期望壓縮。
? ? ?算法計算每個屬性的信息增益。具有最高信息增益的屬性選作給定集合 S 的測試屬性。創建一個結點,并以該屬性標記,對屬性的每個值創建分枝,并據此劃分樣本。
? ? ?例 7.2 判定樹歸納。
? ? ?表 7.1 給出了取自 AllElectronics 顧客數據庫數據元組訓練集。(該數據取自[Qui86])。類標號屬性 buys_computer 有兩個不同值(即, {yes, no}),因此有兩個不同的類(m = 2)。設類 C1對應于 yes,而類 C2對應于 no。類 yes 有 9 個樣本,類 no 有 5 個樣本。為計算每個屬性的信息增益,我們首先使用(7.1)式,計算對給定樣本分類所需的期望信息:
? ? ?下一步,我們需要計算每個屬性的熵。讓我們從屬性 age 開始。我們需要觀察 age 的每個樣本值的 yes 和 no 分布。我們對每個分布計算期望信息。
? ? ?總而言之,判定樹歸納算法已在廣泛的應用領域用于分類。這種系統不使用領域知識。判定樹歸納的學習和分類步驟通常很快。
7.3.2 樹剪枝
? ? ?當判定樹創建時,由于數據中的噪音和局外者,許多分枝反映的是訓練數據中的異常。剪枝方法處理這種過分適應數據問題。通常,這種方法使用統計度量,剪去最不可靠的分枝,這將導致較快的分類,提高樹獨立于測試數據正確分類的可靠性。
? ? ?“樹剪枝如何做?”有兩種常用的剪枝方法。
? ? ?在先剪枝方法中,通過提前停止樹的構造(例如,通過決定在給定的結點上不再分裂或劃分訓練樣本的子集)而對樹“剪枝”。一旦停止,結點成為樹葉。該樹葉可能持有子集樣本中最頻繁的類,或這些樣本的概率分布。在構造樹時,統計意義下的度量,如χ2、信息增益等,可以用于評估分裂的優劣。如果在一個結點劃分樣本將導致低于預定義閾值的分裂,則給定子集的進一步劃分將停止。然而,選取一個適當的閾值是困難的。較高的閾值可能導致過分簡化的樹,而較低的閾值可能使得樹的化簡太少。
? ? ?第二種方法是后剪枝方法,它由“完全生長”的樹剪去分枝。通過刪除結點的分枝,剪掉樹結點。代價復雜性剪枝算法是后剪枝方法的一個實例。最下面的未被剪枝的結點成為樹葉,并用它先前分枝中最頻繁的類標記。對于樹中每個非樹葉結點,算法計算該結點上的子樹被剪枝可能出現的期望錯誤率。然后,使用每個分枝的錯誤率,結合沿每個分枝觀察的權重評估,計算不對該結點剪枝的期望錯誤率。如果剪去該結點導致較高的期望錯誤率,則保留該子樹;否則剪去該子樹。逐漸產生一組被剪枝的樹之后,使用一個獨立的測試集評估每棵樹的準確率,就能得到具有最小期望錯誤率的判定樹。
? ? ?我們可以根據編碼所需的二進位位數,而不是根據期望錯誤率,對樹進行剪枝。“最佳剪枝樹”使得編碼所需的二進位最少。這種方法采用最小描述長度(MDL)原則。由該原則,最簡單的解是最期望的。不象代價復雜性剪枝,它不需要獨立的樣本集。
? ? ?也可以交叉使用先剪枝和后剪枝,形成組合式方法。后剪枝所需的計算比先剪枝多,但通常產生更可靠的樹。
7.3.3 由判定樹提取分類規則
? ? ?“我可以由我的判定樹得到分類規則嗎?如果能,怎么做?”可以提取判定樹表示的知識,并以 IF-THEN 形式的分類規則表示。對從根到樹葉的每條路經創建一個規則。沿著給定路經上的每個屬性-值對形成規則前件(“IF”部分)的一個合取項。葉結點包含類預測,形成規則后件(“THEN”部分)。IF-THEN 規則易于理解,特別是當給定的樹很大時。
? ? ? 例 7.3 由判定樹產生分類規則。
? ? ?沿著由根結點到樹葉結點的路經,圖 7.2 的判定樹可以轉換成 IF-THEN 分類規則。由圖 7.2 提取的規則是:
IF age = ”<=30” AND student = “no” ? ? ? THEN buys_computer = “no”
IF age = ”<=30” AND student = “yes” ? ? ?THEN buys_computer = “yes”
IF age = ”31...40” ? ? ? THEN buys_computer = “yes”
IF age = ”>40” AND credit_rating =“excellent” ? ? ? THEN buys_computer = “no”
IF age = ”>40” AND credit_rating =“fair” ? ? ? THEN buys_computer = “yes”
? ? ?C4.5(ID3 算法的后繼版本)使用訓練樣本估計每個規則的準確率。由于這將導致對規則的準確率的樂觀估計,C4.5 使用一種悲觀估計來補償偏差。替換地,也可以使用一組獨立于訓練樣本的測試樣本來評估準確性。通過刪除規則前件中無助于改進規則評估準確性的條件,可以對規則“剪枝”。對于每一類,類中規則可以按它們的精確度定序。由于一個給定的樣本可能不滿足任何規則前件,通常將一個指定主要類的省缺規則添加到規則集中。
7.3.4 基本判定樹歸納的加強
? ? ?“對基本判定樹歸納的加強有哪些?”業已提出了許多對 7.3.1 小節判定樹歸納基本算法的加強。本小節,我們將討論若干主要加強,其中一些結合到 ID3 的后繼算法 C4.5 中。
? ? ?7.3.1 小節的判定樹歸納基本算法要求所有的屬性是分類的或離散化的。可以修改該算法,允許屬性具有整個離散區間或連續值。在這種屬性 A 上的測試導致兩個分枝,對應于條件 A ≤ V 和 A >V,其中 V 是 A 的某個數值值。給定 A 的值 v,確定 V 時考慮 v-1 個可能的分割。通常,考慮每對相鄰值的中間值。如果這些值已預先排序,則只需要掃描一次這些值。信息增益度量有傾斜,它傾向于適合具有許多值的屬性。已經提出了一些替代的方法,如增益率,它考慮每個屬性值的概率。還有一些其它選擇度量,包括 Gini 索引,χ2相依表統計和 G-統計。已經提出了許多方法來處理遺漏的屬性值。例如,屬性 A 的遺漏值或未知值可以用 A 的最常見值替代。替換地,屬性 A 的外觀上的信息增益也可以根據 A 的值未知的樣本百分比減少。這樣,具有缺少值的樣本“片段”可以在測試結點被劃分到多個分枝。其它方法可能尋找 A 的最可能值,或使用 A 和其它屬性的已知聯系。
? ? ?通過重復地將數據劃分成越來越小的部分,判定樹歸納可能面臨碎片、重復和復制問題。碎片是指一個給定分枝中的樣本數太小,沒有統計意義。解決該問題的一種方法是將分類屬性值分組。樹結點可以測試一個屬性值是否屬于給定的集合,如 Ai∈{a1, a2, ..., an}。另一種替代是創建二叉判定樹,其每個分枝擁有一個屬性上的布爾測試。二叉樹導致較少的數據碎片。一些實驗研究發現二叉判定樹比傳統的判定樹更精確。當一個屬性沿樹的一個給定分枝重復測試時,就出現重復。復制是復制樹中已存在的子樹。屬性(特征)構造是防止這三個問題的一種方法。通過由給定的屬性創建新的屬性,改進給定屬性的受限表示。屬性構造作為數據變換的一種形式,已在第 2 章討論過。
? ? ?業已提出了判定樹歸納的增量版本。當給定新的訓練數據時,增量方法重新構造由先前的訓練數據學習獲得的判定樹,而不是“盲目地”通過學習構造一棵新樹。
? ? ?還有一些對基本判定樹歸納的加強,它們關注可規模性和與數據倉庫技術的集成。這些分別在7.3.5 和 7.3.6 小節討論。
7.3.5 判定樹歸納的可規模性
? ? ?“判定樹歸納的可規模性如何?”已有的判定樹算法,如 ID3 和 C4.5,對于相對小的數據集是很有效的。當這些算法用于非常大的、現實世界數據庫的挖掘時,有效性和可規模性就成了關注的問題。大部分判定樹算法都限制訓練樣本駐留主存。在數據挖掘應用中,包含數以百萬計樣本的非常大的訓練集是很普通的。因此,這一限制就制約了這些算法的可規模性。由于訓練樣本在主存和高速緩存換進換出,判定樹的構造可能變得效率低下。由大型數據庫構造判定樹的早期策略包括對連續屬性離散化,在每個結點對數據選樣。然而,這些仍然假定訓練集可以放在主存。一種替代的方法是:首先,將樣本劃分成子集,使得每個子集可以放在內存;然后,由每個子集構造一棵判定樹;最后,輸出的分類法將由每個子集得到的分類法組合在一起。盡管該方法可以用于大數據集的分類,其分類的準確性不如一次使用所有的數據的方法高。
? ? ?最近,已經提出了一些判定樹算法,它們強調可規模性。由非常大的訓練集進行判定樹歸納的算法包括 SLIQ 和 SPRINT;它們都能處理分類屬性和連續值屬性。這兩種算法都使用了預排序技術,對非常大,而不能放入內存的駐留磁盤的數據集進行預排序。兩種算法都定義使用新的數據結構,以利于樹的構造。SLIQ 使用若干駐留磁盤的屬性表和單個駐留主存的類表。對于表 7.2 的樣本數據,SLIQ 產生的屬性表和類表如圖 7.5 所示。每一個屬性具有一個屬性表,在 RID(記錄標識)建立索引。每個元組由一個從每個屬性表的一個表目到類表的一個表目(存放給定元組的類標號)的鏈接表示。而類表表目鏈接到它在判定樹中對應的葉子結點。類表駐留在主存,因為判定樹的構造和剪枝時,經常訪問它。類表的大小隨訓練集中元組數目成比例增長。當類表不能放在主存時,SLIQ 的性能下降。
? ? ?SPRINT 使用不同的屬性表數據結構,存放類和 RID 信息,如圖 7.6 所示。當結點分裂時,屬性表被相應劃分,并在結果子女中分布。當表劃分時,表中記錄的次序維持不變。因此,劃分表不需要重新排序。SPRINT 的設計易于并行,這就進一步增強了可規模性。
7.3.6 集成數據倉庫技術和判定樹歸納
? ? ?判定樹歸納可以與數據倉庫技術集成,用于數據挖掘。本小節,我們討論多維數據方方法和面向屬性的歸納如何與判定樹歸納集成,以利于交互的多層挖掘。一般地,這里介紹的技術也可以用于其它形式的學習。
? ? ?數據方方法可以與判定樹歸納集成,提供交互的判定樹的多層挖掘。數據方和存放在概念分層中的知識可以用于在不同的抽象層歸納判定樹。此外,一旦導出判定樹,概念分層可以用來泛化或特化樹的結點,可以在屬性上進行上卷或下鉆,并對新的特定抽象層的數據重新分類。這種交互特點使得用戶可以將他們的注意力集中在他們感興趣的樹區域或數據。
? ? ?面向屬性的歸納(AOI)使用概念分層,通過以高層概念替換低層概念泛化訓練數據(第 5 章)。當我們將 AOI 與判定樹歸納集成時,泛化到很低的(特定的)概念層可能導致非常大而茂盛的樹。對非常高的概念層的泛化可能導致判定樹沒什么用;這里,由于過度泛化,一些有趣、重要的子概念丟失了。應當泛化到由領域專家設定,或由用戶指定的閾值控制的某個中間概念層。這樣,AOI的使用可能產生更易理解的、較小的分類樹,從而得到的樹比直接在低層、非泛化的數據集上操作的方法(如 SLIQ 或 SPRINT)產生的樹更易于解釋。
? ? ?對判定樹的典型批評是,由于遞歸地劃分,一些數據子集可能變得太小,使得進一步劃分它們就失去統計意義。這種“無意義”的數據子集的最大尺寸可以統計地確定。為處理這一問題,可以引進一個例外閾值。如果給定子集中的樣本數少于該閾值,該子集的進一步劃分停止。替換地,創建一個葉結點,存放該子集和該子集樣本的類分布。
? ? ?由于大型數據庫中的數據量大、發散,假定每個樹葉包含屬于一個公共類的樣本可能是不合理的。這一問題可以通過使用準確率或分類閾值解決。如果屬于給定結點的任意類的樣本百分比超過該閾值,在給定結點上的進一步劃分將終止。
? ? ?數據挖掘查詢語言可以容易地用于說明增強的判定樹歸納方法。假定數據挖掘任務是根據顧客的收入和職業,預測 30 多歲的顧客的信用風險,可以用如下數據挖掘查詢來說明:
mine classfication
analyze credit_risk
in relevance to income,occupation
from Customer_db
where (age>=30) and (age<40)
display as rules
? ? ?上面用 DMQL 表達的查詢在 Customer_db 上執行關系查詢,提取任務相關的數據。不滿足 where子句條件的元組將被忽略,并且僅收集 in relevance to 子句中說明的屬性和類標號屬性(credit_risk)。然后,AOI 在這些數據上操作。由于該查詢并未說明所用的概念分層,因此使用省缺的概念分層。可以設計一個圖形用戶界面,使得用戶通過這種數據挖掘查詢語言說明數據挖掘任務更加容易。借助于這種辦法,用戶可以指導自動的數據挖掘過程。