機器學習決策樹:提煉出分類器演算法
,用到決策樹一般都會出現過擬合問題,因此需要對決策樹進行剪枝,闡述了常用的幾種剪枝的方法(這些方法都出現在了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,說明得到的這類別是純的,都為壞果,樣本個數為5個。如果顏色是紅色的,得到一個非葉節點,此時的基尼係數變小了一點,說明獲得了一些資訊增益。
第二步,我們去掉一個顏色特徵,從大小和形狀中選擇一個最佳的特徵進行分裂,結果選擇形狀作為第二個分裂特徵,這個節點對應的樣本中:1個壞果,4個好果,所以此節點標記為好果,然後根據其取值:如果形狀為圓形,則獲得一個葉節點,其所有3個果子都是好果,如果形狀不規則,則
第三步,又得到一個非葉節點,它的基尼係數變為0.5,但是數量只有2個,則此時拿掉上一個用過的形狀特徵後,目前只剩下一個特徵:大小,小的為壞果,對應的樣本數為1的左葉節點,右葉節點為大的果子,則為好果。
至此,決策樹根據基尼係數判斷最佳特徵的構建過程結束。
3 提煉演算法設資料集為T,屬性集為 A,則生成決策樹的過程可以標記為 treeBuilder(T,A):
-
生成節點node
-
如果T中樣本屬於同一類別,則將node標記為葉節點,遞迴返回。
-
如果A為空,將其標記為葉節點,並且此葉節點的型別為T中型別做多的樣本(這種情況:應該只有一種型別了吧,如第2節的最深一層的兩個葉節點,此時的屬性都已用完,各自都只剩下自己那一類了),遞迴返回。
-
從屬性集A中選擇最優化分屬性A*,sklearn選擇最優的劃分屬性所用的演算法是優化的CART演算法。
-
對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時,還要構造一個葉節點,這是為了提高其泛化能力,並且此葉節點的型別標記為父節點的型別,這是把父節點的樣本分佈作為當前葉節點的先驗分佈。
讓我們看一下遠邊優美的風景,放鬆一下吧!
4 總結好了以上就是決策樹的用於分類的總結,關於決策樹做迴歸的問題,等以後對其更深刻地認識後再專門總結這塊吧。
您知道先驗概率和後驗概率到底是怎麼回事嗎? 貝葉斯公式是怎麼得來的? 它為什麼能做分類呢?
明天通過2個易懂的來自於生活的小例子來闡述以上問題,歡迎您的關注!
謝謝您的閱讀!
歡迎關注《演算法channel》
交流思想,注重分析,看重過程,包含但不限於:經典演算法,機器學習,深度學習,LeetCode 題解,Kaggle 實戰,英語沙龍,定期邀請專家發推。期待您的到來!