為什麼做stacking之後,準確率反而降低了?

只做兩層,第一層是SVM,Logistic Reg,Decision Tree,KNN,Adaboost,Gradient Boost,第二層是XGBoost。 結果準確率下降了很多。請問還需要回第一層去調參嗎?之前已經調過一次了。


很有意思的問題,談談我的看法。

首先不了解的stacking的朋友可以認為它是一種集成框架,集多個不同模型的長處而產生更好的結果。和bagging相同,stacking也需要多個基分類器(base classifier),來構成差異化(diversity)。對比bagging和stacking:

  • stacking中的各個模型(基分類器)追求的是「准而不同」。stacking中的子模型一般應該是獨立準確,而不同的基學習器之間有所差異。
  • bagging中的基學習器追求的是「弱和不同」。bagging中的學習器往往是決策樹,主要就是看中了決策樹的不穩定性(instability)。過於準確的基學習器會使得bagging的集成失去意義。

stacking另一個比較特別的是層狀結構。以常見的兩層stacking為例,第一層是不同的基模型(多個),而第二層是以上一層基模型輸出結果為輸入數據的分類器(一個)。從某種意義上看,和神經網路的「結構相似」。為了防止過擬合,一般第二層的模型不再使用原始訓練數據進行訓練,而僅依賴於第一層訓練器的輸出結果。比較詳細的介紹可以參考 @Kris Zhao 和 @峰峰 [1, 2]在知乎上回答,此處不再贅述。

stacking是否一定可以提升效果呢?是否集成後比單個基學習器要好?

  • 這個首先和你怎麼做的stacking有很大關係,不是每一種stacking都有「質量保證」 [5]。早期的很多stacking方法從實驗角度看效果一般,但也不至於退步
  • 其次從理論上來看,現在比較通用stacking模型(見下圖中的super learning),已經在理論上證明了集成結果應該"漸進等價"於其第一層中的最優子模型[3]。因此stacking的結果不應該有大幅度下降。
  • 不談公式。僅從集成的思路上看,假設多個學習器之間卻有不同、互相獨立,且最終合併起來,那麼每個單獨模型的方差(variance)應該有所降低,最終結果應該提升。即使多個相似基學習器並不互相獨立、甚至極端情況下完全相同,也不會惡化集成結果,最多是沒有提升罷了。這個想法可以類比回歸中的共線性,一般主要影響解釋能力,而不是預測能力所以常常會保留不作處理。所以stacking直覺上應該也不會惡化預測能力。

Super Learning框架流程圖

那麼問題來了,為什麼依然有可能表現不佳?我有幾個猜測:

  • 本身數據集就不大,stacking不適合極小的數據集。
  • 很有可能是代碼上就出了問題,比如沒有正確的使用交叉驗證。
  • 個別模型因為某種不明原因現奇差,在巧合狀況下決定了第二層輸入的數據。
  • 第二層的模型選擇問題,比如在多標籤預測下和二分類下的選擇應有所差別。可以參考[4]。

所以你也看出來,我們都猜不到為什麼你的模型不工作,或者stacking後大幅度下降。在有限的信息下,給出一些建議

  • 觀察每個子模型,移除那些明顯遜色的模型。
  • 繼續豐富子模型的種類。如果想不出新的模型,可以換不同參數的類似模型。
  • 如果你的數據集非常小,stacking不一定有效,沒有必要堅持用stacking。
  • 重新檢查基學習器的訓練,可以嘗試用randomized search來包括一些新的「准而不同」的模型。
  • 還有一種微乎其微的可能性,就是你的模型事實上提升了。但準確率(accuracy)不是很好的衡量標準(當數據嚴重不平衡的時候),你誤以為效果變差。所以可以試試ROC。

[1] 【乾貨】比賽後期大招之stacking技術分享

[2] 詳解Stacking

[3] Van der Laan, M.J., Polley, E.C. and Hubbard, A.E., 2007. Super learner. Statistical applications in genetics and molecular biology, 6(1).

[4] Seewald, A.K., 2002, July. How to make stacking better and faster while also taking care of an unknown weakness. In Proceedings of the nineteenth international conference on machine learning (pp. 554-561). Morgan Kaufmann Publishers Inc..

[5] D?eroski, S. and ?enko, B., 2004. Is combining classifiers with stacking better than selecting the best one?. Machine learning, 54(3), pp.255-273.


謝邀,你問的太籠統了,我回答不了。

沒人能保證你ensemble了一堆model之後預測精度就應該提高。

調參數還是要在整體大模型上調。


兩個可能的方向,

1、stacking本身理解或者使用的不對

2、即使stacking使用的完全正確,也有一定的概率是不work的

2.1 單模型之間的差距太大(這個不是差異,而是效果)

2.2 stacking能否工作正常很大程度上依賴cv是否穩定,如果你的單模型在cv和test上的表現不一致的話,就很有可能會出問題,這在樣本量小的時候還是比較常見的。

2.3 stacking也不是萬能的。大多數的情況下stage-1已經能把融合的收益拿的差不多了,stage-2基本上也就是錦上添花,stage-3+最多也就能添個葉子。在實際工作中,stage-2+可能都不會用到,即使不考慮性能問題,通過這種方法拿到的收益,可能都未必能cover住線上的流量變化帶來的效果抖動。


瀉藥。第一層diversity是有了,精度估計差太多…需要的是各有特色的精英,否則一群豬隊友只會扯後腿…


這和你的數據集也有關係,如果數據集過小,很容易出現這樣的問題。你的訓練集是多大的?


信息不夠,但基本可以肯定是stacking的實現出了問題,建議debug一下實現過程。提幾點供參考:1,每一個第一層模型產生metafeature的過程,可以用多次隨機分組後ensemble以提高每個meta feature的質量,2,不同的第一層模型得到的結果先檢查看看合理不合理,再檢查一下互相關,

在逛街,回家接著答…


不請自來。

作為一個為了在KAGGLE刷分玩的人,我來說兩句。

首先,問問題

1. 準確度下降,是指在測試集,驗證集還是訓練集?

如果是測試集問題,請檢查是否分層採樣或者是否有不平衡現象。

如果是訓練集和驗證集問題,還是要把基訓練器調好參,才行。

我的經驗,

特徵工程可以提供0.x級別成績基礎,

基訓練器調參可以基於前者基礎提供0.0x級別優化,

stacking可以再基於前者提供0.00X到0.0X級別優化

你可以看看,你的性能波動是哪個級別的。就去做對應的工作。

2. 數據平衡嗎?

3. 數據是否「統一」歸一化處理了?

4. folder 選的合適嗎?

通常而言,stacking 一定可以提高成績。 這符合大數定律。 想想看,模擬擲個骰子1萬次,也近似能得到均勻分布結果。

folder 要能起到模仿擲骰子的作用。數量n ≤3, 在訓練集的結果較差,就考慮5,10folder.當然計算時間也是5到10倍增長。訓練時間和訓練準確度之間需要平衡。

數據分布檢驗,分層採樣,和交叉檢驗在一些預測演算法書中講的比較細。 有一本說的比較深入淺出,而且還有中文版。 你可以參考。

書名是: python 機器預測演算法核心

作者線性回歸章節預測寫的非常棒。

補充一點:

感覺基分類器選的不算太好。建議修改,參見SKLEARN 標準流程圖。

下圖比較模糊,可以了解大概思路。

select The right estimators.


我的第一感覺是,第二層的模型,用的有點過了,直接用簡單點的LR。


第二層是非常容易過擬合的,所以建議題主使用LR這種簡單的線性模型在第二層試一下

持續關注,希望題主找到問題之後更新一下問題描述~


第二層用 xgb 的話,建議帶上原始特徵。

這種 stacking 就是玄學,meta 特徵多了少了都可能不行;folds 數量也有影響,個人認為泛化能力有限。


建議觀察每個分類器得到的結果和標準數據,再進行stack。

首先要了解數據。


每個模塊都有誤差 一旦多了之後,p^n 自然就被放小了


推薦閱讀:

如何看待 Google TPU?寒武紀晶元較之有哪些優勢與不足?
如何評價「代碼直出工具」pix2code?
如何評價雲丁科技推出的鹿客智能門鎖Loock touch?
是否需要接受一家人工智慧offer?
人工智慧未來在交易領域會徹底取締、碾壓傳統手工交易者嗎?

TAG:人工智慧 | 數據挖掘 | 機器學習 | Kaggle | 集成學習 |