Scikit Learn - 決策樹



本章將學習 Sklearn 中稱為決策樹的學習方法。

決策樹 (DTs) 是最強大的非引數監督學習方法。它們可用於分類和迴歸任務。DTs 的主要目標是透過學習從資料特徵推匯出的簡單決策規則來建立一個預測目標變數值的模型。決策樹有兩個主要組成部分:一個是根節點,資料在此處分割;另一個是決策節點或葉子節點,我們在此處獲得最終輸出。

決策樹演算法

下面解釋了不同的決策樹演算法:

ID3

它由 Ross Quinlan 於 1986 年開發。它也稱為迭代二分器 3。該演算法的主要目標是為每個節點找到那些分類特徵,這些特徵將為分類目標產生最大的資訊增益。

它允許樹增長到最大大小,然後為了提高樹在未見資料上的能力,應用修剪步驟。此演算法的輸出將是一個多路樹。

C4.5

它是 ID3 的後繼者,它動態地定義一個離散屬性,該屬性將連續屬性值劃分為一組離散區間。這就是它消除了分類特徵限制的原因。它將 ID3 訓練的樹轉換為一組“IF-THEN”規則。

為了確定應用這些規則的順序,將首先評估每個規則的準確性。

C5.0

它的工作方式與 C4.5 類似,但它使用更少的記憶體並構建更小的規則集。它比 C4.5 更準確。

CART

它被稱為分類與迴歸樹演算法。它基本上透過使用特徵和閾值來生成二元分割,在每個節點產生最大的資訊增益(稱為基尼指數)。

同質性取決於基尼指數,基尼指數的值越高,同質性就越高。它類似於 C4.5 演算法,但不同之處在於它不計算規則集,也不支援數值目標變數(迴歸)。

決策樹分類

在這種情況下,決策變數是分類變數。

Sklearn 模組 - Scikit-learn 庫提供了名為 DecisionTreeClassifier 的模組,用於對資料集執行多類分類。

引數

下表包含 sklearn.tree.DecisionTreeClassifier 模組使用的引數:

序號 引數及說明
1

criterion − 字串,可選,預設值 = “gini”

它表示用於衡量分割質量的函式。支援的標準是“gini”和“entropy”。預設值為 gini,用於基尼不純度,而 entropy 用於資訊增益。

2

splitter − 字串,可選,預設值 = “best”

它告訴模型,在每個節點選擇分割時,要從“best”或“random”中選擇哪種策略。

3

max_depth − 整數或 None,可選,預設值 = None

此引數決定樹的最大深度。預設值為 None,這意味著節點將擴充套件到所有葉子都是純的,或者直到所有葉子包含少於 min_smaples_split 樣本。

4

min_samples_split − 整數,浮點數,可選,預設值 = 2

此引數提供拆分內部節點所需的最小樣本數。

5

min_samples_leaf − 整數,浮點數,可選,預設值 = 1

此引數提供葉節點所需的最小樣本數。

6

min_weight_fraction_leaf − 浮點數,可選,預設值 = 0.

使用此引數,模型將獲得葉節點所需的權重總和的最小加權分數。

7

max_features − 整數,浮點數,字串或 None,可選,預設值 = None

它為模型提供在尋找最佳分割時要考慮的特徵數量。

8

random_state − 整數,RandomState 例項或 None,可選,預設值 = none

此引數表示在洗牌資料時使用的偽隨機數生成的種子。選項如下:

  • 整數 - 在這種情況下,random_state 是隨機數生成器使用的種子。

  • RandomState 例項 - 在這種情況下,random_state 是隨機數生成器。

  • None - 在這種情況下,隨機數生成器是 np.random 使用的 RandonState 例項。

9

max_leaf_nodes − 整數或 None,可選,預設值 = None

此引數將以最佳優先方式種植具有 max_leaf_nodes 的樹。預設值為 none,這意味著將有無限數量的葉節點。

10

min_impurity_decrease − 浮點數,可選,預設值 = 0.

此值用作節點分割的標準,因為如果此分割引起的雜質減少大於或等於 min_impurity_decrease 值,則模型將分割節點。

11

min_impurity_split − 浮點數,預設值 = 1e-7

它表示樹增長中提前停止的閾值。

12

class_weight − 字典,字典列表,“balanced”或 None,預設值 = None

它表示與類關聯的權重。形式為 {class_label: weight}。如果我們使用預設選項,則表示所有類都應該具有權重 1。另一方面,如果選擇 class_weight: balanced,它將使用 y 的值來自動調整權重。

13

presort − 布林值,可選,預設值 = False

它告訴模型是否預先對資料進行排序以加快擬合過程中最佳分割的查詢速度。預設值為 false,但如果設定為 true,則可能會減慢訓練過程。

屬性

下表包含 sklearn.tree.DecisionTreeClassifier 模組使用的屬性:

序號 引數及說明
1

feature_importances_ − 形狀為 =[n_features] 的陣列

此屬性將返回特徵重要性。

2

classes_: − 形狀為 = [n_classes] 的陣列或此類陣列的列表

它表示類標籤,即單輸出問題,或類標籤陣列列表,即多輸出問題。

3

max_features_ − 整數

它表示 max_features 引數的推斷值。

4

n_classes_ − 整數或列表

它表示類的數量,即單輸出問題,或每個輸出的類數量列表,即多輸出問題。

5

n_features_ − 整數

執行 fit() 方法時,它給出特徵的數量。

6

n_outputs_ − 整數

執行 fit() 方法時,它給出輸出的數量。

方法

下表包含 sklearn.tree.DecisionTreeClassifier 模組使用的方法:

序號 引數及說明
1

apply(self, X[, check_input])

此方法將返回葉子的索引。

2

decision_path(self, X[, check_input])

顧名思義,此方法將返回樹中的決策路徑。

3

fit(self, X, y[, sample_weight, …])

fit() 方法將根據給定的訓練集 (X, y) 構建決策樹分類器。

4

get_depth(self)

顧名思義,此方法將返回決策樹的深度。

5

get_n_leaves(self)

顧名思義,此方法將返回決策樹的葉子數。

6

get_params(self[, deep])

我們可以使用此方法獲取估計器的引數。

7

predict(self, X[, check_input])

它將預測 X 的類值。

8

predict_log_proba(self, X)

它將預測我們提供的輸入樣本 X 的類對數機率。

9

predict_proba(self, X[, check_input])

它將預測我們提供的輸入樣本 X 的類機率。

10

score(self, X, y[, sample_weight])

顧名思義,score() 方法將返回給定測試資料和標籤上的平均準確率。

11

set_params(self, \*\*params)

我們可以使用此方法設定估計器的引數。

實現示例

下面的 Python 指令碼將使用 sklearn.tree.DecisionTreeClassifier 模組構建一個分類器,用於根據我們的資料集預測男性或女性,該資料集具有 25 個樣本和兩個特徵,即“身高”和“頭髮長度”:

from sklearn import tree
from sklearn.model_selection import train_test_split
X=[[165,19],[175,32],[136,35],[174,65],[141,28],[176,15]
,[131,32],[166,6],[128,32],[179,10],[136,34],[186,2],[12
6,25],[176,28],[112,38],[169,9],[171,36],[116,25],[196,2
5], [196,38], [126,40], [197,20], [150,25], [140,32],[136,35]]
Y=['Man','Woman','Woman','Man','Woman','Man','Woman','Ma
n','Woman','Man','Woman','Man','Woman','Woman','Woman','
Man','Woman','Woman','Man', 'Woman', 'Woman', 'Man', 'Man', 'Woman', 'Woman']
data_feature_names = ['height','length of hair']
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size = 0.3, random_state = 1)
DTclf = tree.DecisionTreeClassifier()
DTclf = clf.fit(X,Y)
prediction = DTclf.predict([[135,29]])
print(prediction)

輸出

['Woman']

我們還可以透過使用以下 python predict_proba() 方法來預測每個類的機率:

示例

prediction = DTclf.predict_proba([[135,29]])
print(prediction)

輸出

[[0. 1.]]

決策樹迴歸

在這種情況下,決策變數是連續的。

Sklearn 模組 - Scikit-learn 庫提供了名為 DecisionTreeRegressor 的模組,用於將決策樹應用於迴歸問題。

引數

DecisionTreeRegressor 使用的引數與 DecisionTreeClassifier 模組中使用的引數幾乎相同。不同之處在於“criterion”引數。對於 DecisionTreeRegressor 模組,‘criterion: 字串,可選,預設值 = “mse”’ 引數具有以下值:

  • mse − 它代表均方誤差。它等於方差減少作為特徵選擇標準。它使用每個終端節點的平均值來最小化 L2 損失。

  • freidman_mse − 它也使用均方誤差,但使用 Friedman 的改進分數。

  • mae − 它代表平均絕對誤差。它使用每個終端節點的中位數來最小化 L1 損失。

另一個區別是它沒有 ‘class_weight’ 引數。

屬性

DecisionTreeRegressor 的屬性也與 DecisionTreeClassifier 模組的屬性相同。不同之處在於它沒有 ‘classes_’‘n_classes_’ 屬性。

方法

DecisionTreeRegressor 的方法也與 DecisionTreeClassifier 模組的方法相同。不同之處在於它沒有 ‘predict_log_proba()’‘predict_proba()’ 屬性。

實現示例

決策樹迴歸模型中的 fit() 方法將採用 y 的浮點值。讓我們透過使用 Sklearn.tree.DecisionTreeRegressor 來檢視一個簡單的實現示例:

from sklearn import tree
X = [[1, 1], [5, 5]]
y = [0.1, 1.5]
DTreg = tree.DecisionTreeRegressor()
DTreg = clf.fit(X, y)

擬合後,我們可以使用此迴歸模型進行預測:

DTreg.predict([[4, 5]])

輸出

array([1.5])
廣告