決策樹原理以及sklearn中決策樹的參數詳解

開篇

決策樹(Decision Tree)是最流行的機器學習算法之一。決策樹可以解決分類(classification)迴歸分析(Regression)的問題。sklearn中可以僅僅使用幾行代碼就可以完成決策樹的建立。但是,這對於真正想從事機器學習的朋友們是不夠的。這一講,我們就著重來詳解一下決策樹。

決策樹的優勢

我們知道機器學習中有很多的模型算法,為什麼決策樹可以長盛不衰?它到底有什麼優勢?這是我們學習決策樹的基礎。

決策樹原理以及sklearn中決策樹的參數詳解

決策樹

一起先來看一個決策樹的實例。決策樹的邏輯更加接近於人類判斷的邏輯。比較好理解。邏輯樹模型的判斷邏輯非常清晰,且可視化,如上圖。在判斷泰坦尼克號上倖存人員的時候,通過決策樹應該怎麼做呢?

首先,我們判斷性別是否是男性:是(Yes)或者否(No);

如果是男性,判斷年齡是否大於9.5;

如果是女性,則此人是存活(Survived)。。。

決策樹每一個判斷都是一個問題,而答案的不同則會長出不同的樹枝。我們可以看出決策樹整個的邏輯非常的清晰和簡單。

什麼是決策樹?

數據挖掘和機器學習中的決策樹訓練,使用決策樹作為預測模型來預測樣本的類標。這種決策樹也稱作分類樹迴歸樹。在這些樹的結構裡, 葉子節點給出類標而內部節點代表某個屬性。

在決策分析中,一棵決策樹可以明確地表達決策的過程。在數據挖掘中,一棵決策樹表達的是數據而不是決策。本頁的決策樹是數據挖掘中的決策樹。 -----維基百科

決策樹原理以及sklearn中決策樹的參數詳解

數據

假設我們拿到的數據如上,第一步是分析數據的特徵變量(Feature)有哪些?上圖中,特徵變量就有 天氣(outlook)、溫度(temp.)、溼度(humidity)、有風(windy)和是否出遊(play)。

從決策樹中,所有的判斷都是從決策樹的根部節點開始,慢慢的一步一步的生出中間的過渡節點,最後長出葉子(leaf node)並形成判斷並且可以用來預測。

那問題來了,每個節點都對應一個特徵變量,那我們該怎麼選擇最重要的特徵變量作為根節點呢?

創建決策樹

現在有很多辦法篩選特徵變量,但是最常用的兩種方法是:CART(Classification and Regression Trees) 和 ID3 (Iterative Dichotomiser 3)。CART方法是以Gini 指數為基準,而ID3是以熵變函數作為基準。

具體的公式可以直接參看維基百科:

決策樹原理以及sklearn中決策樹的參數詳解

CART方法

決策樹原理以及sklearn中決策樹的參數詳解

ID3方法

公式是需要例子去消化並記憶的。下面,我們一起來通過這兩種方法篩選出最重要的特徵變量吧。

使用ID3方法:

在ID3方法中,我們需要計算每個特徵變量的熵。下面就是公式。

決策樹原理以及sklearn中決策樹的參數詳解

分別計算每一個特徵變量的熵,我們拿有風與否(windy)舉例:

首先,我們要算一下play(yes或者no)的總熵:

在14行數據中,有9行數據play顯示為yes,另外5行play顯示為no

那麼,

E(yes) = -(9/14) * ln(9/14) = 0.41

E(no) = -(5/14) * ln(5/14) = 0.53

H(S) = E(yes) + E(no) = 0.41 + 0.53 = 0.94

決策樹原理以及sklearn中決策樹的參數詳解

當windy是false的時候,有6行數據顯示play為yes,還有2行數據顯示play為no。

當windy是true的時候,有3行數據顯示play為yes,還有3行數據顯示play為no。

E(windy = false) = -6/8 * log(6/8) - 2/8 * log(2/8) = 0.811

E(windy = true) = -3/6 * log(3/6) - 3/6 * log(3/6) = 1

總共有14行數據,那麼,當選擇windy的時候,熵的平均值使用加權平均數即可得:

I(windy)= 8/14 * 0.811 + 6/14 * 1 = 0.892

我們得到了H(S)和信息值 I(windy),那麼選擇windy帶來的信息增益是多少呢?

Gain(windy) = H(S) - I(windy) = 0.94 - 0.892 = 0.048

我們需要計算所有特徵變量的 信息增益,從中選取信息增益最大的 特徵變量,則是根節點。當我們之後選擇過渡節點的時候,同樣重複上述過程即可。

最後的決策樹如下圖所示:

決策樹原理以及sklearn中決策樹的參數詳解

決策樹

CART方法

同樣的,我們拿windy作為示範:

當windy是false的時候,有6行數據顯示play為yes,還有2行數據顯示play為no。

p(windy-false,play-yes)= 6/8

p(windy-false,play-no)= 2/8

Gini(windy-false) = 1 - p(windy-false,play-yes)^2 - p(windy-false,play-no)^2

= 1 - (6/8)^2 - (2/8)^2 = 3/5

當windy是true的時候,有3行數據顯示play為yes,還有3行數據顯示play為no。

p(windy-true,play-yes)= 3/6

p(windy-true,play-no)= 3/6

Gini(windy-true) = 1 - p(windy-true,play-yes)^2 - p(windy-true,play-no)^2

= 1 - (3/6)^2 - (3/6)^2 = 1/2

那麼,當選擇windy時,平均Gini值為:

Gini(windy)= 8/14 * 3/5 + 6/14 * 1/2 = 0.557

Gini值與之前算的信息增益有所不同,Gini值越小,證明模型越好。

python 機器學習包Sklearn中如何實現決策樹

決策樹原理以及sklearn中決策樹的參數詳解

sklearn

sklearn中引入tree模塊,通過tree.DecisionTreeClassifier() 就可以創建一個決策樹。

clf = clf.fit(X_train, Y_train) 通過fit函數就可以實現決策樹模型的訓練了。

然而在決策樹中,可以定義很多參數。如上圖所示。我們一個一個的過一遍這些參數。

  • criterion: string類型,可選(默認為"gini"):衡量分類的質量。支持的標準有"gini"代表的是Gini impurity(不純度)與"entropy"代表的是information gain(信息增益)。
  • splitter: string類型,可選(默認為"best"):在節點中選擇分類的策略。支持的策略有"best",選擇最好的分類,"random"選擇最好的隨機分類。
  • max_features: int,float,string or None 可選(默認為None)在進行分類時需要考慮的特徵數。1.如果是int,在每次分類是都要考慮max_features個特徵。2.如果是float,那麼max_fea
  • max_depth: int or None,可選(默認為"None")表示樹的最大深度。如果是"None",則節點會一直擴展直到所有的葉子都是純的或者所有的葉子節點都包含少於min_samples_split個樣本點。忽視max_leaf_nodes是不是為None。
  • min_samples_split: int,float,可選(默認為2):區分一個內部節點需要的最少的樣本數。
  • min_samples_leaf: int,float,可選(默認為1):一個葉節點所需要的最小樣本數:
  • min_weight_fraction_leaf: float,可選(默認為0): 一個葉節點的輸入樣本所需要的最小的加權分數。
  • max_leaf_nodes: int,None 可選(默認為None):在最優方法中使用max_leaf_nodes構建一個樹。最好的節點是在雜質相對減少。如果是None則對葉節點的數目沒有限制。如果不是None則不考慮max_depth.
  • class_weight: dict,list of dicts,"Banlanced" or None,可選(默認為None): 表示在表{class_label:weight}中的類的關聯權值。如果沒有指定,所有類的權值都為1。對於多輸出問題,一列字典的順序可以與一列y的次序相同。 "balanced"模型使用y的值去自動適應權值,並且是以輸入數據中類的頻率的反比例。
  • random_state: int,RandomState instance or None: 如果是int,random_state 是隨機數字發生器的種子;如果是RandomState,random_state是隨機數字發生器,如果是None,隨機數字發生器是np.random使用的RandomState instance.
  • persort: bool,可選(默認為False):是否預分類數據以加速訓練時最好分類的查找。在有大數據集的決策樹中,如果設為true可能會減慢訓練的過程。當使用一個小數據集或者一個深度受限的決策樹中,可以減速訓練的過程。

總結

現在,python中關於機器學習的包有很多,這大大方便了我們的使用。但同時也助長了我們的惰性。不求原理,只求輸入幾行代碼出結果就行。

逃學博士會慢慢地將機器學習的常用算法原理過一遍。謝謝大家耐心的看完。


分享到:


相關文章: