標籤:

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

轉自:騰訊全球高校演算法大賽

首先,在我看來stacking嚴格來說不能稱為一種演算法,我理解的是一種非常精美而複雜的對模型的集成策略。大家都知道,在給定了數據集的情況下,數據內部的空間結構和數據之間的關係是非常複雜的。而不同的模型,其實很重要的一點就是在不同的角度去觀測我們的數據集。我舉個例子,KNN可能更加關注樣本點之間的距離關係(包括歐幾里得距離(Euclidean Distance)、明可夫斯基距離(Minkowski Distance等等),當樣本距離相對較近,KNN就把他們分為一類;而決策樹,可能更加關注分裂節點時候的不純度變化,有點像我們自己找的規則,在滿足某個條件且滿足某個條件的情況下,決策樹把樣本分為一類等等。也就是說,不同的演算法模型,其實是在不同的數據空間角度和數據結構角度來觀測數據,然後再依據它自己的觀測,結合自己的演算法原理,來建立一個模型,在新的數據集上再進行預測。這樣大家就會有個疑問了,俗話說:三人行必有我師。既然是不同的演算法對數據有不同的觀測,那麼我們能不能相互取長補短,我看看你的觀測角度,你看看我的觀測角度,咱倆結合一下,是不是可以得到一個更加全面更加優秀的結果呢?答案是肯定的。在我當初學基礎演算法的時候就有這麼一個疑問,但是不知道怎麼結合,直到有一天看到了stacking的框架,瞬間感覺找到了一片新天地~~~~下面我從以下幾個方面介紹stacking。

stacking的框架結構與運行過程

剛開始看stacking好像是交叉檢驗的既視感,其實並不是這樣。假設是五折的stacking,我們有一個train數據集和一個test數據集,那麼一個基本的stacking框架會進行如下幾個操作:

1、選擇基模型。我們可以有xgboost,lightGBM,RandomForest,SVM,ANN,KNN,LR等等你能想到的各種基本演算法模型。

2、把訓練集分為不交叉的五份。我們標記為train1到train5。

3、從train1開始作為預測集,使用train2到train5建模,然後預測train1,並保留結果;

然後,以train2作為預測集,使用train1,train3到train5建模,預測train2,並保留結果;如此進行下去,直到把train1到train5各預測一遍;

4、把預測的結果按照train1到trian5的位置對應填補上,得到對train整個數據集在第一個基模型的一個stacking轉換。

5、在上述建立的五個模型過程中,每個模型分別對test數據集進行預測,並最終保留這五列結果,然後對這五列取平均,作為第一個基模型對test數據的一個stacking轉換。

6、選擇第二個基模型,重複以上2-5操作,再次得到train整個數據集在第二個基模型的一個stacking轉換。

7、以此類推。有幾個基模型,就會對整個train數據集生成幾列新的特徵表達。同樣,也會對test有幾列新的特徵表達。

8、一般使用LR作為第二層的模型進行建模預測。

大家看到這裡可能有些不清楚,下面我畫個圖直觀解釋一下:

圖1 stacking的框架及預測

上面這個框架說明的是:對訓練數據進行無重複的五次劃分之後,分別對其中每一部分進行一次預測,而預測的模型就是由其餘四部分訓練的;並且在預測了預測集之後,還需要對我們的test數據集也進行一次預測,這這樣就會得到5個N/5行、1列的對train數據集的特徵轉換,和5個M行、1列的對test數據集的特徵轉換,由此進入下一個圖。

圖2 stacking的框架及預測圖

這個圖說明的是對五部分的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框架獲獎,當然用在我們這次比賽中好像不大合適O(∩_∩)O哈哈~)

stacking的一些基本變種改進

在變種改進方面,我們可以不僅對模型進行融合,還可以對特徵級進行一些變化,比如選部分特徵做stacking;或者對stacking的結果進行再次的stacking,我們上面介紹的是兩層的stacking,可以有3層,或者更多。但是時間複雜度很高,效果並不一定明顯。

好了,不知不覺洋洋洒洒寫了兩千多個字(自己畫的兩個圖有點丑不要介意),希望這篇文章能對大家理解stacking和應用stacking有所幫助,並且實實在在的提高比賽得分~

祝大家最後一周都能取得理想的成績!當然祝我們隊伍成績更上一層樓咯~~~~~


推薦閱讀:

城市規劃和大數據——將LUTi模型帶到下一個水平?
Cybersyn的系統架構
一個華人數學博士,16年前如何押准中國大數據變革?
【徵集】讓我們一起玩#別人的#數據研究人體

TAG:大数据 |