4. 決策樹

柏林牆發表於2020-10-26

1. 決策樹基本資訊

  • 非引數學習
  • 解決分類問題
  • 天然就解決多分類問題
  • 也可以解決迴歸問題
  • 非常好的可解釋性

2. 資訊熵

熵: 代表隨機變數不確定度的度量

熵越大:資料的不確定性越高

熵越小:資料的不確定性越低

表示式:

3. 使用資訊熵尋找最優劃分

from sklearn.tree import DecisionTreeClassifier
dt_clf = DecisionTreeClassifier(max_depth=2, criterion='entropy', random_state=2)   # criterion標準使用entropy資訊熵計算,預設為基尼係數gini
dt_clf.fit(x,y)
  • 資訊熵的模擬
def split(X, y, d, value):      # 對資料分割
    index_a = (X[:,d] <= value)
    index_b = (X[:,d] > value)
    return X[index_a], X[index_b], y[index_a], y[index_b]

from collections import Counter
from math import log

def entropy(y):           # 求出在某點時的資訊熵
    counter = Counter(y)
    res = 0.0
    for num in counter.values():    # 對某點左右兩邊的資料值統計,根據資訊熵公式求出
        p = num / len(y)
        res += -p * log(p)
    return res
 
def try_split(X, y):    # 遍歷資料集求出最小的資訊熵
    
    best_entropy = float('inf')
    best_d, best_v = -1, -1
    for d in range(X.shape[1]):     # 根據不同的列遍歷
        sorted_index = np.argsort(X[:,d])      # 求出對某列資料的排序後的索引,按照從小到大的值的順序排列的索引
        for i in range(1, len(X)):      # 對當前列的所有值不改變順序的 按照順序去搜尋出最小的資訊熵
            if X[sorted_index[i], d] != X[sorted_index[i-1], d]:
                v = (X[sorted_index[i], d] + X[sorted_index[i-1], d])/2     # 
                X_l, X_r, y_l, y_r = split(X, y, d, v)
                p_l, p_r = len(X_l) / len(X), len(X_r) / len(X)   # 在某點左右兩側值的概率
                e = p_l * entropy(y_l) + p_r * entropy(y_r)      # 資訊熵
                if e < best_entropy:     # 如果當前資訊熵更低替換
                    best_entropy, best_d, best_v = e, d, v
                
    return best_entropy, best_d, best_v

4. 基尼係數

from sklearn.tree import DecisionTreeClassifier

dt_clf = DecisionTreeClassifier(max_depth=2, criterion="gini", random_state=42)  # 預設為gini,設定通過critertion標準為gini基尼係數
dt_clf.fit(X, y)
  • 資訊熵的計算比基尼係數稍慢,sklearn預設為基尼係數,大多數時候兩者效果差不多

5. CART 與決策樹中的超引數

  • 複雜度:預測:O( logm ), 訓練:O( n * m * logm )
  • 通過剪枝降低複雜度,解決過擬合:max_depth = 2, min_sample_split = 10, max_leaf_nodes = 4

6. 決策樹的迴歸問題解決

from sklearn.tree import DecisionTreeRegressor

dtr_clf = DecisionTreeRegressor(max_depth=4, max_features=11, )
dtr_clf.fit(x_train, y_train)
dtr_clf.score(x_test, y_test)

7. 決策樹的侷限性

  • 分割線橫平豎直,無法斜向表示、

  • 對個別資料非常的敏感

相關文章