機器學習筆記(1)決策樹

系統不肯定性的度量html

先來看2個概念.node

信息熵  $$h(\theta)=\sum_{j=0}^n \theta_jx_j$$  python

基尼係數  $$G=1-\sum_{i=0}^n p_i^2$$apache

兩者都反映了信息的不肯定性,是信息不肯定性的不一樣評價標準. dom

關於信息熵,在數學之美中,有一段通俗易懂的例子.機器學習

 

sklearn中使用決策樹學習

在sklearn中使用decisiontree時,採用信息熵或者基尼係數,預測準確率並不會有很大差別.spa

from sklearn.tree import DecisionTreeClassifier

tree_clf = DecisionTreeClassifier(max_depth=2, criterion="entropy")
tree_clf.fit(X, y)

tree_clf = DecisionTreeClassifier(max_depth=2, criterion="gini")
tree_clf.fit(X, y)

  

決策樹原理3d

好比咱們有一組數據,m個樣本,n個特徵.咱們但願通過x次決策(實際上也就是相似與x次if-else判斷,每一次if-else判斷之後,咱們的樣本均可以被分紅2部分,咱們就能夠計算這2部分的信息含量(也就是信息熵)),使得全部樣本的不肯定性最低.不肯定性最低的含義也就是:模型最大可能地擬合了咱們的數據.code

決策樹:每一次劃分,都但願使得整個系統的不肯定性下降,也就是使得每一次決策後使得整個系統的信息熵最低.

在決策時,怎麼知道用哪一個維度(d)的哪一個值(v)去作分割(即if的條件應該如何表達),使得整個系統的信息熵最低呢?

一種樸素的方法,就是窮舉,搜索.好比樣本X,y.  

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  #取2個樣本的均值做爲v
                X_l, X_r, y_l, y_r = split(X, y, d, v)
                e = entropy(y_l) + entropy(y_r)
                if e < best_entropy:
                    best_entropy, best_d, best_v = e, d, v
                
    return best_entropy, best_d, best_v

上述代碼,在每個維度上(即每個feature)去作遍歷,每次v的取值取兩個相鄰樣本的均值.而後計算系統的信息熵,一一比較.

這樣通過一次遍歷,就獲得了tree_left,tree_right。對tree_left/tree_right再執行上述過程,又能夠獲得tree_left_l,tree_left_r,tree_right_l,tree_right_r,....依次類推.

這就是決策樹的模型訓練過程.

很容易理解,若是不限制上述過程的次數(樹的深度),勢必形成過擬合,由於決策的條件被劃分的愈來愈細. 並且模型的複雜度會很高,訓練時間很長.

因此在實際的過程當中,一般會進行剪枝操做.

 

能夠參考下面這個圖理解一下決策樹的決策過程

 

 

決策樹調參

class sklearn.tree.DecisionTreeClassifier(criterion='gini'splitter='best'max_depth=Nonemin_samples_split=2min_samples_leaf=1min_weight_fraction_leaf=0.0max_features=Nonerandom_state=Nonemax_leaf_nodes=Nonemin_impurity_decrease=0.0min_impurity_split=Noneclass_weight=Nonepresort=False)

 

max_depth:樹的深度.    

min_samples_split:某個待決策的節點的最少樣本數量.   

min_samples_leaf :葉子節點必須包含的最小樣本數量

max_features :尋找使系統的不肯定性最低的劃分時,所須要考慮的最大特徵數.

 

參考上面的分析以及示例圖,很容易知道,max_depth越大,複雜度越高.越容易過擬合.

min_samples_split越大,越容易欠擬合,越小越容器過擬合.好比個人min_samples_split設置爲1,那確定樹要被劃分的很深.

min_samples_leaf 越小越容易過擬合.

更多的參數及含義參考sklearn的官方文檔.

http://sklearn.apachecn.org/cn/latest/modules/generated/sklearn.tree.DecisionTreeClassifier.html#sklearn.tree.DecisionTreeClassifier

 

決策樹的缺點:

對個別數據異常敏感.

容易過擬合.

好比上圖,b是更好的決策邊界,而決策樹找出的決策邊界極可能是a這條折線.   原理很簡單,看一下文章前面描述決策樹原理的代碼,每一次作tree的split時候,是在某一個維度上,找到一個value,使得分割以後,系統的信息熵最小.  反映到上圖的這個二維的樣本中來,畫出來的分割線就是平行於x軸,y軸(其實就是樣本的2個維度)的兩條線連起來的折線.

 

機器學習筆記系列文章列表

機器學習筆記(1) 決策樹

機器學習筆記(2)  集成學習 隨機森林先導知識

相關文章
相關標籤/搜索