系統不肯定性的度量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=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, class_weight=None, presort=False)
max_depth:樹的深度.
min_samples_split:某個待決策的節點的最少樣本數量.
min_samples_leaf :葉子節點必須包含的最小樣本數量
max_features :尋找使系統的不肯定性最低的劃分時,所須要考慮的最大特徵數.
參考上面的分析以及示例圖,很容易知道,max_depth越大,複雜度越高.越容易過擬合.
min_samples_split越大,越容易欠擬合,越小越容器過擬合.好比個人min_samples_split設置爲1,那確定樹要被劃分的很深.
min_samples_leaf 越小越容易過擬合.
更多的參數及含義參考sklearn的官方文檔.
決策樹的缺點:
對個別數據異常敏感.
容易過擬合.
好比上圖,b是更好的決策邊界,而決策樹找出的決策邊界極可能是a這條折線. 原理很簡單,看一下文章前面描述決策樹原理的代碼,每一次作tree的split時候,是在某一個維度上,找到一個value,使得分割以後,系統的信息熵最小. 反映到上圖的這個二維的樣本中來,畫出來的分割線就是平行於x軸,y軸(其實就是樣本的2個維度)的兩條線連起來的折線.
機器學習筆記系列文章列表