1. 程式人生 > >第10章-基於樹的方法(2)-樹的剪枝

第10章-基於樹的方法(2)-樹的剪枝

###10.8 通過剪枝得到最優規模的樹

之前我們討論的都是如何生成樹,接下來我們要講解的是如何進行剪枝。

我們令一個樹 T 的誤分類誤差的期望為 R ( T ) R^*(T)

.
回想一下,我們是用再代入誤差估計,估計的 R ( T ) R^*(T) ,即

R

( T ) = t T
R ( t ) = t T p ( t ) r ( t ) R(T)=\sum_{t∈T'}{R(t)}=\sum_{t∈T'}{p(t)r(t)}

再來想一下,10.3中所講的,r(t)是葉節點t的誤分類概率,等於
1-‘基於訓練集得到的葉節點t的頻率最大的類別點對應的概率’, 即

r ( t ) = 1 m a x p ( j t ) = 1 p ( k ( t ) t ) r(t)=1− max p(j|t)=1−p(k(t)|t)

對於整個樹,對葉節點的誤分類比例進行加權累計求和,就得到了總的誤分類概率。

並且,在10.3中,我們提到過,再代入誤差是有趨於更小的,即樹傾向生成更大的規模。我們證明了,父節點的誤分類概率一定大於等於子節點誤分類概率加權求和。

R ( t ) R ( t L ) + R ( t R ) R(t)≥R(t_L)+R(t_R)

以上說明,如果我們用再代入誤差最小化為策略時,我們總是傾向於選擇更大的樹,且無法解決減輕過擬合的影響。
(例子 略)

###10.8.1 剪枝的預備知識

首先,我們先要生成最大的樹,用 T m a x T_{max} 來表示。
其次,設定停止生成樹的閾值並不是那麼重要。因為,只要樹足夠大,何時停止生成樹影響不大。最後,樹也都會在剪枝過程中被修減。下面列出幾種決定何時停止生成樹的方法:

  1. 一直生成樹,直到所有的葉節點都是"純的"(只屬於一類)
  2. 一直生成樹,直到所有的葉節點之和都不超過給定的閾值
  3. 只要樹足夠大,原始樹的大小就會變得不那麼重要
    以上,重點就是要確保剪枝之前樹要生成的足夠大。

最後,我們需要預先進行一些定義:

  1. Descendant: 如果一個節點 t′ 可以從一個節點 t 沿著一個連續路徑向下派生出來,我們就說,t’是t的派生節點(Descendant)
  2. Ancestor: 在1中的情況中,反過來說,t 是 t’的Ancestor節點
  3. A branch T t T_t : 在一個樹T 中,以一個節點t(t∈T)為根節點衍生出來的所有子(葉)節點,包括t點本身,構成了 T t T_t
  4. 從樹T 中剪枝去掉 T t T_t ,意味著從T中去掉t節點以及t節點派生出來的所有節點,可用 T T t T−T_t 表示。
  5. 如果T′ 是樹T 已經剪枝成功後的狀態,那麼T’ 被稱為T的剪枝後的子樹,且 T < T T'<T

即使對於適中規模的樹來說,子樹的數量都是非常巨大的。因此,我們無法窮盡遍歷所有子樹找到最優的情況。而且,我們通常也沒有獨立的測試集為有偏的選擇提供服務。

我們需要更聰明的辦法,這個辦法需要滿足以下兩點:

  • 某種程度上看,子樹要是最優的
  • 且,最優子樹的搜尋,計算量要保證簡單易行

10.8.2 最小代價-複雜度的剪枝

如之前討論的,再代入誤差 R(T) 並不是一個很好選擇子樹的度量方式,因為它會傾向選擇更大的樹。我們需要加入對複雜度的懲罰,懲罰項要傾向於更小的樹,以此來平衡再代入誤差 R(T)。

代價-複雜度的定義:
對於任一子樹 T < T m a x T<T_{max} , 定義樹的複雜度為 T |T^*| , 表示樹的葉節點(終節點)的個數。定義實數 α≥0,被稱作複雜度引數 ,則定義代價-複雜度 R α ( T ) R_α(T)

R α ( T ) = R ( T ) + α T R_α(T)=R(T)+α|T^*|

葉節點越多,複雜度也就越大,因為我們把空間劃分成子區域的方式會有更多,所以,會有更大的可能性更適合訓練集的資料。除了複雜度,樹的規模也是非常重要的。而這些問題都轉化為用複雜度引數 α 來進行調整了。

最後,我們就說用上述的代價複雜度公式進行樹的剪枝的。當 α=0 時,複雜度相當於被去掉,退化成再代入誤差。所以,公式會選擇生成最大規模的樹。當 α 接近無窮大時,樹的規模將為1,只有單一根節點。

通常,如果預先給定α 後,就能夠找到子樹T(α),使得代價複雜度 Rα(T) 最小。

R α ( T ( α ) ) = m i n ( R α ( T ) ) , T T m a x R_α(T(α))=min(R_α(T)), T≤T_{max}

那麼,對於任意一個 α,最小化子樹總是可解的。因為只有有限多個子樹。

兩個問題:

  1. 存在一個唯一的子樹 T < T m a x T<T_{max} ,滿足 R α ( T ) R_α(T) 最小麼?
  2. 在最小化子樹的序列中,T1,T2,⋯每個子樹能否通過對上一個子樹剪枝得到,即,這些子樹是巢狀的麼?

如果最優的子樹都是巢狀的,那麼計算量將會大幅下降。我們先找到 T 1 T_1 ,然後找 T 2 T_2 時,不需要再從頭開始,而是直接從 T 1 T_1 開始(因為T2是T1的子樹,是巢狀的)。隨著 α 的增加,我們將對越來越小的樹進行剪枝。

定義:對於引數α,最優最小樹 T α T_α :

  1. R α ( T ( α ) ) = m i n ( R α ( T ) ) , T T m a x R_α(T(α))=min(R_α(T)), T≤T_{max}
  2. 如果 R α ( T ) = R α ( T ( α ) ) R_α(T)=R_α(T(α)) ,那麼 $ T(α)≤T$,即,如果對於同樣的 α , 存在其他的樹的代價複雜度同樣也達到最小,那麼其他樹的規模一定是小於等於 T ( α ) T(α) .

根據上述定義,如果T(α)存在,那麼一定是唯一的。之前我們也討論過最小子樹總是存在的,因為只有有限個子樹。更近一步,我們可以證明最小子樹總是存在的。這點是很重要的,因為一個樹比另一個樹小,說明它是是巢狀在大一點的樹中的。

剪枝的開始點不是 T m a x T_{max} (所有葉節點都是純的), 而是 T 1 = T ( 0 ) T_1=T(0) , T 1 T_1 T m a x T_{max} 的最小子樹(最小損失複雜度),且滿足:

R ( T 1 ) = R ( T ( 0 ) ) = R ( T m a x ) R(T_1)=R(T(0))=R(T_{max})

得到 T 1 T_1 的步驟如下:

首先,先來看最大樹 T m a x T_{max} ,然後從同一個父節點劃分出兩個葉節點 t L , t R t_L,t_R