從資料集構造決策樹演算法所需要的子功能模組,其工作原理如下:得到原始資料集,然後基於最好的屬性值劃分資料集,由於特徵值可能多於兩個,因此可能存在大於兩個分支的資料集劃分。第一次劃分之後,資料集被向下傳遞到樹的分支的下乙個結點。在這個結點上,我們可以再次
劃分資料,因此我們可以採用遞迴的原則處理資料集。
遞迴結束的條件是:
1) 程式遍歷完所有劃分資料集的屬性;
2)每個分支下的所有實例都具有相同的分類;
3)當前結點包含的樣本集合為空時,不能劃分。
在第2種情形下,我們把當前結點標記為葉結點,並將其類別設定為該結點所含樣本最多的類別,任何到達葉結點的資料必然屬於葉結點的分類;在第3種情形下,同樣把當前結點標記為葉結點,但將其類別設定為其父結點所含樣本最多的類別。
id3演算法原型見於 j.r quinlan 的博士**,是基礎理論較為完善,使用較為廣泛的決策樹模型,在此基礎上 j.r quinlan 進行優化後,陸續推出了c4.5 和 c5.0 決策樹演算法,我們先從id3開始,再討論如何從id3逐漸優化至c4.5。
id3演算法的核心是在決策樹各個結點應用資訊增益準則選擇特徵,遞迴地構建決策樹。具體方法是:
1)從根結點開始,對結點計算所有可能的特徵的資訊增益;
2)選擇資訊增益最大的特徵作為結點的特徵,由該特徵的不同取值建立子結點;
3)再對子結點呼叫以上方法,構建決策樹;
4)直到所有特徵的資訊增益均很小或沒有特徵可以選擇為止,最後得到乙個決策樹。
#id3演算法
"""函式功能:基於最⼤資訊增益切分資料集,遞迴構建決策樹
引數說明:
dataset:原始資料集(最後一列是標籤)
返回:mytree:字典形式的樹
"""def
createtree
(dataset)
: featlist =
list
(dataset.columns)
# 提取出資料集所有的列
classlist = dataset.iloc[:,
-1].value_counts(
)# 獲取最後一列類標籤
# 判斷最多標籤數目是否等於資料集行數,或者資料集是否只有一列
if classlist[0]
==dataset.shape[0]
or dataset.shape[1]
==1:return classlist.index[0]
# 如果是,返回類標籤
axis = bestsplit(dataset)
# 確定出當前最佳切分列的索引
bestfeat = featlist[axis]
# 獲取該索引對應的特徵
mytree =
}# 採用字典巢狀的方式儲存樹資訊
del featlist[axis]
# 刪除當前特徵
valuelist =
set(dataset.iloc[
:,axis]
)# 提取最佳切分列所有屬性值
for value in valuelist:
# 對每乙個屬性值遞迴建樹
mytree[bestfeat]
[value]
= createtree(mysplit(dataset,axis,value)
)return mytree
mytree = createtree(dataset)
#呼叫函式
mytree
執行結果
},
1:'no'
}}
id3演算法侷限主要源於區域性最優化條件,即資訊增益的計算方法,其侷限性主要有以下幾點:
1)分支度越高(分類水平越多)的離散變數往往子結點的總資訊熵更小,id3是按照某一列進行切分,有一些列的分類可能不會對結果有足夠好的指示。極端情況下取id作為切分字段,每個分類的純度都是100%,因此這樣的分類方式是沒有效益的。
2)不能直接處理連續型變量,若要使用id3處理連續型變量,則首先需要對連續變量進行離散化。
3)對缺失值較為敏感,使用id3之前需要提前對缺失值進行處理。
4)沒有剪枝的設定,容易導致過擬合,即在訓練集上表現很好,測試集上表現很差。
關於剪枝和過擬合相關問題,我們會在其後的博文中進行詳細討論,此處先討論其他侷限性如何解決。
對於id3的諸多優化措施,最終也構成了c4.5演算法的核心內容(詳見下篇博文)。
決策樹 ID3演算法
id3演算法通過計算每個屬性的資訊增益,認為資訊增益越大屬性越優,每次劃分選取資訊增益最大的屬性為劃分標準,重複這個過程,直到構成一棵決策樹。資訊熵是描述事件給我們的驚訝程度,如果所有事件的概率均等,那熵值大,驚訝程度低。如果有一事件的概率極高而其他極低,熵值便低,驚訝程度大。其計算公式如下 資訊增...
決策樹 ID3演算法
一 決策樹基本概念 在機器學習中,決策樹是乙個 模型,它代表的是物件屬性與物件值之間的一種對映關係。本質上決策樹是通 過一系列規則對資料進行分類的過程。下圖為經典決策樹例項。如圖所示,例項是由 屬性 值 對表示的 例項是用一系列固定的屬性和他們的值構成。目標函式具有離散的輸出值 上圖給每個例項賦予乙...
決策樹ID3演算法
typeerror dict keys object does not support indexing 9.typeerror dict keys object does not support indexing 這個問題是python版本的問題 如果使用的是python2 firststr my...