機器學習 —— 決策樹及其集成算法(Bagging、隨機森林、Boosting)


本文為senlie原創,轉載請保留此地址:http://www.cnblogs.com/senlie/

 

決策樹
---------------------------------------------------------------------
1.描述:
以樹為基礎的方法可以用於回歸和分類。
樹的節點將要預測的空間划分為一系列簡單域
划分預測空間的規則可以被建模為一棵樹,所以這種方法也叫決策樹方法
bagging,隨機森林,boosting 是多棵決策樹組合起來采用投票方式產生一個預測結果的方法
機制來產生預測結果


2.如何選特征:
回歸樹:RMSE(Root Mean Square Error)
分類樹:信息增益、基尼系數

3.回歸樹:
RMSE :
假設一個集合被划分為 M 部分,$c_m$ 表示第 m 部分的值,則預測值為
$$f(x) = \sum_{m = 1}{M}{c_m I(x \in R_m)}$$
$\hat{y}_{m}$是 $R_m 子$集的平均值
$$RMSE = \sum_{j = 1}^J\sum_{i \in R_j}{(y_i - \hat{y}_{R_j})^2}$$
其中 $\hat{y}_{R_j} $是落入 $R_j$的樣本的平均值
建樹的過程是一種自頂向下的貪心的遞歸二分划分方法。
自頂向下:從樹的根開始不斷地將預測空間划分為兩個子空間
貪心:每次划分都選擇當前最優的方法,而不選擇那些可能在將來會導致更好划分的方法
建樹的過程:
1).選擇最優切分變量 j 與切分點 s。遍歷變量 j,對固定的切分變量 j 掃描切分點 s ,
選擇使 RMSE 達到最小值的對(j, s)
2).用選定的對(j, s) 切分區域 R1 和 R2 並決定相應的輸出值 c1 和 c2
$$R_1(j, s) = \{X | X_j \le s\} , R_2(j, s) = \{X | X_j > s\}$$
$$c_1 = ave(y_i | x_i \in R_1(j, s)) , c_2 = ave(y_i | x_i \in R_2(j, s))$$
3).繼續對兩個子區域調用步驟1)、2),直到滿足停止條件

4.分類樹:

4.1信息增益:
X的熵 $H(X) = -p_1\log p_1 - p_2\log p_2 -\cdots - p_n\log p_n = -\sum_{i=1}^n{p_i\log p_i}$
熵表示了信息的不確定性(也即混亂性),熵越大,信息越混亂,越難預測。
比如,
如果變量 X 服從統一分布的,由於 X 的各個值出現的概率一樣,很難預測 X 的值,所以 X 的熵很大
如果變量 X 的概率分布圖是類似山峰形狀的,在某幾個點的概率很大,那么預測 X 的值為那幾個點中的某一個命中的概率就很大,所以 X 的熵很小
某一具體條件熵-->在 X 的值為 v 的條件下,Y 的信息熵
$$H(Y|X = v)$$
條件熵
$$H(Y|X) = \sum_i{p(X=v_i)H(Y|X=v_i)}$$
信息增益-->如果按照某個特征划分數據,那么信息不確定性能減少多少
$$IG(Y|X) = H(Y) - H(Y|X)$$
選擇信息增益最大的特征來划分數據

示例:

解釋左圖的計算方法,右圖類似
-(9/14 * log(9/14) + 5/14 * log(5/14)) = 0.940
-(3/7 * log(3/7) + 4/7 * log(4/7)) = 0.985
-(6/7 * log(6/7) + 1/7 * log(1/7)) = 0.592
I(S|Income) --> 表示數據集合 S 按照 Income 特征划分為子集后信息不確定性減少量
= 0.940 - (7/14)*0.985 - (7/14)*0.592
= 0.151
上面的示例中因為選擇特征 Income 來划分集合的信息增益最大,所以應該選擇 Income


4.2基尼系數:
假充集合 T 包含 N 個類別,第 j 個類別的概率是 $P_j$,則這個集合的基尼系數為
$$Gini(T) = -\sum_{i=1}^n{p_i\log p_i}$$
按某個特征划分為 m 個子集,第 i 個子集的大小為 $N_i$,則划分后子集的基尼系數為
$$Gini_{split}(T) = \frac{N_1}{N}Gini(T_1) + \cdots + \frac{N_m}{N}$$
選擇能使划分后基尼系數最小的特征來划分當前集合

建樹的過程:
1).選擇一個"最好"的特征A來划分節點
2).對於特征A的每一個值,創建出一個分支來划分樣本
3).重復步驟1),2)直到信息增益或基尼系數足夠小

5.剪枝
todo

Bagging
------------------------------------------------------------------
算法過程:
1).從訓練集中采樣得到新的訓練集
2).重復步驟1 B次得到B個新的訓練集,針對B個不同的訓練集分別訓練一棵樹
3).平均每一棵樹的預測值或采用少數服從多數得到分類結果
$$\hat{f}_{bag} = \frac{1}{B} \sum_{b=1}^B \hat{f}^b(x)$$

Out-of-Bag Error Estimation:
可以采用步驟1過程中沒有采樣到的數據作為對應訓練集生成的樹的測試集評估訓練結果

Random Forests
-------------------------------------------------------------------
算法過程:
1).從訓練集中采樣得到新的訓練集
2).重復步驟1 B次得到B個新的訓練集,針對B個不同的訓練集分別訓練一棵樹
3).訓練樹的過程中,先從所有特征中隨機選擇 m 個特征作為候選,然后再從
這 m 個特征中選擇最優的一個來划分預測空間

比較:
Bagging : m = p
Random Forests : m = $\lfloor{\sqrt{p}}\rfloor$ (分類) , m = $\lfloor{p/3}\rfloor$ (回歸)
p 為所有特征數

Boosting
------------------------------------------------------------------
回歸問題算法過程:
1).設初值,設預測值 $\hat{f}(x) = 0 $, 對於訓練集里的每一個樣本,設殘差 $r_i = y_i$
2). 對於 b = 1,2,...,B,重復以下步驟:
2.1) 對於訓練集(X, r),分裂 d 次生成一棵樹 $\hat{f}^b$ --> (注意是訓練集(X,r),不是(X,y))
2.2) 用一個收縮系統 $\lambda$ 更新 $\hat{f}$ :$\hat{f} = \hat{f} + \lambda\hat{f}^b(x)$
2.3) 更新殘差: $r_i = r_i - \lambda\hat{f}^b(x_i)$
3).輸出 boosted 了的模型: $\hat{f}(x)$

調節參數:
1).樹的數量 B。如果 B 太大容易 overfitting
2).收縮參數 $\lambda $。這個參數控制 boosting 的學習率
3).每棵樹分裂的次數 d。 這個參數控制 boosted 集成模型的復雜度。一般 d 選擇 1,即生成的決策樹是樹樁

分類問題算法過程:

1).W(x) 是 N 個訓練樣本的權重分布。 $\sum{W(x_i)} = 1$
2).初始化。對於所有樣本 x ,設置其權重 W(x) 為 1/N
3).在每一次迭代 k :
3.1) 用權重 $W_k(x)$ 生成最優的弱分類器 $C_k(x)$
3.2) 計算錯誤率
$\epsilon_k$  
3.3) 計算分類器的權重
$\alpha_k$ 
3.4) 更新樣本權重
$W_{k+1}(x_i)$ 
4).最終的分類器 : $C_{Final}(x) = sign(\sum{a_i C_i(x)})$
示例:


比較:
Bagging: 樹"並行"生成
Boosting:樹"串行"生成

 

GBDT
-----------------------------------------------------------------
boosting 是一種算法思路,它的基函數可以采用各種分類器、預測器。其中采用
決策樹為基函數的 boosting 就叫 GBDT,即 Gradient Boosting Decision Tree。

 


使用 MPI 並行化隨機森林算法
-----------------------------------------------------------------

算法過程:
輸入:訓練數據集 D ,建樹數目 N ,進程數目 n
輸出:N 棵決策樹 *T
1).分配要生成 N/n 棵決策樹的任務給每個進程,如果該進程為最后一個進行,則它要生產的
決策樹的數目為 N/n * (1 - n) + N;
2).對於每個進程,使用隨機森林算法生成 N/n (或N/n * (1 - n) + N)棵樹組成的森林
3).當生成完隨機森林,若該進程為從進程則發送已經生成好了的隨機森林參數給主進程;若該進程
為主進程則接收其他進程傳過來的隨機森林參數,並合並要一個決策樹數組 T
4).主進程將 N 棵決策樹組成的隨機森林模型參數存儲起來。

 

Q&A:
??隨機森林算法和 Adaboost 哪個比較容易過擬合
隨機森林算法比較容易過擬合。
1.隨機森林的決策樹嘗試擬合數據集,有潛在的過擬合問題,
而 boosting 的決策樹則是擬合數據集的殘差,然后更新殘差,由新的決策樹
再去擬合新的殘差。這雖然學得慢,但大大地降低了過擬合的風險
2.boosting 的每棵決策樹通常都很小,一般分裂次數只有 1,生成的決策樹一般是樹樁
3.通過收縮參數,可以放慢擬合的速度,允許更多不同的樹來擬合殘差。不同的樹帶來的是多樣性,
也降低了過擬合的風險

參考:


------------------------------------------------------------------

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM