1. 程式人生 > >決策樹的一些概念與探討

決策樹的一些概念與探討

決策樹通常包括三個步驟:特徵選擇、決策樹的生成、決策樹的修剪。

用決策樹分類,從根節點開始,對例項的某一特徵進行測試,根據測試結果,將例項分配到其子節點,這是每一個子節點對應該特徵的一個取值,如此遞迴地對例項進行測試並匹配,直至達到葉節點,最後將例項分到葉節點的類中。

決策樹的if-then規則:由決策樹的根節點到葉節點的每一條路徑構建一條規則,路徑上內部節點的特徵對應著規則的條件,而葉節點的類對應著規則的結論。每一個例項都被一條路徑或一條規則所覆蓋,而且只被一條路徑或一條規則所覆蓋。

決策樹學習本質上是從訓練資料集中歸納出一組分類規則,需要一個與訓練資料矛盾較小的決策樹。所選的條件概率應該不僅對資料有很好的擬合,而且對未知資料有很好的預測。

決策樹實際上就是一個遞迴地選擇最優特徵,並根據該特徵對訓練資料進行分割,使得對各個子資料集有一個最好的分類過程,這一過程對應著對特徵空間的劃分,也對應著決策樹的構建。

分類過程:

先構建根節點,將所有訓練資料都放在根節點,選擇一個最優特徵,按照這一特徵將訓練資料集分割成子集,使得各個子集有一個在當前條件下最好的分類。然後構建葉節點,並將這些子集分到所對應的葉節點中去。如果還有子集未被分類,那就對這些子集選擇新的最優特徵,繼續分割然後遞迴下去,直到所有訓練資料子集都正確分類或者沒有合適的特徵為止。

雖然用這方法可以對訓練資料有很好的分類能力,但對未知的測試資料可能會發生過擬合現象。這就需要對已生成的樹進行自下而上的剪枝,讓其簡化,具有更好的泛化能力。具體就是去掉過於細節的葉節點,讓其回退到父節點或更高的節點,將更高的節點改為新的節點。

決策樹的生成對應於模型的區域性選擇,剪枝對應於全域性選擇。決策樹的生成只考慮區域性最優,而剪枝則考慮全域性最優。

特徵選擇是決定用哪個特徵來劃分特徵空間。選取的特徵應該使得各個子集在當前條件下有最好的分類。

對決策樹進行剪枝的原因:由於決策樹雖然對訓練資料分類很準確,但是對測試資料沒有那麼準確,會出現過擬合現象,因此需要對決策樹進行簡化,這個簡化過程就稱為剪枝。

剪枝是從已生成的樹裁掉一些子樹或葉節點,並將其根節點或父節點作為新的葉節點。

設H(x)和H(y)分別是x和y的資訊熵,如果作出韋恩圖那麼聯合熵H(x,y)就是H(x)和H(y)的並集,H(y|x)=H(x,y)-H(x),它們的互資訊I

(x,y)[g(x,y)]=H(y)-H(y|x)=H(x)-H(x|y)

資訊增益表示得知特徵X的資訊而使得類Y的資訊不確定性減少的程度。

資訊增益:特徵A對訓練資料集D的資訊增益g(D,A)為集合D的經驗熵H(D)與特徵A給定條件下D的經驗條件熵H(D|A)之差:

g(D,A)=H(D)−H(D|A)

這個稱為互資訊,它度量了在已知A以後D的不確定性的減少程度。由於資訊增益的大小是相對於訓練資料集而言的,並沒有絕對意義,所以在解決相對困難的分類問題時,訓練資料集經驗熵較大,資訊增益值會偏大,反之資訊增益值會偏小,而使用資訊增益比就可以解決這個問題。

資訊增益比:gR(D,A)=g(D,A)/H(D)因為我們不希望H(D)比較大,但是當我們遇到某一些特徵的分類個數特別多,有些特徵分成幾十個類別,而有些特徵就分為幾個類別,那麼分成幾十個類別的那些特徵就應該懲罰它,也就是用資訊增益比。

預剪枝:在決策樹生成的時候決定是否剪枝。

後剪枝:先生成決策樹,再通過交叉驗證來剪枝。

gini係數:對所有樣本發生的概率與不發生的概率乘起來再求和。

                                                    Gini(p)=\sum_{k=1}^{K}p_{k}(1-p_{k})=1-\sum_{k=1}^{K}p_{k}^{2}

                                                                   =1-\sum_{k=1}^{K}\left ( \frac{|C_{k}|}{|D|} \right )^{2}

D是總的樣本個數,Ck是每一個類別上的個數。

Gini係數就可以把ln(x)這個曲線看作是它切線這條直線的近似。

只有一個是n,其他都是零,很純,所以叫純結點。所有都是均值所以叫均結點,這是最不好的情況,對我們的分類決策沒有任何好處。例如我給你說這個學校50%的女生與男生,……但如果我知道這是一個理工科的,那麼男生的概率就會高一點。

每個葉子的樣本數是不一樣的。

決策樹防止過擬合:在生成每一個節點的時候都考慮這個是否還可以拓展。

預剪枝:

通過設定每個節點至少包含的樣本數,比如10,那麼再考慮這個節點能否再分的時候如果大於10就繼續分下去,否則就不分,或者將它的子節點剪掉就會變成最終的葉子節點。

或者通過給定葉子節點的熵值的閾值來劃分,比如給定熵值0.5,就不讓它進行進一步的劃分。這兩種方法都叫做前剪枝。

後剪枝:

先生產一顆龐大的樹,然後再考慮其中的哪些節點可以剪枝掉。

由於葉子節點是最終決定樣本屬於哪個類別的,因此葉子節點越多樹也就越複雜,越容易過擬合,所以就讓葉子節點數多的讓它損失大一些。

Tleaf是葉子節點的數目,作為正則項,超引數a做調節。a=0表明最原始的不剪枝的那棵樹是最好的,Tleaf越小越好,當它為1的時候就相當於完全剪枝掉所有的孩子。把所有節點的a值都算出來然後將值最小的剪掉,通過砍掉這些子節點得到從原始到根的n棵樹,選出其中最好的一顆。

可以做分類和迴歸的樹簡稱CART。