Ensemble_learning 集成學習算法 stacking 算法


原文:https://herbertmj.wikispaces.com/stacking%E7%AE%97%E6%B3%95

stacked 產生方法是一種截然不同的組合多個模型的方法,它講的是組合學習器的概念,但是使用的相對於bagging和boosting較少,它不像bagging和boosting,而是組合不同的模型,具體的過程如下:
1.划分訓練數據集為兩個不相交的集合。
2. 在第一個集合上訓練多個學習器。
3. 在第二個集合上測試這幾個學習器
4. 把第三步得到的預測結果作為輸入,把正確的回應作為輸出,訓練一個高層學習器,
這里需要注意的是1-3步的效果與cross-validation,我們不是用贏家通吃,而是使用非線性組合學習器的方法
下面是weka的stacking方法的buildClassifier方法:

 

http://www.datakit.cn/blog/2014/11/02/Ensemble_learning.html

在機器學習和統計學習中, Ensemble Learning(集成學習)是一種將多種學習算法組合在一起以取得更好表現的一種方法。與 Statistical Ensemble(統計總體,通常是無限的)不同,機器學習下的Ensemble 主要是指有限的模型相互組合,而且可以有很多不同的結構。相關的概念有多模型系統、Committee Learning、Modular systems、多分類器系統等等。這些概念相互之間相互聯系,又有區別,而對這些概念的界定,業界目前還沒有達成共識。

本文主要參考wikipedia, wikipedia中參考文章不再羅列!部分參考scholarpedia。本文對Ensemble方法僅作概述!

目錄

1.Overview

機器學習中,監督式學習算法(Supervised learning)可以描述為:對於一個具體問題,從一堆”假設”(hypothesis space,”假設”空間)中搜索一個具有較好且相對穩定的預測效果的模型。有些時候,即使”假設”空間中包含了一些很好的”假設”(hypothesis) ,我們也很難從中找到一個較好的。Ensemble 的方法就是組合多個”假設”以期望得到一個較優的”假設”。換句話說,Ensemble的方法就是組合許多弱模型(weak learners,預測效果一般的模型) 以得到一個強模型(strong learner,預測效果好的模型)。Ensemble中組合的模型可以是同一類的模型,也可以是不同類型的模型。

Ensemble方法對於大量數據和不充分數據都有很好的效果。因為一些簡單模型數據量太大而很難訓練,或者只能學習到一部分,而Ensemble方法可以有策略的將數據集划分成一些小數據集,分別進行訓練,之后根據一些策略進行組合。相反,如果數據量很少,可以使用bootstrap進行抽樣,得到多個數據集,分別進行訓練后再組合(Efron 1979)。

使用Ensemble的方法在評估測試的時候,相比於單一模型,需要更多的計算。因此,有時候也認為Ensemble是用更多的計算來彌補弱模型。同時,這也導致模型中的每個參數所包含的信息量比單一模型少很多,導致太多的冗余!

注:本文直接使用Ensemble這個詞,而不使用翻譯,如“組合”等等

2.Ensemble theory

Ensemble方法是監督式學習的一種,訓練完成之后就可以看成是單獨的一個”假設”(或模型),只是該”假設”不一定是在原”假設”空間里的。因此,Ensemble方法具有更多的靈活性。理論上來說,Ensemble方法也比單一模型更容易過擬合。但是,實際中有一些方法(尤其是Bagging)也傾向於避免過擬合。

經驗上來說,如果待組合的各個模型之間差異性(diversity )比較顯著,那么Ensemble之后通常會有一個較好的結果,因此也有很多Ensemble的方法致力於提高待組合模型間的差異性。盡管不直觀,但是越隨機的算法(比如隨機決策樹)比有意設計的算法(比如熵減少決策樹)更容易產生強分類器。然而,實際發現使用多個強學習算法比那些為了促進多樣性而做的模型更加有效。

下圖是使用訓練集合中不同的子集進行訓練(以獲得適當的差異性,類似於合理抽樣),得到不同的誤差,之后適當的組合在一起來減少誤差。

3.Common types of ensembles

3.1 Bayes optimal classifier

貝葉斯最優分類器(Bayes Optimal Classifier)是分類技術的一種,他是”假設”空間里所有”假設”的一個Ensemble。通常來說,沒有別的Ensemble會比它有更好的表現!因此,可以認為他是最優的Ensemble(見Tom M. Mitchell, Machine Learning, 1997, pp. 175)。如果”假設”是對的話,那每一個”假設”對從系統中產生訓練數據的似然性都有一個投票比例。為了促使訓練數據集大小是有限的,我們需要對每個”假設”的投票乘上一個先驗概率。因此,完整的Bayes Optimal Classifier如下:
y=argmaxcjChiHP(cjhi)P(Thi)P(hi)

這里y是預測的類,C是所有可能的類別,H是”假設”空間,P是概率分布, T是訓練數據。作為一個Ensemble,Bayes Optimal Classifier代表了一個”假設”,但是不一定在H中,而是在Ensemble空間(是原”假設”空間里的”假設”的所有可能的Ensemble)里的最優”假設”。然而,在實際中的很多例子中(即使很簡單的例子),Bayes Optimal Classifier並不能很好的實現。實際中不能很好的實現Bayes Optimal Classifier的理由主要有以下幾個:

  • 1) 絕大多數”假設”空間都非常大而無法遍歷(無法 argmax了);
  • 2) 很多”假設”給出的結果就是一個類別,而不是概率(模型需要P(cjhi));
  • 3) 計算一個訓練數據的無偏估計P(Thi)是非常難的;
  • 4) 估計各個”假設”的先驗分布P(hi)基本是不可行的;

3.2 Bootstrap aggregating

Bootstrap aggregating通常又簡稱為Bagging(裝袋法),它是讓各個模型都平等投票來決定最終結果。為了提高模型的方差(variance, 差異性),bagging在訓練待組合的各個模型的時候是從訓練集合中隨機的抽取數據。比如隨機森林(random forest)就是多個隨機決策樹平均組合起來以達到較優分類准確率的模型。 但是,bagging的一個有趣應用是非監督式學習中,圖像處理中使用不同的核函數進行bagging,可以閱讀論文Image denoising with a multi-phase kernel principal component approach and an ensemble version 和 Preimages for Variation Patterns from Kernel PCA and Bagging。

3.3 Boosting

Boosting(提升法)是通過不斷的建立新模型而新模型更強調上一個模型中被錯誤分類的樣本,再將這些模型組合起來的方法。在一些例子中,boosting要比bagging有更好的准確率,但是也更容易過擬合。目前,boosting中最常用的方法是adaboost.

3.4 Bayesian model averaging

Bayesian model averaging (BMA, 貝葉斯模型平均)是一個尋求近似於Bayes Optimal Classifier 的方法,他通過從”假設”空間里抽樣一些”假設”,再使用貝葉斯法則合並起來。 與Bayes Optimal Classifier不同,BMA是可以實際實現的。可以使用 Monte Carlo sampling 來采樣”假設”。 比如, 使用Gibbs 抽樣(Gibbs sampling)來得到一堆”假設”P(TH)。事實證明在一定情況下,當這些生成的”假設”按照貝葉斯法則合並起來后,期望誤差不大於2倍的Bayes Optimal Classifier 的期望誤差。先不管理論上的證明,事實表明這種方法比簡單的Ensemble方法(如bagging)更容易過擬合、且表現更差。然而,這些結論可能是錯誤理解了Bayesian model averaging和model combination的目的(前者是為了近似Bayes Optimal Classifier,而后者是為了提高模型准確率)。

偽代碼如下:

function train_bayesian_model_averaging(T) z = -infinity For each model, m, in the ensemble: Train m, typically using a random subset of the training data, T. Let prior[m] be the prior probability that m is the generating hypothesis. Typically, uniform priors are used, so prior[m] = 1. Let x be the predictive accuracy (from 0 to 1) of m for predicting the labels in T. Use x to estimate log_likelihood[m]. Often, this is computed as log_likelihood[m] = |T| * (x * log(x) + (1 - x) * log(1 - x)), where |T| is the number of training patterns in T. z = max(z, log_likelihood[m]) For each model, m, in the ensemble: weight[m] = prior[m] * exp(log_likelihood[m] - z) Normalize all the model weights to sum to 1.

3.5 Bayesian model combination

Bayesian model combination(BMC) 是 BMA 的一個校正算法。它不是獨立的生成Ensemble中的一個個模型,而是從可能的Ensemble Space中生成(模型的權重是由同一參數的Dirichlet分布生成)。這個修正克服了BMA算法給單個模型所有權重的傾向。盡管BMC比BMA有更多的計算量,但是它的結果也非常的好!有很多例子證明了BMC比BMA和bagging的效果更好。

對於BMA而言,使用貝葉斯法來計算模型權重就必須要計算給定各個模型時生成數據的概率P(Thi)。通常情況下,Ensemble中的模型都不是嚴格服從訓練數據的生成分布來生成數據,所以這一項一般都非常接近於0。如果Ensemble足夠大到可以抽樣整個”假設”空間,那么理論上結果是比較好。但是,Ensemble空間有限,不可行。因此,訓練數據中的每個模式會導致Ensemble中與訓練數據分布最接近的模型的權重增大。舉一個例子來說,比如”假設”空間有5個假設,BMA與BMC可以簡單的如下圖所示:

BMA是選擇一個與生成數據的分布最接近的模型,而BMC是選擇一個與生成數據的分布最接近的模型組合方式。BMA可以看成是從一堆模型中使用交叉驗證來選擇一個最優模型。而BMC可以認為是從一堆隨機模型組合中選擇一個最好的組合(Ensemble)。

偽代碼如下:更多信息可以閱讀Turning Bayesian Model Averaging Into Bayesian Model Combination

function train_bayesian_model_combination(T) For each model, m, in the ensemble: weight[m] = 0 sum_weight = 0 z = -infinity Let n be some number of weightings to sample. (100 might be a reasonable value. Smaller is faster. Bigger leads to more precise results.) for i from 0 to n - 1: For each model, m, in the ensemble: // draw from a uniform Dirichlet distribution v[m] = -log(random_uniform(0,1)) Normalize v to sum to 1 Let x be the predictive accuracy (from 0 to 1) of the entire ensemble, weighted according to v, for predicting the labels in T. Use x to estimate log_likelihood[i]. Often, this is computed as log_likelihood[i] = |T| * (x * log(x) + (1 - x) * log(1 - x)), where |T| is the number of training patterns in T. If log_likelihood[i] > z: // z is used to maintain numerical stability For each model, m, in the ensemble: weight[m] = weight[m] * exp(z - log_likelihood[i]) z = log_likelihood[i] w = exp(log_likelihood[i] - z) For each model, m, in the ensemble: weight[m] = weight[m] * sum_weight / (sum_weight + w) + w * v[m] sum_weight = sum_weight + w Normalize the model weights to sum to 1.

3.6 Bucket of models

bucket of models是在Ensemble中針對具體問題進行最優模型選擇的算法。當針對一個具體問題是,bucket of models 並不能夠產生比最優模型更好的結果,但是在許多問題評估中,平均來說,它將比其他模型有更好的結果。

最常用的方法是交叉驗證(cross-validation), 有時候稱之為bake-off contest,偽代碼如下:

For each model m in the bucket: Do c times: (where 'c' is some constant) Randomly divide the training dataset into two datasets: A, and B. Train m with A Test m with B Select the model that obtains the highest average score

交叉驗證可以簡單的總結為“在所有的訓練集合上,看看它們的表現,選擇表現最好的”。 Gating 是交叉驗證的一種一般化。它在訓練中多訓練一個模型用於決定在特定問題下具體選擇某個模型。通常情況下,感知器(perceptron)會被用於Gating model。它可以用於選擇最優模型,也可以是bucket中各個模型的預測結果的一組線性權重。比如垃圾分類問題中,用感知器訓練Gating 之后,可以訓練成:在money單詞出現2次以上時使用logistic的分類結果,否則使用朴素貝葉斯的結果;也可以訓練成結果為a×money出現次數×決策樹+b×money出現次數×朴素貝葉斯 + c的結果(結果是為是是垃圾郵件的概率,abc由感知器訓練得到)。

Bucket of models也可以用於處理一大組問題,用以避免訓練一些需要很長時間訓練的模型。Landmark learning是一種旨在解決這個問題的元學習(meta-learning)方法。Bucket中,只包括一些訓練比較快的模型(可能不是很准確),用這些模型的結果來確定哪些緩慢(但准確)算法是最有可能做最好。

3.7 Stacking

Stacking(有時候也稱之為stacked generalization)是指訓練一個模型用於組合(combine)其他各個模型。即首先我們先訓練多個不同的模型,然后再以之前訓練的各個模型的輸出為輸入來訓練一個模型,以得到一個最終的輸出。如果可以選用任意一個組合算法,那么理論上,Stacking可以表示上面提到的各種Ensemble方法。然而,實際中,我們通常使用單層logistic回歸作為組合模型。

如下圖,先在整個訓練數據集上通過bootstrapped抽樣得到各個訓練集合,得到一系列分類模型,稱之為Tier 1分類器, 然后將輸出用於訓練Tier 2 分類器(meta-classifier, Wolpert 1992)。潛在的一個思想是希望訓練數據都得被正確的學習到了。比如某個分類器錯誤的學習到了特征空間里某個特定區域,因此錯誤分類就會來自這個區域,但是Tier 2分類器可能根據其他的分類器學習到正確的分類。交叉驗證也通常用於訓練Tier 1分類器:把這個訓練集合分成T個塊,Tier 1中的每個分類器根據各自余下的T-1塊進行訓練,並在T塊(該塊數據並未用於訓練)上測試。之后將這些分類器的輸出作為輸入,在整個訓練集合上訓練Tier 2分類器。(這里未提及測試集,測試集是指不在任何訓練過程中出現的數據)。

總的來說,Stacking 方法比任何單一模型的效果都要好,而且不僅成功應用在了監督式學習中,也成功應用在了非監督式(概率密度估計)學習中。甚至應用於估計bagging模型的錯誤率。據論文Feature-Weighted Linear Stacking(Sill, J. and Takacs, G. and Mackey L. and Lin D., 2009, arXiv:0911.0460)而言,Stacking比Bayesian Model Averaging表現要更好!此外在Kaggle上,很多比賽多是通過Stacking獲取優秀的結果!

4. Ensemble combination rules

上面提到很多組合的方法,比如根據均值或者加權等等。但是,Ensemble內的各個模型不僅僅可以是同一個模型根據訓練集合的隨機子集進行訓練(得到不同的參數),也可以不同的模型進行組合、甚至可以是針對不同的特征子集進行訓練。之后各個模型可以通過不同的策略進行組合。但是不同的結果輸出,組合的情況是不同的,這里主要包括三種情況:

  • 1)Abstract-level:各個模型只輸出一個目標類別,如貓、狗和人的圖像識別中,僅輸出人;
  • 2)Rank-level:各個模型是輸出目標類別的一個排序,如貓、狗和人的圖像識別中,輸出人-狗-貓;
  • 3)measurement-level:各個模型輸出的是目標類別的概率估計或一些相關的信念值,如貓、狗和人的圖像識別中,輸出0.7人-0.2狗-0.1貓;

可以用數學表示為,對於輸出是Abstract-level的,第t個模型定義可以為 dt,j0,1,t=1,...,T;j=1,...,C, 這里T表示模型個數,C表示類別數。如果第t個模型選擇了類別wj, 那么dt,j=1。如果輸出是連續值, dt,j[0,1],我們總是可以歸一化,使得每個值表示各個類別的后驗概率估計Pt(wjx).

Algebraic combiners(代數組合器)是非訓練得到的組合器,這里通常用於有數值輸出的情況。一般使用最小值、最大值、求和、均值、求積、中位數等等,進行最終的決策。也要Voting based methods(基於投票),一般用於離散的情況,比較常見的是按眾數決策。也要按照 Weighted majority voting,即各個模型的結果有不同的權重,加權得到最終的結果,這里的權重可以通過學習得到。

當然,也可以使用其他的組合方法,比如上面提到的使用perceptron或logistic做組合器。但是,經驗上來說,使用簡單的組合規則比如求和或者眾數投票,都可以達到非常好的結果!其他的一些方法可以參考Kuncheva 在2005的一些文章。


免責聲明!

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



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