1. 程式人生 > >機器學習決策樹:提煉出分類器演算法

機器學習決策樹:提煉出分類器演算法

0?wx_fmt=gif&wxfrom=5&wx_lazy=1

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

,用到決策樹一般都會出現過擬合問題,因此需要對決策樹進行剪枝,闡述了常用的幾種剪枝的方法(這些方法都出現在了sklearn的決策樹建構函式的引數中),後面總結了sklearn調包分析用決策樹做分類和迴歸的幾個例子,下面通過一個簡單的例子,提煉出構建一棵分類決策樹的演算法思想,進一步體會下決策樹的分類原理。

1 資料集介紹

有一堆蘋果,現在要分析下哪些蘋果是好的,哪些是壞的,主要根據三個特徵:大小,顏色,和形狀進行區分。其中大小這個特徵的取值:大和小;顏色特徵的取值為:紅色和青色;形狀的取值有:圓形和非規則。現在拿到一批已檢驗的資料:

 編號   大小         顏色            形狀         好果

   1     大            紅色            圓形            是

   2     大            紅色            非規則         是

  3      大            紅色            圓形            是

  4      大            青色            圓形            否

   5     大            青色            非規則         否

   6     小           紅色             圓形             是

   7     大           青色             非規則         否

   8    小            紅色             非規則         否 

    9     小             青色             圓形           否 

  10小             青色             非規則       否 

2 sklearn分類結果

呼叫sklearn的API直接對上述結果分類,編寫程式碼如下:

import numpy as np

from sklearn import tree

import graphviz 

#大為1,紅為1,圓形為1, 好果為1

data = np.array([[1,1,1,1],

        [1,1,0,1],

        [1,1,1,1],

        [1,0,1,0],

        [1,0,1,0],

        [0,1,1,1],

        [1,0,0,0],

        [0,1,0,0],

        [0,0,1,0],

        [0,0,0,0]])

clf = tree.DecisionTreeClassifier()

clf.fit(data[:,0:3],data[:,3])

dot_data = tree.export_graphviz(clf, out_file=None, 

                         feature_names=["magnitude","color","shape"],  

                         class_names=["bad","good"],  

                         filled=True, rounded=True,  

                         special_characters=True)  

graph = graphviz.Source(dot_data) 

graph

得的的決策樹如下所示,根節點選擇的特徵為顏色,並且判斷條件為小於0.5,可以看出它是取值[0,1]的中間值作為不等式的判斷條件,基尼係數為0.48,也就是說魚龍混雜度還是挺大的,可以看到此時value有6個壞果>4個好果,所以這個根節點的類別被標記為壞果。

0?wx_fmt=png

接下來根據屬性的取值,分裂根節點,如果顏色是青色的,則得到一個葉節點,此時的基尼係數為0,說明得到的這類別是純的,都為壞果,樣本個數為5個。如果顏色是紅色的,得到一個非葉節點,此時的基尼係數變小了一點,說明獲得了一些資訊增益。

第二步,我們去掉一個顏色特徵,從大小和形狀中選擇一個最佳的特徵進行分裂,結果選擇形狀作為第二個分裂特徵,這個節點對應的樣本中:1個壞果,4個好果,所以此節點標記為好果,然後根據其取值:如果形狀為圓形,則獲得一個葉節點,其所有3個果子都是好果,如果形狀不規則,則

第三步,又得到一個非葉節點,它的基尼係數變為0.5,但是數量只有2個,則此時拿掉上一個用過的形狀特徵後,目前只剩下一個特徵:大小,小的為壞果,對應的樣本數為1的左葉節點,右葉節點為大的果子,則為好果。

至此,決策樹根據基尼係數判斷最佳特徵的構建過程結束。

3 提煉演算法

設資料集為T,屬性集為 A,則生成決策樹的過程可以標記為 treeBuilder(T,A):

  1. 生成節點node

  2. 如果T中樣本屬於同一類別,則將node標記為葉節點,遞迴返回

  3. 如果A為空,將其標記為葉節點,並且此葉節點的型別為T中型別做多的樣本(這種情況:應該只有一種型別了吧,如第2節的最深一層的兩個葉節點,此時的屬性都已用完,各自都只剩下自己那一類了),遞迴返回

  4. 從屬性集A中選擇最優化分屬性A*,sklearn選擇最優的劃分屬性所用的演算法是優化的CART演算法。

  5. 對A*的最優劃分屬性的幾個取值依次遍歷:

    如果  A*j(第j個取值)對應的在T中的子集合T_Sub個數大於0,則:

    A = A-A*

    遞迴呼叫 treeBuilder(T_Sub, A)

    如果 T_Sub個數等於0,我們還需要新增一個節點嗎?需要的,雖然在當前資料集上這個屬性的樣本點為空,並不代表在未來的測試集上這個屬性對應的樣本點還為空,這也是提高決策樹的泛化能力的一個方法。

將這個節點為葉節點,並且這個葉節點的型別標記為T中樣本點最多的那個型別,遞迴返回。

呼叫上述演算法後,最終得到一個以node為根節點的決策樹。

演算法說明

1. 遞迴返回的條件有3個:

  • T中樣本屬於同一類別;

  • 可用屬性為0

  • 某個特徵的第 j 個取值在T上的樣本點個數為0

2. 需要理解遞迴返回的第3個條件,為什麼訓練集上出現個數為0時,還要構造一個葉節點,這是為了提高其泛化能力,並且此葉節點的型別標記為父節點的型別,這是把父節點的樣本分佈作為當前葉節點的先驗分佈。

讓我們看一下遠邊優美的風景,放鬆一下吧!

0?wx_fmt=jpeg

4 總結

好了以上就是決策樹的用於分類的總結,關於決策樹做迴歸的問題,等以後對其更深刻地認識後再專門總結這塊吧。

您知道先驗概率和後驗概率到底是怎麼回事嗎? 貝葉斯公式是怎麼得來的? 它為什麼能做分類呢?

明天通過2個易懂的來自於生活的小例子來闡述以上問題,歡迎您的關注!

謝謝您的閱讀!

歡迎關注《演算法channel》

0?wx_fmt=jpeg

交流思想,注重分析,看重過程,包含但不限於:經典演算法,機器學習,深度學習,LeetCode 題解,Kaggle 實戰,英語沙龍,定期邀請專家發推。期待您的到來!