1、baggingbootstrap
用於基礎模型複雜、容易過擬合的狀況,用來減少 variance(好比決策樹)。基礎模型之間沒有太多聯繫(相對於boosting來講),訓練能夠並行。但用 bagging 並不能有助於把數據擬合的更準(那是減少 bias,要用 boosting)。app
每次訓練一個基礎模型,都從 N 條訓練數據中有放回的隨機抽取出(bootstrapping) N' 條做爲訓練集(雖然通常 N = N',但因爲是有放回的抽,因此具體的數據仍是不一樣的)。dom
模型作預測的時候用 average(迴歸)或者 voting(分類)。函數
Out-of-bag validation(self-validation)學習
用 bagging 方法不必定要把訓練數據切分紅訓練集和驗證集。由於每輪隨機採樣都會有一部分數據沒有被採樣到,能夠用這部分數據來驗證模型的泛化能力。並且理論上有 1/e 比例的數據是歷來不會被採樣出去(一輪沒有被採樣的機率是1-1/N,N 輪都沒被採樣到的機率是 (1 - 1/N)N ,當 N = ∞ 時極限是 1/e)。測試
例如,訓練基礎模型的數據狀況以下表優化
那就能夠用 f2+f4 在 x1 上測試;f2+f3 在 x2 上測試;...ui
據此,能夠不用單獨分一個驗證集出來,直接用 OOB error 來衡量就好了,實作效果也是比較準確。spa
Random Forest(對 decision tree 的 bagging)3d
能夠做出比較平滑的決策邊界。
特色:
1. 限定使用 CART 決策樹做爲基礎模型
2. 只是有放回的 resample 訓練數據是不夠的(只這樣作的話,獲得每棵樹都會差很少)。還須要每次分裂的時候隨機限制一些特徵不能用(在剩下的 p' 維特徵中選擇最優特徵進行 split),p' 越小意味着獲得的決策樹模型魯棒性越好(但同時對訓練數據的擬合確定也會變差),至關於 variance會變小但 bias 會變大,經過交叉驗證選擇一個合適的 p'
3. 對單棵樹不剪枝,以此來減少單棵樹的 bias(讓其「專精於」那一部分特徵,因此 RF 中的決策樹比較深),再借助 bagging 減少總體模型的variance(至關於從不一樣的角度解決問題)
進一步的考慮 diversifying feature expansion,每次分裂的時候只隨機選擇一部分特徵來考慮,至關於輸入 x 乘上一個隨機投影矩陣 p。更 powerful 的作法是,隨機選擇一部分特徵並且還作隨機組合的投影(特徵重組)。(在這種狀況下的分割就很像是 perceptron 了)
基於 permutation test 的特徵選擇
若是某一維特徵很重要,那麼加入一些隨機噪聲(好比高斯)後,模型結果應該會變差。或者對數據的某一個維度作隨機從新排列(permutation),從新訓練模型後衡量到底變差多少。
若是不想徹底從新訓練模型呢?在驗證的時候,算 gt(xn) 的某個時刻會用到 xn, i 的值,就換成從,對 gt 來講 OOB 的數據中隨機選取的值,選出來的就仍是 OOB 的值。
對 RF 的總結:bagging of randomized CART trees with automatic validation and feature selection
Isolation Forest(異常檢測)
相似 Random Forest ,不一樣點:
1. 採樣個數 N' 遠小於訓練樣本個數 N。由於只須要部分樣本就可以檢測出異常點了。
2. 創建決策樹時,隨機選擇特徵 + 隨機選擇閾值來 split 。
3. 最大決策樹深度選擇一個比較小的值,緣由同 1 。
對於測試樣本 x,把其擬合到 T 棵決策樹,計算該樣本的葉子結點深度 ht(x),進一步計算出平均深度 h(x)。樣本點是異常的機率爲:
s(x, N) = 2 -h(x)/c(N) ; 其中 c(N) = 2log(N-1) + ξ - 2(N-1)/N , ξ 爲歐拉常數。取值範圍在[0, 1] ,越大越多是異常點。
2、boosting
強力的保證:只要基礎分類器可以在訓練集上實現小於 50% 的錯誤率,使用 boosting 就能在訓練集上實現 0% 錯誤率。
boosting 方法中,基礎模型的訓練是有順序的、迭代的(新的基礎模型去補強已有的基礎模型)。
怎麼實如今不一樣的訓練集上訓練模型?
1. resampling
2. reweighting
3. 實際應用的時候給樣本不一樣的權重係數就好了。
boosting 方法圍繞四個基本問題展開:
1. 如何計算偏差率 ε
2. 如何獲得基礎分類器的權重 α
3. 如何更新樣本權重係數 u
4. 如何綜合全部的基礎分類器
Adaboost
主要思想:在讓 f1(x) 的分類效果變成隨機的新的訓練集上訓練 f2(x) ;... ;以此類推訓練新的基礎分類器,綜合起來就是總體分類器。(前向分步學習的加法模型)
二分類問題,輸出爲{+1, -1}。在訓練集上訓練 f1(x) 獲得小於 0.5 的錯誤率。Z 爲規範化因子
改變訓練樣本的權重參數 u ,令 f1(x) 的錯誤率等於 0.5 (變成隨機分類器的效果);
在新的訓練集上訓練 f2(x) 獲得小於 0.5 的錯誤率;
...
具體怎麼求解新的樣本參數 u ?(強調被錯誤分類的樣本的影響)
初始化 u1 = [1, 1, ..., 1]T,N維向量。若是第 i 個樣本 xi 被 ft(x) 正確分類,就減少其權重參數 uit (除以dt);反之,若是被分錯就增大 uit (乘dt)。
d 的計算也很簡單,t+1 時刻的樣本權重係數要讓ft(x) 錯誤率等於 0.5
dt = ( (1 - εt)/εt )1/2 ,因爲前提是 ft(x) 的錯誤率必定小於 0.5,因此 d > 1。
統一乘除兩種狀況的形式:令 αt = log dt ;乘 dt 等價於乘 exp(αt),除以 dt 等價於乘 exp(-αt)
想辦法把負號和分類狀況聯繫起來,最後結果爲:ut+1i = uti * exp(-yi * ft(xi) * αt )
獲得 T 個基礎分類器後,綜合模型 H(x) = sign(Σ αt * ft(x)),sum for t = 1, 2, ..., T。
爲何要作 weighted sum 呢?—— 錯誤率低的 ft 對應的 αt 比較大,對最後結果影響就更大,這樣綜合基礎分類器是比較合理的。
證實 Adaboost 可以在訓練集上實現 0% 的錯誤率
計算 H(x) 的錯誤率,發現其存在上界 exp( -yi * g(xi) )
證實了錯誤率的上界會愈來愈小,以及 Adaboost 的損失函數是指數函數。
設 Zt 是訓練 ft 的權重參數之和,能夠獲得 ZT+1 的表達式,發現exp裏面正好出現了g(x) = Σ αt * ft(x),得證T個基礎分類器構成的模型在訓練集的錯誤率上界訓練集錯誤率上界等於 ZT+1 / N
這也等價於證實了訓練樣本權重的平均值會愈來愈小。
根據 Z 的遞推公式,發現 Z 是隨 t 單調減,得證。
margin
Boosting 的通常形式(從損失函數的角度解釋 Adaboost)
定義優化目標爲最小化剛纔求解出來的錯誤率上界(指數函數的 loss):
怎麼實現這個優化過程呢? —— 用gradient descent
Gradient Boosting
L 對函數 g 求梯度,獲得更新公式
要找到一個 ft(x) ,乘上權重 αt 後加到 gt-1(x) 裏面,和梯度降低求解獲得的對 g(x) 的更新同樣,那就讓 ft(x) 和負梯度方向一致,即內積越大越好。(先看方向,用總體損失函數的負梯度擬合第 t 輪的損失值)
轉換後的優化目標以下,至關於最小化 ft(x) 在權重參數爲 ut 的訓練集上的偏差(由於要找到 ft(x) 最大化下面這個求和式子,就要讓 ft(x) 可使得儘量多的 n 讓 yn * ft(xn) 大於0),而 exp(-yn* gt(xn)) 剛好等於 utn ,
而 αt 如何肯定呢?求導令其等於0(由於要找到一個αt 令 L(g) 最小)。能夠發現:令 L 對 αt 偏導數爲 0 獲得的解,和Adaboost 中的 αt 定義相同。
3、stacking
各作各的,而後把前面已經有的模型輸出做爲最後一個 layer 的 new features,並且訓練數據要分紅兩個部分,一部分用來訓練前面的系統,另外一部分用來訓練 Final classifier。