# Aggregation Map 到目前為止所學會的方法: | aggregation type | blending | learning | |:----------------:|:----------------:|:-------------:| | uniform | voting/averaging | Bagging | | non-uniform | linear | AdaBoost | | conditional | stacking | Decision Tree | - [blending](https://hackmd.io/@ShawnNTU-CS/BywPOgyan) - 把已有的 $g_{t}$ 拿來打果汁 - [Bagging](https://hackmd.io/@ShawnNTU-CS/BywPOgyan#Bootstrap-Aggregation--Bootstrap-Aggregation) - 透過 Bootstraping 來抽出多種不同的資料集 - 以此訓練出多樣的 $g_{t}$ - [AdaBoost](https://hackmd.io/@ShawnNTU-CS/SJvNkG16h) - 透過修改 Error Measure 改變不同資料的重要性 - 這樣每次就可以學到跟上次不一樣的 $g_{t}$ --- # 路徑表示法 Path view $$ G(\mathbf{x})=\sum_{t=1}^{T}q_{t}(\mathbf{x})\cdot g_{t}(\mathbf{x}) $$ - $G(\mathbf{x})$ 就是我們的決策樹 - $q_{t}$ 是我們的判斷式。在路徑表示法中代表某個 $\mathbf{x}$ 是否在某條路上,而整棵樹有 T 條路 - 通常來說都是很簡單的判斷式 - $g_{t}$ 是樹的葉子,代表最終決策的地方,其實就是之前的 $g_{t}$。 - 通常為一個常數,像是對或錯,但是也可以使用 Regression 或其他方式做簡單的決定 這樣表示法的複雜地方主要是在「路徑上」。 # 遞迴表示法 Recursive View $$ G(\mathbf{x})=\sum_{c=1}^{C}[[b(\mathbf{x})=c]]\cdot G_{c}(\mathbf{x}) $$ - $G(\mathbf{x})$ 就是我們的決策樹 - $b(\mathbf{x})$ 分枝的判斷,看要分到哪條子樹上,總共有 C 個子樹 - $G_{c}(\mathbf{x})$ 子樹的部分 比較常使用的表示方法。 --- ## 決策樹好處 - 可解釋性高 - 簡單,並且在訓練和預測上都很有效率 ## 決策樹缺點 - 理論保證通常很少,主要著重在如何設計出好的決策樹 - 是好是壞有很多不同的討論,不一定有很強的理論做支持 - 有時候不只一個「這樣設計可能好」,而是很多種「這樣設計可能好」疊加在一起 - 所以容易讓初學者對於各種巧思跟其相關參數感到困惑 - 也因此並沒有所謂比較代表的決策樹模型 - 有時可能是該時段因為某種原因比較流行某種模型,不一定代表某個模型比較好或不好 --- # 基本演算法 延續上面遞迴的型式: 第一次決策樹函式傳入資料 $\mathcal{D}$。函數內會判斷: - 如果到了中止條件,回傳 $g_{t}(\mathbf{x})$ - 否則: - 學會分枝條件 $b(\mathbf{x})$ - 將 $\mathcal{D}$ 依照有幾種 $b(\mathbf{x})$ 分成 C 份 - 將 C 份資料各自再帶入決策樹函式學會子樹 $G_{c}(\mathbf{x})$ - 回傳 $G(\mathbf{x})=\sum_{c=1}^{C}[[b(\mathbf{x})=c]]\cdot G_{c}(\mathbf{x})$ # C&RT - C 等於 2,永遠都切兩刀 - 也就是說會是一棵二元樹 - $g_{t}(\mathbf{x})$ 是最佳的常數 - 如果是分類問題就是回傳比較多次的 $y_{n}$ - 如果是 Regression 就是回傳 $y_{n}$ 的平均值 :::info CART 演算法是 California Statistical Software 這個公司註冊的商標。這裡的 C&RT 是老師選取其精華部分。 ::: ## Branching in C&RT:Purifying C&RT 使用 decision stump 去做切兩半的動作。 而每次希望切的兩半,可以「很純」;或者說兩半「加權的不純度」要最低: $$ b(\mathbf{x})=\underset{\text{decision stump }h(\mathbf{x})}{argmin} \sum_{c=1}^{2}|\mathcal{D}_{c}\ with\ h|\cdot impurity(\mathcal{D}_{c}\ with\ h) $$ - 希望找到一個 $h$ - 他所切的兩半 $\mathcal{D}_{1}$、$\mathcal{D}_{2}$ 的不純度 - 乘上資料量 $|\mathcal{D}_{c}\ with\ h|$ 作為加權 - 加起來要最低 # Impurity function 回傳一個常數的話,評估不純度會方便很多;所以不純函數就是來算 $E_{in}$。 ## For regression $$ \frac{1}{N}\sum_{n=1}^{N}(y_{n}-\bar{y})^{2} $$ 熟悉的最小平方。 ## For Classification $$ 1-\max_{1\le k \le K}\frac{1}{N}\sum_{n=1}^{N}[[y_{n}\ne k]] $$ 也就是只看當前最多的種類到底多不多。 :::warning 這種就是之前 decision stump 做分類時的方法 ::: 但是缺點是只看一種而已,把全部種類都納入考量會比較好,所以有了第二種: ### Gini Index / 基尼不純度指標 $$ 1-\sum_{k=1}^{K}\left(\frac{\sum_{n=1}^{N}[[y_{n}=k]]}{N}\right)^{2} $$ 將每種的比例的平方加起來得到純度,再用 1 去減得到不純度。 這個叫 「**Gini Index**」,是分類問題最常用的不純度方法。 在維基百科中,原始定義是「**樣本被選中的概率乘以它被分錯的概率**」: $$ \sum_{i=1}^{K}p_{i}\sum_{k\ne i}^{K}p_{k}=\sum_{i=1}^{K}p_{i}(1-p_{i}) $$ 繼續推導就可以得到上面的式子了。 :::warning 可以發現 decision stump 在這裡是用來「切兩半」,跟之前用來「分兩邊」不太一樣。 如果是 For regression,那麼似乎就沒有 S 這個代表方向的參數了,並且也不用對 x 進行排序。 ::: ## 停下來 / Fully-grown Tree - 如果切到兩邊加起來不純度是 0,也就是說切到最純了,那就可以停了 - 此時所有算出的 $y_{n}$ 跟資料的都一樣 - 可以回傳當前的 $h$ 作為 $g_{t}(\mathbf{x})$ - 或者正要下刀的時候,發現所有 $x_{n}$ 都一樣,找不到下刀處 - 此時所有的 $x_{n}$ 都一樣 - 就可以直接回傳常數回去 全都停下來後,我們就得到一顆 **Fully-grown Tree**。 :::info C&RT 的特色 1: - 容易處裡 binary class、Regression、multi class 問題 ::: # Overfitting 由於資料會越切越小份,越小份的資料訓練時就容易發生 Overfit,所以需要 Regularizer。 $$ \underset{\text{all possible G}}{argmin}E_{in}(G)+\lambda\Omega(G) $$ $\Omega(G)$ 是葉子的數量。所謂全部的 G ,就是把各種葉子修剪掉,所得到的各種可能「**修剪過的樹 pruned tree**」。 也就是在葉子數量跟錯誤率之間取一個平衡。 ## 修枝 Pruning 所謂的修剪,其實就是把兩片葉子合在一起。 但是全部的可能性太多了,所以改成: - 先從各個葉子中,摘掉一片葉子;看看各種摘掉一片葉子的樹當中誰的 $E_{in}$ 最小,以那顆樹作為 $G^{1}$。 - 接著再以 $G^{1}$ 重複上面摘掉一片葉子的動作,得到 $G^{2}$ - 重複直到你喜歡摘幾片 - 這些 $G^{1}\sim G^{i}$ 構成上面的 all possible G ## $\lambda$ 至於要如何挑 $\lambda$,那就是使用老朋友 Validation。 # Categorical features / Decision subset 有時候得到的資料不是數值資料而是類別資料。 例如一個病人的資料可能有一個 Dimension 叫做「主要症狀」,而主要症狀可能有「發燒、疼痛、疲累、盜汗」,這時候就可以使用 Decision subset。 Decision subset 就是看當前的 $x_{n}$ 是否有落在某個 subset 內,例如說 subset 可能是 「發燒 或 盜汗」,那麼該 Decision subset 就是檢查 $x_{n}$ 是否是發燒或是盜汗;最終找到使得 $E_{in}$ 最小的 subset 回傳回去。 :::info C&RT 的特色 2: - 容易處裡 Categorical features ::: # Missing features / surrogate branch 有時候可能資料的某些維度值會不見,這時候就可以使用決策樹的好處,再疊加 Heuristic 上去。 例如說當前正在判斷體重有沒有大於 50,如果沒有體重資料的話,可以拿身高大於 150 公分來做判斷。 拿身高來代理,就是依照所需情況去疊加 Heuristic。 但是要注意,替代方案切下去得到的「方式要是一致的」 :::success 老師沒說方式一致是甚麼意思,但應該是指切出來的兩堆資料差異不可以太大。 ::: :::info C&RT 的特色 3: - 容易處裡 Missing features ::: # 跟 AdaBoost-Stump 比較 由於決策樹每切一刀,都是在「某個條件下」去純化,所以會比每次都找一個維度來切的 AdaBoost-Stump 更有效率。 # 特色統整 - 可解釋性高 - 容易處理 Multiclass - 容易處理 Categorical - 容易處理 Missing - 很高效的處理非線性資料 # C4.5 另一個有名的決策樹。 CART 在純化數的時候是使用 Gini Index (Multi classifiaction),而 C4.5 則是使用「信息增益 Information Gain」。 ## 信息增益 信息熵定義: $$ H(T)=I_{E}(p_{1},p_{2},...,p_{J})=-\sum_{i=1}^{J}p_{i}log_{2}p_{i} $$ 而信息增益為: $$ IG(T,a)=\overbrace{H(T)}^{\text{Parents' Entropy}}-\overbrace{H(T|a)}^{\text{Weighted Sum of Children's Entropy}}\\ =-\sum_{i=1}^{J}p_{i}log_{2}p_{i} - \sum_{a}p(a)\sum_{i=1}^{J}-Pr(i|a)log_{2}Pr(i|a) $$ 其中: - $p_{1},p_{2},...$ 是各個「目標類別 $y_{n}$」的機率,加總會等於 1。 - 也就是輸出的 Class 的機率,跟 Gini Index 的機率一樣意思。 - $p(a)$ 是 $x_{n}$ 以某個維度分類,看該維度有幾種類別,第 a 種的機率就是 $p(a)$ - $Pr(i|a)$ 就是在第 a 種的條件下,「目標類別 $y_{n}$」的機率 最後看哪個維度的信息增益最高,就以該維度作為劃分。 :::warning 建議搭配下面例子服用,會更容易理解。 ::: ## 例子 - [摘自維基百科](https://zh.wikipedia.org/zh-tw/%E5%86%B3%E7%AD%96%E6%A0%91%E5%AD%A6%E4%B9%A0#%E4%BF%A1%E6%81%AF%E5%A2%9E%E7%9B%8A) 數據集有 4 個屬性,或者說維度: - `outlook (sunny, overcast, rainy)` - `temperature (hot, mild, cool)` - `humidity (high, normal)` - `windy (true, false)` 目標值,或者說 $y_{n}$: - `play(true, false)` 總共 14 個數據點 使用屬性 `windy` 做劃分時,產生 2 個子節點,`windy` 值為 `true` 與為 `false`。當前數據集: - 6 個數據點的 `windy` 值為 `true`,其中: - 3 個點的 `play` 值為 `true` - 3 個點的 `play` 值為 `false` - 其餘 8 個數據點的 `windy` 為 `false`,其中: - 6 個點的 `play` 值為 `true` - 2 個點的 `play` 值為 `false`。 `windy = true` 的子節點的信息熵計算為: $$ p(\text{play is true}|\text{windy is true})=\frac{3}{6}\\ p(\text{play is false}|\text{windy is true})=\frac{3}{6}\\ I_{E}([3,3])=-\frac{3}{6}log_{2}\frac{3}{6}+-\frac{3}{6}log_{2}\frac{3}{6}=1 $$ `windy = false` 的子節點的信息熵計算為: $$ p(\text{play is true}|\text{windy is false})=\frac{6}{8}\\ p(\text{play is false}|\text{windy is false})=\frac{2}{8}\\ I_{E}([6,2])=-\frac{6}{8}log_{2}\frac{6}{8}+-\frac{2}{8}log_{2}\frac{2}{8}=0.8112781 $$ 使用屬性 `windy` 劃分的信息熵是兩個子節點信息熵的加權和: $$ p(\text{windy is true})=\frac{6}{14}\\ p(\text{windy is false})=\frac{8}{14}\\ I_{E}([3,3],[6,2])=I_{E}(\text{windy or not})=\frac{6}{14}\cdot 1+\frac{8}{14}\cdot 0.8112781=0.8921589 $$ - $p(\text{windy is true})$ 就是 $x_{n}$ 以 windy 這個維度分類,該維度有 2 種類別,為 true 的機率,也就是上面提到的 $p(a)$ - $p(\text{play is true}|\text{windy is false})$ 就是在 $\text{windy is false}$ 的條件下,「目標類別 $\text{play is true}$」的機率,也就是上面提到的 $Pr(i|a)$ 最後計算最初未劃分的數據集的信息熵,數據集的 `play` 有 9 個 `true` 與 5 個 `false`: $$ H(T)=I_{E}([9,5])=-\frac{9}{14}log_{2}\frac{9}{14}+-\frac{5}{14}log_{2}\frac{5}{14}=0.940286 $$ 於是我們可以知道使用屬性 `windy` 的信息增益是: $$ IG(\text{windy})=I_{E}([9,5])-I_{E}([3,3],[6,2])=0.940286-0.8921589=0.0481271 $$