機器學習實戰——3決策樹
文章對應《機器學習實戰》第三章
主要是對各個函式的功能進行了比較易懂的描述,可供python初學者參考。另外推薦機器學習實戰程式碼註釋,對在本書中入門python的同學應有很大幫助。
//計算給定資料集的夏農熵
def calcShannonEnt(dataSet):
dataSet = [[1, 1, 'yes'],[1, 1, 'yes'],[1, 0, 'no'],[0, 1, 'no'],[0, 1, 'no']]
算出dataset中樣本數量為5,新建字典A,按照dataset中最後一列的取值分類,累加出現次數
A[yes]=2,A[no]=3.根據熵計算公式將各個類別迭代求解
//劃分資料集
def splitDataSet(dataSet, axis, value):
按照axis軸特徵取值將dataSet分類,分類結果只保留特徵值為value的項
若dataSet = [[1, 1, 'yes'],[1, 1, 'yes'],[1, 0, 'no'],[0, 1, 'no'],[0, 1, 'no']]
axis=0,value=1,則保留前三項,且捨去分類用特徵值,返回結果[[1, 'yes'],[1, 'yes'],[0, 'no']]
//選擇最好的資料集劃分方式
def chooseBestFeatureToSplit(dataSet):
初始化熵,外層迴圈遍歷資料集的所有特徵值以得到最優劃分(最大的資訊增益);內層迴圈根據當前特徵值i劃分資料集並求資訊增益。
資訊增益:假設劃分前樣本資料集為S,並用屬性A來劃分樣本集S,則按屬性A劃分S的資訊增益Gain(S,A)為樣本集S的熵減去按屬性A劃分S後的樣本子集的熵即
資料集S按照特徵A劃分後得到n個子集,求出各個子集熵並乘本子集權重,其和即為劃分後的熵
//計算出現次數最多類別
def majorityCnt(classList):
輸入為分類值['yes','yes','yes','no','no'],同求熵一樣,建立字典A統計出現次數:A={'yes':3,'no':2}
按出現次數降序排序,返回A[0][0]=yes(另:A[0][1]=3)
//建立樹的函式程式碼
def createTree(dataSet,labels):
此遞迴函式有兩個退出條件:
1.資料集中分類均為yes或no,即都為同類
2.用於分類的特徵均已使用,沒有可再繼續分類的依據,返回出現次數最多的類別
計算資訊增益最大的劃分特徵,建立字典,將這個特徵作為決策樹原始根節點。
由於接下來將劃分資料集,刪去用於劃分的特徵,為了保證對應性在labels中刪去最優特徵標籤
for迴圈遞迴建立決策樹
迴圈變數value為最優劃分特徵的取值,如dataSet = [[1, 1, 'yes'],[1, 1, 'yes'],[1, 0, 'no'],[0, 1, 'no'],[0, 1, 'no']],若最優劃分特徵為0,即按照第0個元素劃分,則value取值為1和0,使splitDataSet(dataSet, axis, value)能夠得到所有的劃分子集,後續的遞迴則在各個子集上進行.