迴歸樹(Regression Tree)

wuliytTaotao發表於2019-04-17

說到決策樹(Decision tree),我們很自然會想到用其做分類,每個葉子代表有限類別中的一個。但是對於決策樹解決迴歸問題,一直是一知半解,很多時候都是一帶而過。

對於一個迴歸問題,我們第一時間想到的可能就是線性迴歸(linear regression),當線性迴歸不好的時候,可能想著用 SVR(Support Vector Regression)試試。但迴歸樹(regression tree)也很重要,現在 shallow learning 被 SVM 和樹模型統治,隨機森林、GBDT、xgboost、lightGBM 大行其道,所以知道什麼是迴歸樹很有必要。

常用的決策樹有 ID3、C4.5、CART 等,其中 CART 就可以用來做迴歸問題,CART 全稱就是 Classification And Regression Tree(分類和迴歸樹)。至於 ID3 和 C4.5,能不能用來做迴歸問題,等了解完 CART 迴歸樹再討論。

接下來我們介紹將 CART 用於迴歸問題。

迴歸樹

迴歸樹(regression tree),顧名思義,就是用樹模型做迴歸問題,每一片葉子都輸出一個預測值。預測值一般是該片葉子所含訓練集元素輸出的均值,即 \(c_{m} = ave(y_i | \bm x_i \in leaf_m)\)

CART 在分類問題和迴歸問題中的相同和差異:

  • 相同:
    • 在分類問題和迴歸問題中,CART 都是一棵二叉樹,除葉子節點外的所有節點都有且僅有兩個子節點;
    • 所有落在同一片葉子中的輸入都有同樣的輸出。
  • 差異:
    • 在分類問題中,CART 使用基尼指數(Gini index)作為選擇特徵(feature)和劃分(split)的依據;在迴歸問題中,CART 使用 mse(mean square error)或者 mae(mean absolute error)作為選擇 feature 和 split 的 criteria。
    • 在分類問題中,CART 的每一片葉子都代表的是一個 class;在迴歸問題中,CART 的每一片葉子表示的是一個預測值,取值是連續的。

下面以 criteria = 'mse' 為例,介紹 CART 迴歸樹。

理論解釋

給定一個資料集 \(D = \{(\bm x_1, y_1), (\bm x_2, y_2), ..., (\bm x_i, y_i), ...,(\bm x_n, y_n)\}\),其中 \(\bm x_i\) 是一個 m 維的向量,即 \(x_i\) 含有 m 個 features。

迴歸問題的目標就是構造一個函式 \(f(\bm x)\) 能夠擬合資料集 \(D\) 中的元素,使得 mse 最小,即:
\[ \min \frac{1}{n} \sum_{i = 1}^{n} (f(\bm x_i) - y_i)^2 \tag{1} \]

用 CART 進行迴歸,目標自然也是一樣的,最小化 mse。

假設一棵構建好的 CART 迴歸樹有 \(M\) 片葉子,這意味著 CART 將輸入空間 \(\bm x\) 劃分成了 \(M\) 個單元 \(R_1, R_2, ..., R_M\),同時意味著 CART 至多會有 \(M\) 個不同的預測值。CART 最小化 mse 公式如下:
\[ \min \frac{1}{n} \sum_{m = 1}^{M}\sum_{\bm x_i \in R_m} (c_m - y_i)^2 \tag{2} \]
其中,\(c_m\) 表示第 \(m\) 片葉子的預測值。
想要最小化 CART 總體的 mse,只需要最小化每一片葉子的 mse 即可,而最小化一片葉子的 mse,只需要將預測值設定為葉子中含有的訓練集元素的均值,即:
\[ c_{m} = ave(y_i | \bm x_i \in leaf_m) \tag{3} \]

所以,在每一次的劃分中,選擇切分變數(splitting variable)和切分點(splitting point)時(也就是選擇 feature 和將該 feature space 一分為二的 split),使得模型在訓練集上的 mse 最小,也就是每片葉子的 mse 之和最小。

這裡採用啟發式的方法,遍歷所有的切分變數和切分點,然後選出 葉子節點 mse 之和最小 的那種情況作為劃分。選擇第 \(j\) 個 feature \(\bm x^{(j)}\) 和它取的值 \(s\),作為切分變數和切分點,則切分變數和切分點將父節點的輸入空間一分為二:
\[ \begin{split} R_1\{j, s\} = \{\bm x| \bm x^{(j)} \le s\} \\ R_2\{j, s\} = \{\bm x| \bm x^{(j)} > s\} \end{split} \tag{4} \]

CART 選擇切分變數 \(j\) 和 切分點 \(s\) 的公式如下:
\[ \min_{j, s} \left[\min_{c_1} \sum_{\bm x_i \in R_1\{j, s\}} (y_i - c_1)^2 + \min_{c_2} \sum_{\bm x_i \in R_2\{j, s\}} (y_i - c_2)^2 \right] \tag{5} \]

採取遍歷的方式,我們可以將 \(j\)\(s\) 找出來:先固定 feature \(j\) 再選出在該 feature 下的最佳劃分 \(s\);對每一個 feature 都這樣做,那麼有 \(m\) 個feature,我們就能得到 \(m\) 個 feature 對應的最佳劃分,從這 \(m\) 個值中取最小值即可得到令全域性最優的 \((j, s)\)。式(5)中,第一項 \(\min_{c_1} \sum_{x_i \in R_1\{j, s\}} (y_i - c_1)^2\) 得到的 \(c_1\) 值按照式(3)就是 \(ave(y_i | \bm x_i \in R_1\{j, s\})\),同理,第二項中 \(c_2 = ave(y_i | \bm x_i \in R_2\{j, s\})\)

演算法流程

最小二乘法迴歸樹生成演算法

ID3 和 C4.5 能不能用來回歸?

CART 是一棵二叉樹,那麼只要迴歸樹不是一棵二叉樹,那麼就不是 CART 樹了。

在分類問題中,ID3、C4.5 和 CART 的區別就在與劃分子節點的策略不同,資訊增益、增益比、基尼指數;而在迴歸問題中,criteria 是 mse 或者 mae,這種情況下,分類時的 ID3、C4.5、CART 之間的區別就沒了,那麼就是每個父節點劃分成多少個子節點的問題了,如果還是二叉樹,那麼就認為是 CART 迴歸樹,否則就不是了。

如果你在同一個時刻對某一個 feature \(\bm x^{(j)}\) 選擇兩個切分點 \(s_1\)\(s_2\) 來劃分父節點,那麼就將產生三個區間 \(R_1\{j, s_1\}, R_2\{j, s_1, s_2\}, R_3\{j, s_2\}\),這種做法無疑增大了遍歷的難度,如果選擇更多個切分點,那麼遍歷的難度會指數上升。如果我們想要細分多個區域,讓 CART 迴歸樹更深即可,這樣遍歷的難度會小很多。

所以,固然可以構建非 CART 迴歸樹,但是不如 CART 迴歸樹來的更簡單。

迴歸樹示例

Decision Tree Regression -- scikit-learn

References

《統計學習方法》-- 李航
Decision Tree Regression -- scikit-learn

相關文章