1. 程式人生 > >決策樹算法(五)——處理一些特殊的分類

決策樹算法(五)——處理一些特殊的分類

字典 如果 span items 分類 lis 函數 可能 一個

在之前的決策樹算法中我們已經講解了從數據集構造決策樹算法的功能模塊。

首先是創建數據集,然後計算香農熵,然後基於最好的屬性值劃分數據集,由於特征值可能多於兩個,因此可能存在大於兩個分支的數據集劃分。第一次劃分好之後,數據將被向下傳遞到樹分支的一個節點,在這個節點上我們可以再次劃分數據,所以我們可以采用遞歸的原則處理數據集。

遞歸的結束條件是:遍歷完所有劃分的數據集的屬性,或者每個分支下的所有實例都具有相同的分類。如果所有實例具有相同的分類,則得到一格葉子節點或者終止塊。

根據特征來劃分屬性,我們知道每劃分一次分類就會消耗一格特征值,如果我們使用完所有的特征但是類別還沒有劃分完那麽我們就采用多數表決的方法來確定葉子節點。

比如說我們使用完所有的特征值之後劃分,得到的最後的數據集是下面這個樣子的:
[[‘yes’],[‘yes’],[‘maybe’]]

但是我們現在已經沒有特征值了,那麽我們就不能用計算香農熵的方法計算最大信息增益,這個時候就用投票表決的方式來分類。

那麽我們發現 我們的數據集中 ‘yes’是兩個,’maybe’是一個那麽我們就按照這個來把它們分開。
下面我們來完成代碼:

def majorityCnt(classList): # 傳入的參數是已經劃分完所有特征之後剩余的數據集,
#例如[[‘yes‘],[‘yes‘],[‘maybe‘]]
    classCount={} #參數是已經劃分完所有特征之後剩余的數據集,
    #例如[[‘yes‘],[‘yes‘],[‘maybe‘]]
    classCount={} #創建一個字典
    for vote in classList:  
        if vote not in classCount.keys():
            classCount[vote] = 0
        classCount[vote] += 1
        # 根據上述的語句,以及我們的例子,我們最終可以得到的結果如下: {‘yes‘:2,‘maybe‘:1}
        sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1),reverse=True)#這個語句比較復雜,我們在下面詳細講解一下。
# 使用字典iteritems
    return sortedClassCount[0][0]

下面我們來分析在這段代碼中比較復雜的代碼:

sorted(classCount.iteritems(), key=operator.itemgetter(1),reverse=True)

在這裏我們使用iteritems()這個函數得到我們字典中的所有元素,就是一組一組的鍵-值對。
之後我們定義一個叫做key的函數,這個名字可以任意取,大家都是這麽定義的,之後我們通過itemgetter這個函數對我們字典中的元素進行排序。operator.itemgetter(1)表示按照元素的第二個進行排序,也就是分類出現的多少。我們的字典每一個元素都有兩部分組成,也就是按照值來排序,reverse=True 表示按照遞減的順序來排序。


sortedClassCount[0][0] 表示的是按照分類的個數最多的元素的那個類。

總結

對於一些已經使用完所有特征的數據集,我們任然不能清楚的把一些類分離出來,我們就統計數量最多的那個分類,以次劃分。



要麽就不做,要做就做最好。

決策樹算法(五)——處理一些特殊的分類