決策樹算法梳理

決策樹算法梳理

信息論基礎

度量隨機變量的不確定性。(純度)
定義:假設隨機變量X的可能取值有x1x2...,xnx_1,x_2, ... , x_n
對於每一個可能的取值xix_i,其概率P(X=xi)=pi,(i=1,2,...,n)P(X=x_i) = p_i , ( i = 1,2, ... , n)
因此隨機變量X的熵:
H(x)=i=1npilog2piH(x)=-\sum_{i=1}^np_ilog_2p_i
對於樣本集合DD來說,隨機變量X是樣本的類別,即,假設樣本有kk個類別,每個類別的概率是CkD\frac{|C_k|}{|D|},其中Ck|C_k|表示類別k的樣本個數,D|D|表示樣本總數
則對於樣本集合D來說熵(經驗熵)爲:
H(x)=k=1kCkDlog2CkDH(x)=-\sum_{k=1}^k\frac{|C_k|}{|D|}log_2\frac{|C_k|}{|D|}


聯合熵

將一維隨機變量分佈推廣到多維隨機變量分佈,則其聯合熵 (Joint entropy) 爲:
H(x)=x,yp(x,y)log2p(x,y)H(x)=-\sum_{x,y}p(x,y)log_2p(x,y)
注意點:
1、熵只依賴於隨機變量的分佈,與隨機變量取值無關,所以也可以將 X 的熵記作 H§。
2、令0log0=0(因爲某個取值概率可能爲0)。


條件熵

條件熵H(YX)H(Y|X) 表示在已知隨機變量 X 的條件下隨機變量 Y 的不確定性。條件熵 H(YX)H(Y|X) 定義爲 X 給定條件下 Y 的條件概率分佈的熵對 X 的數學期望:
在這裏插入圖片描述
條件熵 H(YX)H(Y|X)相當於聯合熵 H(X,Y)減去單獨的熵 H(X),即

H(YX)=H(X,Y)H(X)H(Y|X)=H(X,Y)−H(X)


信息增益

信息增益在決策樹算法中是用來選擇特徵的指標,信息增益越大,則這個特徵的選擇性越好,在概率中定義爲:待分類的集合的熵和選定某個特徵的條件熵之差(這裏只的是經驗熵或經驗條件熵,由於真正的熵並不知道,是根據樣本計算出來的),公式如下:
IG(YX)=H(Y)H(YX)IG(Y|X)=H(Y)-H(Y|X)


基尼不純度

基尼不純度的大概意思是 一個隨機事件變成它的對立事件的概率
例如 一個隨機事件X ,P(X=0) = 0.5 ,P(X=1)=0.5
那麼基尼不純度就爲 P(X=0)(1 - P(X=0)) + P(X=1)(1 - P(X=1)) = 0.5

一個隨機事件Y ,P(Y=0) = 0.1 ,P(Y=1)=0.9
那麼基尼不純度就爲P(Y=0)*(1 - P(Y=0)) +   P(Y=1)*(1 - P(Y=1))  = 0.18
很明顯 X比Y更混亂,因爲兩個都爲0.5 很難判斷哪個發生。而Y就確定得多,Y=0發生的概率很大。而基尼不純度也就越小。
所以基尼不純度也可以作爲衡量系統混亂程度的標準

決策樹的不同分類算法

ID3算法

ID3算法的核心是在決策樹各個節點上應用信息增益準則選擇特徵,遞歸地構建決策樹。具體方法是:從根節點開始,對節點計算所有可能的特徵的信息增益,選擇信息增益最大的特徵作爲節點的特徵,由該特徵的不同取值建立子節點;再對子節點遞歸的調用以上方法,構建決策樹;直到所有特徵的信息增益均很小或沒有特徵可以選擇爲止。最後得到一個決策樹。ID3相當於用極大似然估計法進行概率模型的選擇。

D3算法描述:
輸入:訓練數據集D,特徵集A,閾值;

輸出:決策樹T

(1)若D中所有實例屬於同一類CkC_k,則T爲單節點樹,並將CkC_k類作爲該節點的類標記,返回T;

(2)若A=A=\varnothing,則T爲單節點樹,並將D中實例數最大的類作爲該節點的類標記,返回T;

(3)否則,按信息增益算法計算A中個特徵對D的信息增益,選擇信息增益最大的特徵;

(4)若果AgA_g的信息增益小於閾值,則置T爲單節點樹,並將D中實例數最大的類作爲該節點的類標記,返回T;

(5)否則,AgA_g對的每一個可能值,依Ag=aiA_g=a_i將D分割爲若干非空子集DiD_i,將中實例數最大的類作爲標記,構建子節點,由節點及其子節點構成樹T,返回T;

(6)對第i個子節點,以DiD_i爲訓練集,以Ag{A_g}爲特徵集,遞歸地調用(1)~(5)步,得到子樹TiT_i,返回TiT_i.

C4.5算法介紹

C4.5算法與ID3算法相似,C4.5算法對ID3算法進行了改進,C4.5在生成的過程中,用信息增益比來選擇特徵。

C4.5算法描述:
(1)若D中所有實例屬於同一類CkC_k,則T爲單節點樹,並將CkC_k類作爲該節點的類標記,返回T;

(2)若A=A=\varnothing,則T爲單節點樹,並將D中實例數最大的類CkC_k作爲該節點的類標記,返回T;

(3)否則,按信息增益比來計算A中個特徵對D的信息增益比,選擇信息增益比最大的特徵AgA_g;

(4)若果AgA_g的信息增益比小於閾值,則置T爲單節點樹,並將D中實例數最大的類CkC_k作爲該節點的類標記,返回T;

(5)否則,對AgA_g的每一個可能值aia_i,依將D分割爲若干非空子集DiD_i,將DiD_i中實例數最大的類作爲標記,構建子節點,由節點及其子節點構成樹T,返回T;

(6)對第i個子節點,以DiD_i爲訓練集,以{AgA_g}爲特徵集,遞歸地調用(1)~(5)步,得到子樹TiT_i,返回TiT_i

CART介紹

CART(Classification And Regression Tree),即可以用作分類也可以用作迴歸,相較於ID3算法和C4.5算法,CART算法的用途更加廣泛。sklearn中的決策樹就是使用CART算法構建的。

CART是在給定輸入隨機變量X條件下輸出隨機變量Y的條件概率分佈的學習方法。CART構建決策樹用的是二叉樹結構,在每個葉節點上預測的是概率分佈,也就是在輸入給定的條件下輸出的條件概率分佈。

CART算法由以下兩步組成:

(1)決策樹生成:基於訓練數據集生成決策樹,生成的決策樹要儘量大;

(2)決策樹剪枝:用驗證集對已生成的樹進行剪枝並選擇最優子樹,這時用損失函數最小作爲剪枝的標準。

CART決策樹的生成就是遞歸的調用二叉樹的過程。對迴歸樹用平方誤差最小化準則(mse)或絕對誤差最小化準則(mae),對分類樹用基尼指數最小化準則,進行特徵選擇,生成二叉樹。

迴歸樹生成

對於連續型數據,使用迴歸樹進行預測。在訓練數據集所在的輸入空間中,遞歸地將每個區域劃分爲兩個子區域並決定每個子區域上的輸出值,構建二叉樹。
(1)選擇最優切分變量j與切分點s,求解:
在這裏插入圖片描述

遍歷變量j,對固定的切分變量j掃描切分點s,選擇使上式達到最小值的對;

(2)用選定的對劃分區域並決定相應的輸出值:
在這裏插入圖片描述
在這裏插入圖片描述 xRm,m=1,2x\in R_m,m={1,2}
其中,由式子可以看出,cm^\hat{c_m}爲節點m中樣本的平均值。

(3)繼續對兩個子區域調用步驟(1),(2),直到滿足停止條件;

(4)將輸入空間劃分爲M個區域,生成決策樹:
在這裏插入圖片描述

即,當使用樣本進行預測時,樣本最終落入的葉節點的均值作爲最終的預測值。

決策樹防止過擬合手段

剪枝處理(pruning)是決策樹學習算法中對付“過擬合”的主要手段, 在決策樹學習中, 爲了儘可能正確分類訓練樣本, 節點劃分過程不斷重複, 有時候會造成決策樹分支過多, 以至於將訓練樣本集自身特點當作泛化特點, 而導致過擬合。 因此可以採用剪枝處理來去掉一些分支來降低過擬合的風險。 剪枝的基本策略有預剪枝(prepruning)和後剪枝(postprunint).
預剪枝是指在決策樹生成過程中, 在每個節點劃分前先估計其劃分後的泛化性能, 如果不能提升, 則停止劃分, 將當前節點標記爲葉結點。
後剪枝是指生成決策樹以後,再自下而上對非葉結點進行考察, 若將此節點標記爲葉結點可以帶來泛化性能提升, 則修改之.

模型評估

自助法(bootstrap):
訓練集是對於原數據集的有放回抽樣,如果原始數據集N,可以證明,大小爲N的自助樣本大約包含原數據63.2%的記錄。當N充分大的時候,1(11/N)N1-(1-1/N)^N 概率逼近 1e1=0.6321-e^{-1}=0.632。抽樣 b 次,產生 b 個bootstrap樣本,則,總準確率爲(accs爲包含所有樣本計算的準確率)
accboot=1/bi=1b(0.632×εi+0.368×accs)accboot=1/b∑_{i=1}^b(0.632×ε_i+0.368×accs)

準確度的區間估計:
將分類問題看做二項分佈,則有:
令 X 爲模型正確分類,p 爲準確率,X 服從均值 Np、方差 Np(1-p)的二項分佈。acc=X/Nacc=X/N爲均值 p,方差 p(1p)/Np(1-p)/N的二項分佈。acc 的置信區間:
在這裏插入圖片描述

sklearn參數詳解

'''
scikit-learn中有兩類決策樹,它們均採用優化的CART決策樹算法。
'''
from sklearn.tree import DecisionTreeRegressor
'''
迴歸決策樹
'''
DecisionTreeRegressor(criterion="mse",
                         splitter="best",
                         max_depth=None,
                         min_samples_split=2,
                         min_samples_leaf=1,
                         min_weight_fraction_leaf=0.,
                         max_features=None,
                         random_state=None,
                         max_leaf_nodes=None,
                         min_impurity_decrease=0.,
                         min_impurity_split=None,
                         presort=False)
'''
參數含義:
1.criterion:string, optional (default="mse")
            它指定了切分質量的評價準則。默認爲'mse'(mean squared error)。
2.splitter:string, optional (default="best")
            它指定了在每個節點切分的策略。有兩種切分策咯:
            (1).splitter='best':表示選擇最優的切分特徵和切分點。
            (2).splitter='random':表示隨機切分。
3.max_depth:int or None, optional (default=None)
             指定樹的最大深度。如果爲None,則表示樹的深度不限,直到
             每個葉子都是純淨的,即葉節點中所有樣本都屬於同一個類別,
             或者葉子節點中包含小於min_samples_split個樣本。
4.min_samples_split:int, float, optional (default=2)
             整數或者浮點數,默認爲2。它指定了分裂一個內部節點(非葉子節點)
             需要的最小樣本數。如果爲浮點數(0到1之間),最少樣本分割數爲ceil(min_samples_split * n_samples)
5.min_samples_leaf:int, float, optional (default=1)
             整數或者浮點數,默認爲1。它指定了每個葉子節點包含的最少樣本數。
             如果爲浮點數(0到1之間),每個葉子節點包含的最少樣本數爲ceil(min_samples_leaf * n_samples)
6.min_weight_fraction_leaf:float, optional (default=0.)
             它指定了葉子節點中樣本的最小權重係數。默認情況下樣本有相同的權重。
7.max_feature:int, float, string or None, optional (default=None)
             可以是整數,浮點數,字符串或者None。默認爲None。
             (1).如果是整數,則每次節點分裂只考慮max_feature個特徵。
             (2).如果是浮點數(0到1之間),則每次分裂節點的時候只考慮int(max_features * n_features)個特徵。
             (3).如果是字符串'auto',max_features=n_features。
             (4).如果是字符串'sqrt',max_features=sqrt(n_features)。
             (5).如果是字符串'log2',max_features=log2(n_features)。
             (6).如果是None,max_feature=n_feature。
8.random_state:int, RandomState instance or None, optional (default=None)
             (1).如果爲整數,則它指定了隨機數生成器的種子。
             (2).如果爲RandomState實例,則指定了隨機數生成器。
             (3).如果爲None,則使用默認的隨機數生成器。
9.max_leaf_nodes:int or None, optional (default=None)
             (1).如果爲None,則葉子節點數量不限。
             (2).如果不爲None,則max_depth被忽略。
10.min_impurity_decrease:float, optional (default=0.)
             如果節點的分裂導致不純度的減少(分裂後樣本比分裂前更加純淨)大於或等於min_impurity_decrease,則分裂該節點。
             個人理解這個參數應該是針對分類問題時纔有意義。這裏的不純度應該是指基尼指數。
             迴歸生成樹採用的是平方誤差最小化策略。分類生成樹採用的是基尼指數最小化策略。
             加權不純度的減少量計算公式爲:
             min_impurity_decrease=N_t / N * (impurity - N_t_R / N_t * right_impurity
                                - N_t_L / N_t * left_impurity)
             其中N是樣本的總數,N_t是當前節點的樣本數,N_t_L是分裂後左子節點的樣本數,
             N_t_R是分裂後右子節點的樣本數。impurity指當前節點的基尼指數,right_impurity指
             分裂後右子節點的基尼指數。left_impurity指分裂後左子節點的基尼指數。
11.min_impurity_split:float
             樹生長過程中早停止的閾值。如果當前節點的不純度高於閾值,節點將分裂,否則它是葉子節點。
             這個參數已經被棄用。用min_impurity_decrease代替了min_impurity_split。
12.presort: bool, optional (default=False)
             指定是否需要提前排序數據從而加速尋找最優切分的過程。設置爲True時,對於大數據集
             會減慢總體的訓練過程;但是對於一個小數據集或者設定了最大深度的情況下,會加速訓練過程。
屬性:
1.feature_importances_ : array of shape = [n_features]
             特徵重要性。該值越高,該特徵越重要。
             特徵的重要性爲該特徵導致的評價準則的(標準化的)總減少量。它也被稱爲基尼的重要性
2.max_feature_:int
             max_features推斷值。
3.n_features_:int
             執行fit的時候,特徵的數量。
4.n_outputs_ : int
             執行fit的時候,輸出的數量。
5.tree_ : 底層的Tree對象。
Notes:
控制樹大小的參數的默認值(例如``max_depth``,``min_samples_leaf``等)導致完全成長和未剪枝的樹,
這些樹在某些數據集上可能表現很好。爲減少內存消耗,應通過設置這些參數值來控制樹的複雜度和大小。
方法:
1.fit(X,y):訓練模型。
2.predict(X):預測。
'''
 
from sklearn.tree import DecisionTreeClassifier
'''
分類決策樹
'''
DecisionTreeClassifier(criterion="gini",
                 splitter="best",
                 max_depth=None,
                 min_samples_split=2,
                 min_samples_leaf=1,
                 min_weight_fraction_leaf=0.,
                 max_features=None,
                 random_state=None,
                 max_leaf_nodes=None,
                 min_impurity_decrease=0.,
                 min_impurity_split=None,
                 class_weight=None,
                 presort=False)
'''
參數含義:
1.criterion:string, optional (default="gini")
            (1).criterion='gini',分裂節點時評價準則是Gini指數。
            (2).criterion='entropy',分裂節點時的評價指標是信息增益。
2.max_depth:int or None, optional (default=None)。指定樹的最大深度。
            如果爲None,表示樹的深度不限。直到所有的葉子節點都是純淨的,即葉子節點
            中所有的樣本點都屬於同一個類別。或者每個葉子節點包含的樣本數小於min_samples_split。
3.splitter:string, optional (default="best")。指定分裂節點時的策略。
           (1).splitter='best',表示選擇最優的分裂策略。
           (2).splitter='random',表示選擇最好的隨機切分策略。
4.min_samples_split:int, float, optional (default=2)。表示分裂一個內部節點需要的做少樣本數。
           (1).如果爲整數,則min_samples_split就是最少樣本數。
           (2).如果爲浮點數(0到1之間),則每次分裂最少樣本數爲ceil(min_samples_split * n_samples)
5.min_samples_leaf: int, float, optional (default=1)。指定每個葉子節點需要的最少樣本數。
           (1).如果爲整數,則min_samples_split就是最少樣本數。
           (2).如果爲浮點數(0到1之間),則每個葉子節點最少樣本數爲ceil(min_samples_leaf * n_samples)
6.min_weight_fraction_leaf:float, optional (default=0.)
           指定葉子節點中樣本的最小權重。
7.max_features:int, float, string or None, optional (default=None).
           搜尋最佳劃分的時候考慮的特徵數量。
           (1).如果爲整數,每次分裂只考慮max_features個特徵。
           (2).如果爲浮點數(0到1之間),每次切分只考慮int(max_features * n_features)個特徵。
           (3).如果爲'auto'或者'sqrt',則每次切分只考慮sqrt(n_features)個特徵
           (4).如果爲'log2',則每次切分只考慮log2(n_features)個特徵。
           (5).如果爲None,則每次切分考慮n_features個特徵。
           (6).如果已經考慮了max_features個特徵,但還是沒有找到一個有效的切分,那麼還會繼續尋找
           下一個特徵,直到找到一個有效的切分爲止。
8.random_state:int, RandomState instance or None, optional (default=None)
           (1).如果爲整數,則它指定了隨機數生成器的種子。
           (2).如果爲RandomState實例,則指定了隨機數生成器。
           (3).如果爲None,則使用默認的隨機數生成器。
9.max_leaf_nodes: int or None, optional (default=None)。指定了葉子節點的最大數量。
           (1).如果爲None,葉子節點數量不限。
           (2).如果爲整數,則max_depth被忽略。
10.min_impurity_decrease:float, optional (default=0.)
         如果節點的分裂導致不純度的減少(分裂後樣本比分裂前更加純淨)大於或等於min_impurity_decrease,則分裂該節點。
         加權不純度的減少量計算公式爲:
         min_impurity_decrease=N_t / N * (impurity - N_t_R / N_t * right_impurity
                            - N_t_L / N_t * left_impurity)
         其中N是樣本的總數,N_t是當前節點的樣本數,N_t_L是分裂後左子節點的樣本數,
         N_t_R是分裂後右子節點的樣本數。impurity指當前節點的基尼指數,right_impurity指
         分裂後右子節點的基尼指數。left_impurity指分裂後左子節點的基尼指數。
11.min_impurity_split:float
         樹生長過程中早停止的閾值。如果當前節點的不純度高於閾值,節點將分裂,否則它是葉子節點。
         這個參數已經被棄用。用min_impurity_decrease代替了min_impurity_split。
12.class_weight:dict, list of dicts, "balanced" or None, default=None
         類別權重的形式爲{class_label: weight}
         (1).如果沒有給出每個類別的權重,則每個類別的權重都爲1。
         (2).如果class_weight='balanced',則分類的權重與樣本中每個類別出現的頻率成反比。
         計算公式爲:n_samples / (n_classes * np.bincount(y))
         (3).如果sample_weight提供了樣本權重(由fit方法提供),則這些權重都會乘以sample_weight。
13.presort:bool, optional (default=False)
        指定是否需要提前排序數據從而加速訓練中尋找最優切分的過程。設置爲True時,對於大數據集
        會減慢總體的訓練過程;但是對於一個小數據集或者設定了最大深度的情況下,會加速訓練過程。
屬性:
1.classes_:array of shape = [n_classes] or a list of such arrays
        類別的標籤值。
2.feature_importances_ : array of shape = [n_features]
        特徵重要性。越高,特徵越重要。
        特徵的重要性爲該特徵導致的評價準則的(標準化的)總減少量。它也被稱爲基尼的重要性
3.max_features_ : int
        max_features的推斷值。
4.n_classes_ : int or list
        類別的數量
5.n_features_ : int
        執行fit後,特徵的數量
6.n_outputs_ : int
        執行fit後,輸出的數量
7.tree_ : Tree object
        樹對象,即底層的決策樹。
方法:
1.fit(X,y):訓練模型。
2.predict(X):預測
3.predict_log_poba(X):預測X爲各個類別的概率對數值。
4.predict_proba(X):預測X爲各個類別的概率值。
'''
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章