機器學習筆記 1 決策樹

2022-01-11 13:43:59 字數 3590 閱讀 6631

系統不確定性的度量

先來看2個概念.

資訊熵  $$h(\theta)=\sum_^n \theta_jx_j$$  

基尼係數  $$g=1-\sum_^n p_i^2$$

二者都反映了資訊的不確定性,是資訊不確定性的不同評價標準. 

關於資訊熵,在數學之美中,有一段通俗易懂的例子.

sklearn中使用決策樹

在sklearn中使用decisiontree時,採用資訊熵或者基尼係數,**準確率並不會有很大差異.

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)

決策樹原理比如我們有一組資料,m個樣本,n個特徵.我們希望經過x次決策(實際上也就是類似與x次if-else判斷,每一次if-else判斷以後,我們的樣本都可以被分成2部分,我們就可以計算這2部分的資訊含量(也就是資訊熵)),使得所有樣本的不確定性最低.不確定性最低的含義也就是:模型最大可能地擬合了我們的資料.

決策樹:每一次劃分,都希望使得整個系統的不確定性降低,也就是使得每一次決策後使得整個系統的資訊熵最低.

在決策時,怎麼知道用哪個維度(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,....依次類推.

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

很容易理解,如果不限制上述過程的次數(樹的深度),勢必造成過擬合,因為決策的條件被劃分的越來越細. 而且模型的複雜度會很高,訓練時間很長.

所以在實際的過程中,通常會進行剪枝操作.

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

決策樹調參

classsklearn.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 越小越容易過擬合.

決策樹的缺點:

對個別資料異常敏感.

容易過擬合.

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

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

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

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

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

機器學習中分類和 演算法的評估 準確率速度 強壯性可規模型 可解釋性 決策樹決策樹是乙個類似於流程圖的結構 節點表示判斷,將連續變數離散化,規定閾值歸類 資訊熵 變數的的不確定性越大,熵也就越大 計算公式 p x 為單個事件的概率 決策樹歸納演算法 id3 選擇屬性判斷結點 資訊獲取量 inform...

機器學習筆記 決策樹學習

決策樹學習是一種逼近離散值目標函式的方法,在這樣的方法中學習到的函式被表示為一棵決策樹。表示法 把例項從根節點排列到某個葉子節點來分類例項,葉子節點即為例項所屬的分類。樹上的每個節點指定了對例項的某個屬性 attribute 的測試,而且該節點的每個字尾分支相應於該屬性的乙個可能值。分類例項的方法是...

機器學習之決策樹1

好久沒來寫過部落格了,最近忙一些個人的事情終於有一點空閒的時間了,所以決定還是繼續自己喜歡的東西,已經把python的基礎都學得差不多了 雖說有三個月不用我現在又忘得差不多了 然後又看了看方向,感覺還是直接上機器學習比較好 ruby了,高數線代什麼的,邊看邊學再補課吧,要不然需要補得太多,我怕自己看...