正經機器學習之stacking的介紹
首先感謝李博,本文來源於李博(深藍)的分享,大家鼓掌。
有了一篇大話機器學習的stacking,但是沒有把裡面的相關內容講述的非常明白,這裡把李博的原文再發一次。
stakcing常常在各大數據挖掘競賽中被廣泛使用,號稱「大殺器」。是數據挖掘競賽高端玩家必備技能,本篇文章就對stakcing的一些基本原理進行介紹。
首先,在我看來stacking 嚴格來說不能稱為一種演算法,我理解的是一種非常精美而複雜的對模型的集成策略。大家都知道,在給定了數據集的情況下,數據內部的空間結構和數據之間的關係是非常複雜的。而不同的模型,其實很重要的一點就是在不同的角度去觀測我們的數據集。比如說,KNN 可能更加關注樣本點之間的距離關係(包括歐幾里得距離(Euclidean Distance)、明可夫斯基距離(Minkowski Distance 等等),當樣本距離相對較近, KNN 就把他們分為一類;而決策樹,可能更加關注分裂節點時候的不純度變化,有點像我們自己找的規則,在滿足某個條件且滿足某個條件的情況下,決策樹把樣本分為一類等等。也就是說,不同的演算法模型,其實是在不同的數據空間角度和數據結構角度來觀測數據,然後再依據它自己的觀測,結合自己的演算法原理,來建立一個模型,在新的數據集上再進行預測。這樣大家就會有個疑問了,俗話說:三人行必有我師。既然是不同的演算法對數據有不同的觀測,那麼我們能不能相互取長補短,我看看你的觀測角度,你看看我的觀測角度,咱倆結合一下,是不是可以得到一個更加全面更加優秀的結果呢?答案是肯定的。在我當初學基礎演算法的時候就有這麼一個疑問,但是不知道怎麼結合,直到有一天看到了 stacking的框架,瞬間感覺找到了一片新天地~~~~下面我從以下幾個方面介紹 stacking。
一、stacking 的框架結構與運行過程:
剛開始看 stacking 好像是交叉檢驗的既視感,其實並不是這樣。假設是五折的stacking,我們有一個train 數據集和一個test 數據集,那麼一個基本的stacking 框架會進行如下幾個操作:
1、選擇基模型。我們可以有 xgboost,lightGMB,RandomForest,SVM,ANN,KNN, LR 等等你能想到的各種基本演算法模型。
2、把訓練集分為不交叉的五份。我們標記為 train1 到 train5。
3、從 train1 開始作為預測集,使用 train2 到 train5 建模,然後預測 train1,並保留結果;然後,以 train2 作為預測集,使用 train1,train3 到 train5 建模,預測 train2,並保留結果;如此進行下去,直到把 train1 到 train5 各預測一遍;
4、在上述建立的五個模型過程中,每個模型分別對 test 數據集進行預測,並最終保留這五列結果,然後對這五列取平均,作為第一個基模型對 test 數據的一個 stacking 轉換。
5、把預測的結果按照 train1 到 trian5 的位置對應填補上,得到對 train 整個數據集在第一個基模型的一個 stacking 轉換。
6、選擇第二個基模型,重複以上 2-5 操作,再次得到 train 整個數據集在第二個基模型的一個 stacking 轉換。
7、以此類推。有幾個基模型,就會對整個train 數據集生成幾列新的特徵表達。同樣,也會對test 有幾列新的特徵表達。
8、一般使用LR 作為第二層的模型進行建模預測。
大家看到這裡可能有些不清楚,下面我畫個圖直觀解釋一下:
上面這個框架說明的是:對訓練數據進行無重複的五次劃分之後,分別對其中每一部分進行一次預測,而預測的模型就是由其餘四部分訓練的;並且在預測了預測集之後,還需要對我們的 test 數據集也進行一次預測,這這樣就會得到 5 個 N/5 行、1 列的對 train 數據集的特徵轉換,和 5 個 M 行、1 列的對 test 數據集的特徵轉換,由此進入下一個圖。
這個圖說明的是對五部分的 train 分別預測之後再組成對 train 的新的表達,由 5 個5/N 行一列的預測組成一個 N 行 1 列預測結果,從而得到對 train 的新表達;同時,對test 的結果也進行處理,由於是 5 個模型對 test 的預測,所以要取平均,使得五列平均為一列,從而得到對 test 的新表達。
至此,整個 stacking 的框架和運作流程介紹完畢,希望大家通過上面這一部分,能對 stacking 的整個框架和運作流程有個比較清晰的認識。
二、使用stacking 的一些注意事項:
經過上一部分的介紹,想必大家感覺到 stacking 的威力可能很大,事實上也是這樣的。但是仍然有一些需要注意的地方,簡單介紹幾點:
1、stacking 的框架設計比較複雜,對於一個基模型要訓練 5 次,如果你的一個 xgb 模型要訓練 2 個小時,即使在進行 stacking 的時候每折減少了五分之一的數據量,你的計算時間仍然是很可觀的,加起來應該還是 8-9 小時,所以耗費時間很長(想像一下一個 stacking 框
架跑一個基模型要大半天,簡直太可怕)。所以建議大家在使用的時候要計算時間的耗費,
或者可以改為 3 折,4 折等等;
2、我們前面講過了,stacking 框架是集成了不同的演算法,充分利用不同演算法從不同的數據空間角度和數據結構角度的對數據的不同觀測,來取長補短,優化結果。所以,我們的基
模型除了是不同參數的相同模型之外,比如不同參數的 xgboost,或者不同 K 值的 KNN 等等;更重要的是要儘可能的多加一些不同種類的基模型進去,也就是說所謂的模型要「跨越空間」 的概念。這樣的話我們的集成結果會更加穩健,更加精確。
三、stacking 的一些基本變種改進:
在變種改進方面,我們可以不僅對模型進行融合,還可以對特徵級進行一些變化,比如選部分特徵做 stacking;或者對 stacking 的結果進行再次的 stacking,我們上面介紹的是兩層的 stacking,可以有 3 層,或者更多。但是時間複雜度很高,效果並不一定明顯。
推薦閱讀:
※卷積神經網路中用1*1 卷積有什麼作用或者好處呢?
※科學式家|胡時偉:讓數據科學家成為業務專家,再為他們配一支技術軍團
※以AlphaGo為例,如何理解神經網路的存儲容量(storage capacity)?
※學習筆記TF050:TensorFlow源代碼解析
TAG:机器学习 |