《python資料分析和資料探勘》——ID3決策樹學習筆記
ID3決策樹
決策樹在分類預測和規則提取中有著廣泛的應用。他是一樹狀結構,每一個節點對應著一個分類,非葉節點對應著在某個屬性上的劃分,根據樣本在該屬性上的不同取值將其劃分成若干個子集。構造決策樹的核心問題就是如何選擇適當的屬性對樣本進行拆分。
基本原理
————————希望自己能用最通俗的語言講清楚————————
選擇當前樣本集中具有最大資訊增益值的屬性作為測試屬性。樣本集的劃分則根據測試屬性的取值進行,測試屬性有多少不同取值,就將樣本集劃分為多少子樣本集,同時決策樹上相應於該樣本集的節點生成新子節點。ID3決策演算法根據資訊增益值度量不確定性:資訊增益值越大,不確定性越小。因此每個非葉節點選擇資訊增益最大的屬性作為測試屬性,從而得到較小的決策樹。
劃線部分就是重點很好理解:“好”和“壞”是某測試屬性中的不同取值,那麼就可以分成“好”樣本和“壞”樣本兩個子樣本集合。
1、 總資訊熵:
一串資料他有很多屬性,我們可以分為兩種。一種是特徵屬性(測試屬性),我們認為是自變數;一種是結果屬性(類別屬性),我們認為是因變數。那麼決策樹要實現的分類就是根據自變數的層層規則,得到因變數的結果。基於此,我們需要確定總資訊熵。總資訊又是啥?就是我們需要得到的結果屬性,或者最終的類別屬性。
那麼s個數據樣本構成的集合S,如果他的類別屬性有m個不同的值:Ci(i=1,2,…,m),如優/良/中/差。那麼統計s個樣本中“優”佔多少個,又有多大P1概率。其他依次可得P2,P3,…,Pm。咱們用專業的話總結一遍就是:
對於一個給定的樣本,根據類別屬性,總資訊熵為
其中Pi表示樣本中屬於Ci的概率,用si/s估計。
2、 劃分樣本的資訊熵:
劃分樣本我們知道可以根據結果類別屬性和特徵屬性分,顯然類別屬性我們已經動刀子了,我們就該對特徵屬性下手了,但是特徵屬性+類別屬性結合著地“雙管齊下”。
那麼s個數據樣本構成的集合S,我們只看他的某一特徵屬性A,它具有k個不同的值:{a1,a2,…,ak}如“是”,“否”,根據k個不同的值我們又可以劃分成k個集合{s1,s2,…,sk},其中sj包含了集合S中屬性A取aj值的樣本,如“是”集合,“否”集合。這個屬性就可以成為一個新的子節點。
針對屬性A所代表的子節點,對其劃分的子集合進行類別屬性的劃分。如對“是”集合中的“優”“良”“差”進行統計,對應又分別佔多大概率,得到“是”集合的資訊熵,同理得到“否”集合的資訊熵,根據“是”“否”集合所佔總集合的比例,綜合得到屬性A的資訊熵。說到底就是貝葉斯條件概率的應用。用專業的話講,根據屬性A劃分樣本的資訊熵值為
其中sij是子集Sj類別為Ci的樣本數,是子集Sj中類別為Ci的樣本的概率。
3、 屬性A劃分樣本集S後得到的資訊增益為:
顯然E(A)越小,Gain(A)的值越大,說明選擇測試屬性A對於分類提供的資訊越大,選擇A之後對分類不確定程度越小,屬性A的k個不同的值對應樣本集S的k個子集或分支,通過遞迴呼叫上述過程(不包括已經選擇的屬性),生成其他屬性作為節點的子節點和分支來生成整個決策樹。
————————舉個栗子講清楚————————
以公司銷量為例,要求構造模型來分析天氣、是否週末和是否有促銷活動對銷量的影響。天氣:好/壞,週末:是/否,促銷:是/否—→銷量:高/低。
即銷量為類別結果屬性,其他為測試特徵屬性。
採用ID3決策演算法建立模型步驟如下:(資料未貼出)
1.計算總資訊熵。其中資料總記錄34,而銷量作為結果屬性“高”資料有18個。“低”有16個。所以
2.計算每個測試屬性的資訊熵。
對於“天氣”屬性,屬性值有“好”和“壞”兩種,其中天氣“好”條件下,銷量為“高”的記錄為11,銷售數量為“低”的記錄為6,可表示為(11,6);其中天氣“壞”條件下,銷量為“高”的記錄為7,銷售數量為“低”的記錄為10,可表示為(7,10)。則天氣屬性的資訊熵為
對於“是否週末”屬性,屬性值有“是”和“否”兩種,其中週末“是”條件下,銷量為“高”的記錄為11,銷售數量為“低”的記錄為3,可表示為(11,3);其中週末“否”條件下,銷量為“高”的記錄為7,銷售數量為“低”的記錄為13,可表示為(7,13)。則是否週末屬性的資訊熵為
對於“是否促銷”屬性,屬性值有“是”和“否”兩種,其中促銷“是”條件下,銷量為“高”的記錄為15,銷售數量為“低”的記錄為7,可表示為(15,7);其中促銷“否”條件下,銷量為“高”的記錄為3,銷售數量為“低”的記錄為9,可表示為(3,9)。則是否促銷屬性的資訊熵為
3.計算每個測試屬性的資訊增益值
4. 選擇資訊增益值最大的特徵屬性作為第一個樹節點,他的屬性值就作為根節點的兩個分支,然後分別針對兩個分支節點進行新的資訊增益計算,迭代反覆?更應該是遞迴呼叫,直至沒有新的節點分支,最終構成一個決策樹,如下所示。
依次選擇leftroot,rightroot做尾遞迴邏輯,同時每次遞迴刪去已經作為樹根節點的屬性,避免重複浪費資源。
根據上面可以寫出分類規則。
總結:首先根據類別屬性計算總資訊熵;然後在不同測試屬性值條件下,計算類別屬性的資訊熵,並根據分佈概率的權和得到測試屬性的資訊熵,最後總資訊熵減去測試屬性的資訊熵,得到測試屬性的資訊增益,並取最大。並最後刪去該最大屬性(不作為統計條件擱置在一旁),根據該方法遞迴得到左右分支節點對應的屬性。
由於ID3決策樹演算法採用了資訊增益作為選擇測試屬性的標準,會偏向於選擇取值較多的,即所謂高度分支屬性,而這類屬性不一定最優。同時ID3決策樹演算法智慧處理離散屬性,對於連續屬性,分類前應進行離散化。
為了解決選擇高度分支屬性的問題,人們採用資訊增益作為選擇測試屬性的標準,這樣便得到C4.5決策樹模型。此外常用的決策樹演算法還有CART演算法、SLIQ演算法、SPRINT演算法和PUBLIC演算法等。
程式碼:
#使用ID3決策樹演算法預測銷量高低
#演算法初始化
filename='data/sales_data.xls'
data=pd.read_excel(filename,index_col=u'序號')#匯入資料
#資料是類別標籤,要把它轉換成資料
#用1代表“好”“是”“高”這三個屬性,用-1代表“壞”“否”“低”
data[data==u'好']=1
data[data==u'是']=1
data[data==u'高']=1
data[data!=1]=-1
x=data.iloc[:,:3].as_matrix().astype(int)
y=data.iloc[:,3].as_matrix().astype(int)
from sklearn.tree import DecisionTreeClassifier as DTC
dtc=DTC(criterion='entropy')#建立決策樹模型,基於資訊熵
dtc.fit(x,y)#訓練模型
#匯入相關函式,視覺化決策樹
#匯出的結果是一個dot檔案,需要安裝Graphviz才能把它轉換成pdf或者png格式
from sklearn.tree import export_graphviz
from sklearn.externals.six import StringIO
with open("tree.dot",'w') as f:
f=export_graphviz(dtc,feature_names=x.columns,out_file=f)