原文: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
- 2.Ensemble theory
- 3.Common types of ensembles
- 3.4 Bayesian model averaging
- 4. Ensemble combination rules
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=argmaxcj∈C∑hi∈HP(cj|hi)P(T|hi)P(hi)
這里y是預測的類,C是所有可能的類別,H是”假設”空間,P是概率分布, T是訓練數據。作為一個Ensemble,Bayes Optimal Classifier代表了一個”假設”,但是不一定在H中,而是在Ensemble空間(是原”假設”空間里的”假設”的所有可能的Ensemble)里的最優”假設”。然而,在實際中的很多例子中(即使很簡單的例子),Bayes Optimal Classifier並不能很好的實現。實際中不能很好的實現Bayes Optimal Classifier的理由主要有以下幾個:
- 1) 絕大多數”假設”空間都非常大而無法遍歷(無法 argmax了);
- 2) 很多”假設”給出的結果就是一個類別,而不是概率(模型需要P(cj|hi));
- 3) 計算一個訓練數據的無偏估計P(T|hi)是非常難的;
- 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(T|H)。事實證明在一定情況下,當這些生成的”假設”按照貝葉斯法則合並起來后,期望誤差不大於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(T|hi)。通常情況下,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[