機器學習6:決策樹相關的概念

先補充一個物理概念

Entropy: 度量事物的不確定性,不確定性越高,熵就越大,反之越確定,熵越小;

隨機事件(多類別)的熵可以表示爲:

entropy=p1log2(p1)p2log2(p2)...pnlog2(pn)=i=1npilog2(pi) entropy = -p_1log_2{(p1)} - p_2log_2(p2) - ... - p_nlog_2(p_n) = -\sum_{i=1}^n p_ilog_2(p_i)

信息增益:

父結點的熵與子結點上的平均值之間的差值;

在這裏插入圖片描述

1.決策樹算法原理:

信息增益最大化: 每步決策都選擇信息增益最大的特徵,作爲當前分類特徵依據

import numpy as np
def two_group_ent(first, tot):                        
    return -(first/tot*np.log2(first/tot) + (tot-first)/tot*np.log2((tot-first)/tot))

tot_ent = two_group_ent(10, 24)                       
g_feature_17_ent = 15/24 * two_group_ent(11,15) + 9/24 * two_group_ent(6,9)                  

answer = tot_ent - g17_ent  

print(answer)
0.11260735516748954

2.決策樹的超參數

爲了創建泛化能力好的決策樹,我們可以調優決策樹的多個方面。我們把決策樹的這些可調優的多個方面稱爲“超參數”。以下是決策樹中使用的一些最重要的超參數。

2.1最大深度

決策樹的最大深度就是從根到葉之間可能的最大長度。一個最大深度爲 k 的決策樹最多有2k2^k 個葉子。

2.2最少樣本分割數

一個節點必須至少有min_samples_split個樣本才能足夠大以進行拆分。如果一個節點的樣本數少於 min_samples_split 個, 則分割過程停止,該節點不會被分割。

在這裏插入圖片描述

然而 min_samples_split 不會控制葉的最小尺寸。正如你在上面右邊的示例中看到的,父節點有20個樣本,大於min_samples_split = 11,因此這個節點被拆分。但在此節點被拆分後,有一個子節點的樣本數爲5,小於min_samples_split = 11。

2.3每片葉子的最小樣本數

當分割一個節點時,可能會遇到的一個問題是分割不均勻,例如某個子節點有99個樣本,另一個子節點可能只有1個樣本。這會影響決策樹的生成,也浪費計算資源和時間。爲避免這種情況,我們可以爲每個葉子上允許的樣本數設置一個最小值。

2.4每次分裂的最小樣本數

這個參數與每片葉子上的最小樣本樹相同,只不過是應用在節點的分裂當中。

2.5最大特徵數

有時,我們會遇到特徵數量過於龐大,而無法建立決策樹的情況。在這種狀況下,對於每一個分裂,我們都需要檢查整個數據集中的每一個特徵。這種過程極爲繁瑣。而解決方案之一是限制每個分裂中查找的特徵數。如果這個數字足夠龐大,我們很有可能在查找的特徵中找到良好特徵(儘管也許並不是完美特徵)。然而,如果這個數字小於特徵數,這將極大加快我們的計算速度。

在這裏插入圖片描述

3.sklearn 中的決策樹

對於決策樹模型,你將使用 scikit-learn 的 Decision Tree Classifier 類。該類提供了定義模型並將模型與數據進行擬合的函數。

from sklearn.tree import DecisionTreeClassifier
model = DecisionTreeClassifier()
model.fit(x_values, y_values)
print(model.predict([ [0.2, 0.8], [0.5, 0.4] ]))

可設置超參數

當我們定義模型時,可以指定超參數。在實踐中,最常見的超參數包括:

max_depth:樹中的最大層級數量。

min_samples_leaf:葉子允許的最低樣本數量。

min_samples_split:拆分內部節點所需的最低樣本數量。

max_features:尋找最佳拆分方法時要考慮的特徵數量。

例如,在此例中,我們定義了一個模型:樹的最大深度 max_depth 爲7,每個葉子的最低元素數量 min_samples_leaf 是 10。

model = DecisionTreeClassifier(max_depth = 7, min_samples_leaf = 10)

構建決策樹步驟:

1.構建決策樹模型

使用 scikit-learn 的 DecisionTree 類構建決策樹分類模型,並將其賦值給變量 model。

2.將模型與數據進行擬合

你不需要指定任何超參數,因爲默認的超參數將以 100% 的準確率擬合數據。

但是,建議你實驗這些超參數,例如 max_depth 和 min_samples_leaf,並嘗試找到最簡單的潛在模型,即最不太可能過擬合的模型!

3.使用模型進行預測

預測訓練集的標籤,並將此列表賦值給變量 y_pred。

4.計算模型的準確率

爲此,使用 sklearn 函數 accuracy_score。

代碼實現:

# Import statements 
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
import pandas as pd
import numpy as np

# Read the data.
data = np.asarray(pd.read_csv('data.csv', header=None))
# Assign the features to the variable X, and the labels to the variable y. 
X = data[:,0:2]
y = data[:,2]

# TODO: Create the decision tree model and assign it to the variable model.
# You won't need to, but if you'd like, play with hyperparameters such
# as max_depth and min_samples_leaf and see what they do to the decision
# boundary.
model = DecisionTreeClassifier()

# TODO: Fit the model.
model.fit(X,y)
# TODO: Make predictions. Store them in the variable y_pred.
y_pred = model.predict(X)

# TODO: Calculate the accuracy and assign it to the variable acc.
acc = accuracy_score(y_pred, y)
print(acc)
1.0

小結:

決策樹的一個重要任務是爲了理解數據中所蘊含的知識信息,因此決策樹可以使用不熟悉的數據集合,並從中提取一系列規則。

這個機器根據數據集創建規則的過程,就是機器學習過程。

專家系統中,經常使用決策樹,而且決策樹給出結果往往可以匹配當前領域具有幾十年工作經驗的人類專家。

優點:計算複雜度不高,輸出結果易於理解,對中間值的卻是不敏感,可以處理不相關特徵數據;

缺點:可能會產生過度匹配問題;

適用數據類型:數值型和標稱型。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章