集成學習是機器學習算法中非常強大的工具,有人把它稱為機器學習中的“屠龍刀”,非常萬能且有效,在各大機器學習、數據挖掘競賽中使用非常廣泛。它的思想非常簡單,集合多個模型的能力,達到“三個臭皮匠,賽過諸葛亮”的效果。集成學習中概念是很容易理解的,但是好像沒有同一的術語,很多書本上寫得也不一樣,越看越模糊。這里我把集成學習分為兩個大類,第一大類稱為模型融合,與台大機器學習技法課上的blending概念相似,模型融合其實是個再學習的過程。第一步是訓練出多個不同的強學習器,然后考慮如何將這多個學習器組合起來,更進一步提高性能。第二大類稱為機器學習元算法,這類算法本身就是多模型組合的結果,只是元算法中的基算法(base_algorithm一般會比較弱),稱為弱模型的組合,例如RF、GDBT。
一、模型融合
實際中,我們總可以根據實際問題,訓練出多個功能強大學習器,為了進一步提高學習器的能力,可以嘗試將這些學習組合起來,這個過程就是模型融合。一般來說模型能在一定程度上提高性能,有時使模型的預測能力更加強大,有時增加模型的泛化能力,顯而易見的壞處是多模型的學習加上再學習的過程會增加計算的代價。模型融合在競賽中十分常見,屢試不爽,融合方法恰當,一般能提高成績。
1.1 常用的獲得不同模型的方法
- 由於不同的訓練模型得到不同的模型,例如處理分類的LR、SVM、RF等
- 由於同一訓練模型調節不同參數獲得不同的模型,例如GDBT中迭代次數,每個樹的復雜度等
- 有些算法本身就有一定的隨機性,如PLA
- 由於訓練數據不同得到不同的模型,如交叉驗證、隨機抽樣
- 。。。上面這些生成不同模型可以組合生成更多不同的模型,比較常用的是最前面的兩個
1.2 模型融合的方法
- 通過驗證(validation)的方式,從第一步中訓練出的多個模型中挑選最佳的模型,作為最終的模型。這種方式必須要驗證,不同使Ein最小,否則很容易過擬合。
- 統一融合(Uniform blending),分類時使用一人一票的投票方式,回歸時使用多個模型的平均值。這種方式的優點是一般泛化能力會得到加強,但是只能保證比那些模型中最差的模型要好,不能保證能得到比那些不同模型中的最好的模型要好
- 線性融合(Linear blending),二次學習,使用線性模型將第一步中學習到的學習器組合起來,用得好可以提高模型性能,但是要注意有過擬合的風險。
- 堆融合(Any blending、stacking),任何其它非線性模型將那些學習器組合起來,有過擬合的風險,注意驗證。
模型融合在實際中十分常見,下面是台大在2011KDDCup獲得冠軍時使用的模型融合方法,先用了any blending (stacking)處於領先群的位置,最后的linear blend使得台大獲得冠軍。
二、機器學習元算法
機器學習元算法分為兩類:Averaging methods 和 Boosting methods
- Averaging methods 核心是引入隨機(對樣本、特征屬性隨機取樣)學習產生多個獨立的模型,然后平均所有模型的預測值。一般而言,這種方法,會減小方差(variance),不太會過擬合。主要包括bagging、RF。
- Boosting methods 逐步加強方法,該方法集合學習多個模型,提高模型的准確率。不同的是,它是基於前面模型的訓練結果(誤差),生成新的模型,從而減小偏差(bias)。一般而言,這種方法會比上者的准確率高一點,但是也不是絕對的。它的缺點是有過擬合的風險,另外,由於它每個模型是“序列化”(有前后關系)產生的,不易並行化。它的代表是AdaBoost、GDBT。
2.1 Bagging
Bagging 在原始樣本中隨機抽樣獲取子集,用隨機抽樣的子集訓練基學習器(base_estimator),然后對每個基學習器的結果求平均,最終得到的預測值。隨機獲取樣本子集的方法有很多中,最常用的是有放回抽樣的booststrap,也可以是不放回的抽樣。基學習器可以是相同的模型,也可以是不同的,一般使用的是同一種基學習器,最常用的是DT決策樹。由於bagging提供了一種降低方差(variance)的方式,所以一般會使用比較強、復雜的基學習器模型(e.g.fully developed decision trees),作為對比在boosting方法中會使用非常弱的基學習器模型(e.g. shallow decision trees)。在sklearn中實現了基於bagging的分類和回歸方法,主要設置參數為基學習器的類型、迭代次數(子模型的個數)、獲取訓練子集的方式。由於bagging訓練每個模型可以並行,還可以設置n_jobs訓練模型使用的多少個cpu核。
2.2 隨機森林(RF)
RF在實際中使用非常頻繁,其本質上可bagging並無不同,只是RF更具體一些。一般而言可以將RF理解為bagging和DT(CART)的結合。RF中基學習器使用的是CART樹,由於算法本身能降低方差(variance),所以會選擇完全生長的CART樹。抽樣方法使用bootstrap,除此之外,RF認為隨機程度越高,算法的效果越好。所以RF中還經常隨機選取樣本的特征屬性、甚至於將樣本的特征屬性通過映射矩陣映射到隨機的子空間來增大子模型的隨機性、多樣性。RF預測的結果為子樹結果的平均值。RF具有很好的降噪性,相比單棵的CART樹,RF模型邊界更加平滑,置信區間也比較大。一般而言,RF中,樹越多模型越穩定。
2.3 AdaBoost
AdaBoost 是一種Boosting方法,與Bagging不同的是,Adaboost中不同的子模型必須是串行訓練獲得的,每個新的子模型都是根據已訓練出的模型性能來進行訓練的,而且Boosting算法中基學習器為弱學習。弱學習器可以理解為只比隨機猜測好一點,在二分類情況下,錯誤率略低0.5即可,實際中常使用 small decision trees。AdaBoost中每個訓練樣本都有一個權重,這些權重構成了一個向量W,初始值都為為。Adaboost中每次迭代生成新的子模型使用的訓練數據都相同,但是樣本的權重會不一樣。AdaBoost會根據當前的錯誤率,增大錯誤樣本權重,減小正確樣本權重的原則更新每個樣本的權重。不斷重復訓練和調整權重,直到訓練錯誤率或弱學習器的個數滿足用戶指定的值為止。Adaboost的最終結果為每個弱學習器加權的結果。使用sklearn中的Adaboot時,主要調節的參數有n_estimator(多少棵樹)、max_depth(每棵樹的深度。復雜度)或者min_samples_leaf(最少的葉子節點)。
2.4 GDBT
GDBT也是一種Boosting方法,每個子模型是根據已訓練出的學習器的性能(殘差)訓練出來的,子模型是串行訓練獲得,不易並行化。GDBT使用非常廣泛的,能分類,能回歸預測。GDBT基於殘差學習的算,沒有AdaBoost中的樣本權重的概念。GDBT結合了梯度迭代和回歸樹,准確率非常高,但是也有過擬合的風險。GDBT中迭代的殘差的梯度,殘差就是目前結合所有得到的訓練器預測的結果與實際值的差值,不理解可以參考另一篇博客,里面有一個實例介紹如何基於殘差來學習預測人的年齡。GDBT的使用也非常的簡單,主要調節的參數有確定需要多少棵樹(n_estimator)、每棵樹的復雜度(max_depth,max_leaf_node)、損失函數(loss)以及學習率(learning_rating)。為了防止過擬合一般學習率會選小一點的(<0.1),learning_rate會影響n_estimator,需要權衡,選擇最佳的組合參數。