天天看點

【SPA大賽】騰訊廣告點選大賽:對stacking的一些基本介紹

這次給大家分享的是stacking的一些基本知識,希望對大家有幫助。

  現在比賽進入了白熱化階段,并且馬上要切換決賽B榜了,很多隊伍都開始想着融合模型進行提高,大家讨論最多的一個就是stacking架構,但是在群裡看到好多好多同學還沒有搞明白stacking架構到底是什麼結構?要怎麼運作?有什麼注意點?有沒有變種?等等一些列問題。在哆啦的提醒下,今天寫這篇文章就按我自己的了解普及下stacking的一些知識(如果有不對的地方歡迎大家指正~)。

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

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

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

把訓練集分為不交叉的五份。我們标記為train1到train5;

從train1開始作為預測集,使用train2到train5模組化,然後預測train1,并保留結果;

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

在上述建立的五個模型過程中,每個模型分别對test資料集進行預測,并最終保留這五列結果,然後對這五列取平均,作為第一個基模型對test資料的一個stacking轉換;

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

選擇第二個基模型,重複以上2-5操作,再次得到train整個資料集在第二個基模型的一個stacking轉換;

以此類推。有幾個基模型,就會對整個train資料集生成幾列新的特征表達。同樣,也會對test有幾列新的特征表達;

一般使用LR作為第二層的模型進行模組化預測。

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

【SPA大賽】騰訊廣告點選大賽:對stacking的一些基本介紹

                 圖1 stacking的架構及預測(1)

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

【SPA大賽】騰訊廣告點選大賽:對stacking的一些基本介紹

  這個圖說明的是對五部分的train分别預測之後再組成對train的新的表達,由5個5/N行一列的預測組成一個N行1列預測結果,進而得到對train的新表達;同時,對test的結果也進行處理,由于是5個模型對test的預測,是以要取平均,使得五列平均為一列,進而得到對test的新表達。

  至此,整個stacking的架構和運作流程介紹完畢,希望大家通過上面這一部分,能對stacking的整個架構和運作流程有個比較清晰的認識。

  經過上一部分的介紹,想必大家感覺到stacking的威力可能很大,事實上也是這樣的。但是仍然有一些需要注意的地方,簡單介紹幾點:

stacking的架構設計比較複雜,對于一個基模型要訓練5次,如果你的一個xgb模型要訓練2個小時,即使在進行stacking的時候每折減少了五分之一的資料量,你的計算時間仍然是很可觀的,加起來應該還是8-9小時,是以耗費時間很長(想像一下一個stacking架構跑一個基模型要大半天,簡直太可怕)。是以建議大家在使用的時候要計算時間的耗費,或者可以改為3折,4折等等;

我們前面講過了,stacking架構是內建了不同的算法,充分利用不同算法從不同的資料空間角度和資料結構角度的對資料的不同觀測,來取長補短,優化結果。是以,我們的基模型除了是不同參數的相同模型之外,比如不同參數的xgboost,或者不同K值的KNN等等;更重要的是要盡可能的多加一些不同種類的基模型進去,也就是說所謂的模型要“跨越空間”的概念。這樣的話我們的內建結果會更加穩健,更加精确(曾經見過一個比賽內建了上百個基模型的stacking架構獲獎,當然用在我們這次比賽中好像不大合适O(∩_∩)O哈哈~)

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

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

  祝大家最後一周都能取得理想的成績!