天天看點

機器學習比賽—殺入Kaggle Top 1%

最近準備參加一個算法比賽,想把自己所學的知識拿來用一用,在比賽初始自己沒一點思路,突然看到知乎上有一個大神寫了一篇博文,非常适合我這種剛入門的小白。

本文轉載來自:https://zhuanlan.zhihu.com/p/27424282

不知道你有沒有這樣的感受,在剛剛入門機器學習的時候,我們一般都是從MNIST、CIFAR-10這一類知名公開資料集開始快速上手,複現别人的結果,但總覺得過于簡單,給人的感覺太不真實。因為這些資料太“完美”了(幹淨的輸入,均衡的類别,分布基本一緻的測試集,還有大量現成的參考模型),要成為真正的資料科學家,光在這些資料集上跑模型卻是遠遠不夠的。而現實中你幾乎不可能遇到這樣的資料(現實資料往往有着殘缺的輸入,類别嚴重不均衡,分布不一緻甚至随時變動的測試集,幾乎沒有可以參考的論文),這往往讓剛進入工作的同學手忙腳亂,無所适從。

Kaggle則提供了一個介于“完美”與真實之間的過渡,問題的定義基本良好,卻夾着或多或少的難點,一般沒有完全成熟的解決方案。在參賽過程中與論壇上的其他參賽者互動,能不斷地獲得啟發,受益良多。即使對于一些學有所成的高手乃至大牛,參加Kaggle也常常會獲得很多啟發,與來着世界各地的隊伍進行厮殺的刺激更讓人欲罷不能。更重要的是,Kaggle是業界普遍承認的競賽平台,能從Kaggle上的一些高品質競賽擷取好名次,是對自己實力極好的證明,還能給自己的履曆添上光輝的一筆。如果能獲得金牌,殺入獎金池,那更是名利兼收,再好不過。

1 比賽篇

為了友善,我們先定義幾個名詞:

  1. Feature 特征變量,也叫自變量,是樣本可以觀測到的特征,通常是模型的輸入。
  2. Label 标簽,也叫目标變量,需要預測的變量,通常是模型的标簽或者輸出。
  3. Train Data 訓練資料,有标簽的資料,由舉辦方提供。
  4. Train Set 訓練集,從Train Data中分割得到的,用于訓練模型(常用于交叉驗證)。
  5. Valid Set 驗證集,從Train Data中分割得到的,為了能找出效果最佳的模型,使用各個模型對驗證集資料進行預測,并記錄模型準确率。選出效果最佳的模型所對應的參數,即用來調整模型參數(常用于交叉驗證)。
  6. Test Data 測試資料,通過訓練集和驗證集得出最優模型後,使用測試集進行模型預測。用來衡量該最優模型的性能和分類能力,标簽未知,是比賽用來評估得分的資料,由舉辦方提供。

1.1 分析題目

拿到賽題以後,第一步就是要破題,我們需要将問題轉化為相應的機器學習問題。其中,Kaggle最常見的機器學習問題類型有:

  1. 回歸問題
  2. 分類問題(二分類、多分類、多标簽) 多分類隻需從多個類别中預測一個類别,而多标簽則需要預測出多個類别。

比如Quora的比賽就是二分類問題,因為隻需要判斷兩個問句的語義是否相似。

1.2 資料分析(Data Exploration)

所謂資料挖掘,當然是要從資料中去挖掘我們想要的東西,我們需要通過人為地去分析資料,才可以發現資料中存在的問題和特征。我們需要在觀察資料的過程中思考以下幾個問題:

  1. 資料應該怎麼清洗和處理才是合理的?
  2. 根據資料的類型可以挖掘怎樣的特征?
  3. 資料中的哪些特征會對标簽的預測有幫助?

1.2.1 統計分析

對于數值類變量(Numerical Variable),我們可以得到min,max,mean,meduim,std等統計量,用pandas可以友善地完成,結果如下:

機器學習比賽—殺入Kaggle Top 1%

從上圖中可以觀察Label是否均衡,如果不均衡則需要進行over sample少數類,或者down sample多數類。我們還可以統計Numerical Variable之間的相關系數,用pandas就可以輕松獲得相關系數矩陣:

機器學習比賽—殺入Kaggle Top 1%

觀察相關系數矩陣可以讓你找到高相關的特征,以及特征之間的備援度。而對于文本變量,可以統計詞頻(TF),TF-IDF,文本長度等等,更詳細的内容可以參考這裡。

1.2.2 可視化

人是視覺動物,更容易接受圖形化的表示,是以可以将一些統計資訊通過圖表的形式展示出來,友善我們觀察和發現。比如用直方圖展示問句的頻數:

機器學習比賽—殺入Kaggle Top 1%

或者繪制相關系數矩陣:

機器學習比賽—殺入Kaggle Top 1%

常用的可視化工具有 matplotlib 和 seaborn。當然,你也可以跳過這一步,因為可視化不是解決問題的重點。

1.3 資料預處理(Data Preprocessing)

剛拿到手的資料會出現噪聲,缺失,髒亂等現象,我們需要對資料進行清洗與加工,進而友善進行後續的工作。針對不同類型的變量,會有不同的清洗和處理方法:

  1. 數值型變量(Numerical Variable),需要處理 離群點,缺失值,異常值 等情況,盡管動手去試,numerical填充max ,min,mean ,median std、離散化、Hash分桶,categorical 填充衆數,都拿去訓練 看看哪個效果好。
  2. 類别型變量(Categorical Variable),可以轉化為 one-hot 編碼。
  3. 文本資料 ,是較難處理的資料類型,文本中會有垃圾字元,錯别字(詞),數學公式,不統一機關和日期格式等。我們還需要處理标點符号,分詞,去停用詞,對于英文文本可能還要 詞性還原(lemmatize),抽取詞幹(stem)等等。
  4. 資料采樣,一般用 随機采樣,和 分層采樣 的辦法。如果正樣本多于負樣本,且量都挺大,則可以采用下采樣(downsampling)。如果正樣本大于負樣本,但量不大,則可以采集更多的資料,或者上采樣 oversampling(比如圖像識别中的鏡像和旋轉),以及修改損失函數/loss function的辦法來處理正負樣本不平衡的問題。
  5. 資料歸一化,可以提高梯度下降法求最優解速度,否則很難收斂或不收斂;還可提高模型的精度。資料如何進行歸一化?

1.4 特征工程(Feature Engineering)

都說 特征為王,特征是決定效果最關鍵的一環。我們需要通過探索資料,利用人為先驗知識,從資料中總結出特征。

1.4.1 特征抽取(Feature Extraction)

我們應該盡可能多地抽取特征,隻要你認為某個特征對解決問題有幫助,它就可以成為一個特征。特征抽取需要不斷疊代,是最為燒腦的環節,它會在整個比賽周期折磨你,但這是比賽取勝的關鍵,它值得你耗費大量的時間。

那問題來了,怎麼去發現特征呢?光盯着資料集肯定是不行的。如果你是新手,可以先耗費一些時間在Forum上,看看别人是怎麼做Feature Extraction的,并且多思考。雖然 Feature Extraction 特别講究經驗,但其實還是有章可循的:

  1. 對于Numerical Variable,可以通過線性組合、多項式組合來發現新的Feature。
  2. 對于文本資料,有一些正常的Feature。比如,文本長度,詞頻,Embeddings,TF-IDF,LDA,LSI等,你甚至可以用深度學習提取文本特征(隐藏層)。
  3. 如果你想對資料有更深入的了解,可以通過思考資料集的構造過程來發現一些 magic feature,這些特征有可能會大大提升效果。在Quora這次比賽中,就有人公布了一些 magic feature。
  4. 通過錯誤分析也可以發現新的特征(見1.5.2小節)。

1.4.2 特征選擇(Feature Selection)

在做特征抽取的時候,我們是盡可能地抽取更多的Feature,但過多的 Feature 會造成 備援(部分特征的相關度太高了,消耗計算性能),噪聲(部分特征是對預測結果有負影響),容易過拟合等問題,是以我們需要進行 特征篩選。特征選擇可以加快模型的訓練速度,甚至還可以提升效果。

特征選擇的方法多種多樣,最簡單的是相關度系數(Correlation coefficient),它主要是衡量兩個變量之間的線性關系,數值在[-1.0, 1.0]區間中。數值越是接近0,兩個變量越是線性不相關。但是數值為0,并不能說明兩個變量不相關,隻是線性不相關而已;也可用 互資訊、距離相關度來計算。

我們通過一個例子來學習一下怎麼分析相關系數矩陣:

機器學習比賽—殺入Kaggle Top 1%

相關系數矩陣是一個對稱矩陣,是以隻需要關注矩陣的左下角或者右上角。我們可以拆成兩點來看:

  1. Feature 和 Label 的相關度可以看作是該Feature的重要度,越接近1或-1就越好。
  2. Feature 和 Feature 之間的相關度要低,如果兩個Feature的相關度很高,就有可能存在備援。

除此之外,還可以訓練模型來篩選特征,比如帶L1或L2懲罰項的Linear Model、Random Forest、GBDT等,它們都可以輸出特征的重要度。在這次比賽中,我們對上述方法都進行了嘗試,将不同方法的 平均重要度 作為最終參考名額,篩選掉得分低的特征。

如何進行特征選擇,可點選這

1.5 模組化(Modeling)

終于來到機器學習了,在這一章,我們需要開始煉丹了。

1.5.1 模型

機器學習模型有很多,建議均作嘗試,不僅可以測試效果,還可以學習各種模型的使用技巧。其實,幾乎每一種模型都有回歸和分類兩種版本,常用模型有:

  • KNN
  • SVM
  • Linear Model(帶懲罰項)
  • ExtraTree
  • RandomForest
  • Gradient Boost Tree 
  • GBDT (Gradient Boosting Decision Tree)
  • Neural Network

幸運的是,這些模型都已經有現成的工具(如scikit-learn、XGBoost、LightGBM等)可以使用,不用自己重複造輪子。但是我們應該要知道各個模型的原理,這樣在調參的時候才會遊刃有餘。當然,你也使用PyTorch/Tensorflow/Keras等深度學習工具來定制自己的Deep Learning模型,玩出自己的花樣。

1.5.2 錯誤分析

人無完人,每個模型不可能都是完美的,它總會犯一些錯誤。為了解某個模型在犯什麼錯誤,我們可以觀察被模型誤判的樣本,總結它們的共同特征,我們就可以再訓練一個效果更好的模型。這種做法有點像後面 Ensemble 時提到的 Boosting,但是我們是人為地觀察錯誤樣本,而Boosting是交給了機器。通過 錯誤分析->發現新特征->訓練新模型->錯誤分析,可以不斷地疊代出更好的效果,并且這種方式還可以培養我們對資料的嗅覺。

舉個例子,這次比賽中,我們在錯誤分析時發現,某些樣本的兩個問句表面上很相似,但是句子最後提到的地點不一樣,是以其實它們是語義不相似的,但我們的模型卻把它誤判為相似的。比如這個樣本:

  • Question1: Which is the best digital marketing institution in banglore?
  • Question2: Which is the best digital marketing institute in Pune?

為了讓模型可以處理這種樣本,我們将兩個問句的 最長公共子串(Longest Common Sequence)去掉,用剩餘部分訓練一個新的深度學習模型,相當于告訴模型看到這種情況的時候就不要判斷為相似的了。是以,在加入這個特征後,我們的效果得到了一些提升。

1.5.3 調參

在訓練模型前,我們需要預設一些參數來确定模型結構(比如樹的深度)和優化過程(比如學習率),這種參數被稱為超參(Hyper-parameter),不同的參數會得到的模型效果也會不同。總是說調參就像是在“煉丹”,像一門“玄學”,但是根據經驗,還是可以找到一些章法的:

  1. 根據經驗,選出對模型效果 影響較大的超參。
  2. 按照經驗設定超參的搜尋空間,比如 學習率 的搜尋空間為[0.001,0.1]。
  3. 選擇搜尋算法,比如Random Search、Grid Search和一些啟發式搜尋的方法。
  4. 驗證模型的泛化能力(詳見下一小節)。

1.5.4 模型驗證(Validation)

在Test Data的标簽未知的情況下,我們需要自己構造測試資料來驗證模型的泛化能力,是以把Train Data分割成Train Set和Valid Set兩部分,Train Set用于訓練,Valid Set用于驗證。

  • 簡單分割

将Train Data按一定方法分成兩份,比如随機取其中70%的資料作為Train Set,剩下30%作為Valid Set,每次都固定地用這兩份資料分别訓練模型和驗證模型。這種做法的缺點很明顯,它沒有用到整個訓練資料,是以驗證效果會有偏差。通常隻會在訓練資料很多,模型訓練速度較慢的時候使用。

  • 交叉驗證

交叉驗證是将整個訓練資料随機分成K份,訓練K個模型,每次取其中的K-1份作為Train Set,留出1份作為Valid Set,是以也叫做K-fold。至于這個K,你想取多少都可以,但一般選在3~10之間。我們可以用 K 個模型得分的 mean 和 std,來評判模型得好壞(mean展現模型的能力,std展現模型是否容易過拟合),并且用K-fold的驗證結果通常會比較可靠。

如果資料出現 Label 不均衡情況,可以使用 Stratified K-fold,分層采樣,確定訓練集,測試集中各類别樣本的比例與原始資料集中相同),這樣得到的 Train Set 和 Test Set 的 Label 比例是大緻相同。

1.6 模型內建(Ensemble)

曾經聽過一句話,”Feature為主,Ensemble為後”。Feature決定了模型效果的上限,而Ensemble就是讓你更接近這個上限。Ensemble講究“好而不同”,不同是指模型的學習到的側重面不一樣。舉個直覺的例子,比如數學考試,A的函數題做的比B好,B的幾何題做的比A好,那麼他們合作完成的分數通常比他們各自單獨完成的要高。

常見的Ensemble方法有Bagging、Boosting、Stacking、Blending。

1.6.1 Bagging

Bagging是将多個模型(基學習器)的預測結果簡單地 權重平均 或者 投票。Bagging的好處在于可以 并行 地訓練基學習器,其中 Random Forest 就用到了Bagging的思想。舉個通俗的例子,如下圖:

機器學習比賽—殺入Kaggle Top 1%

老師出了兩道加法題,A同學和B同學答案的權重要比A和B各自回答的要精确。

Bagging通常是沒有一個明确的優化目标的,但是有一種叫Bagging Ensemble Selection的方法,它通過 貪婪算法 來Bagging多個模型來優化目标值。在這次比賽中,我們也使用了這種方法。 

1.6.2 Boosting

Boosting的思想有點像知錯能改,每訓練一個基學習器,是為了彌補上一個基學習器所犯的錯誤。其中著名的算法有 AdaBoost,Gradient Boost。Gradient Boost Tree 就用到了這種思想。

我在1.2.3節(錯誤分析)中提到 Boosting,錯誤分析->抽取特征->訓練模型->錯誤分析,這個過程就跟Boosting很相似。

1.6.3 Stacking

Stacking是用 新的模型(次學習器)去學習怎麼組合那些基學習器,它的思想源自于Stacked Generalization這篇論文。如果把Bagging看作是多個基分類器的線性組合,那麼Stacking就是多個基分類器的非線性組合。Stacking可以很靈活,它可以将學習器一層一層地堆砌起來,形成一個網狀的結構,如下圖:

機器學習比賽—殺入Kaggle Top 1%

舉個更直覺的例子,還是那兩道加法題:

機器學習比賽—殺入Kaggle Top 1%
機器學習比賽—殺入Kaggle Top 1%
機器學習比賽—殺入Kaggle Top 1%

這裡A和B可以看作是基學習器,C、D、E都是次學習器。

  • Stage1: A和B各自寫出了答案。
  • Stage2: C和D偷看了A和B的答案,C認為A和B一樣聰明,D認為A比B聰明一點。他們各自結合了A和B的答案後,給出了自己的答案。
  • Stage3: E偷看了C和D的答案,E認為D比C聰明,随後E也給出自己的答案作為最終答案。

在實作 Stacking 時,要注意的一點是,避免标簽洩漏(Label Leak)。在訓練次學習器時,需要上一層學習器對 Train Data 的測試結果作為特征,如果我們在Train Data上訓練,然後在Train Data上預測,就會造成Label Leak。為了避免Label Leak,需要對每個學習器使用K-fold,将K個模型對Valid Set的預測結果拼起來,作為下一層學習器的輸入。如下圖:

機器學習比賽—殺入Kaggle Top 1%

由圖可知,我們還需要對Test Data做預測。這裡有兩種選擇,可以将K個模型對Test Data的預測結果求平均,也可以用所有的Train Data重新訓練一個新模型來預測Test Data。是以在實作過程中,我們最好把每個學習器對Train Data和對Test Data的測試結果都儲存下來,友善訓練和預測。

對于Stacking還要注意一點,固定 K-fold 可以盡量避免Valid Set過拟合,也就是全局共用一份K-fold,如果是團隊合作,組員之間也是共用一份K-fold。如果想具體了解 為什麼需要固定K-fold,請看這裡。

1.6.4 Blending

Blending 與 Stacking 很類似,它們的差別可以參考這裡

1.7 後處理

有些時候在确認沒有過拟合的情況下,驗證集上做校驗時效果挺好,但是将測試結果送出後的分數卻不如人意,這時候就有可能是訓練集的分布與測試集的分布不一樣而導緻的。這時候為了提高LeaderBoard的分數,還需要對測試結果進行分布調整。

比如這次比賽,訓練資料中正類的占比為0.37,那麼預測結果中正類的比例也在0.37左右,然後Kernel上有人通過測試知道了測試資料中正類的占比為0.165,是以我們也對預測結果進行了調整,得到了更好的分數。具體可以看這裡。

2 經驗篇

2.1 我們的方案(33th)

深度學習具有很好的模型拟合能力,使用深度學習可以較快得擷取一個不錯的Baseline,對這個問題整體的難度有一個初始的認識。雖然使用深度學習可以免去繁瑣的手工特征,但是它也有能力上限,是以提取傳統手工特征還是很有必要的。我們嘗試Forum上别人提供的方法,也嘗試自己思考去抽取特征。總結一下,我們抽取的手工特征可以分為以下4種:

  1. Text Mining Feature,比如 句子長度;兩個句子的 文本相似度,如 N-gram的編輯距離,Jaccard距離等;兩個句子共同的名詞,動詞,疑問詞等。
  2. Embedding Feature,預訓練好的 詞向量 相加求出 句子向量,然後求兩個句子向量的距離,比如 餘弦相似度、歐式距離等等。
  3. Vector Space Feature,用 TF-IDF矩陣 來表示句子,求相似度。
  4. Magic Feature,是Forum上一些選手通過思考資料集構造過程而發現的Feature,這種 Feature 往往與 Label 有強相關性,可以大大提高預測效果。
  5. 我們的系統整體上使用了Stacking的架構,如下圖:
機器學習比賽—殺入Kaggle Top 1%

FNN,CNN,RNN的差別

  • Stage1: 将兩個問句與Magic Feature輸入Deep Learning中,将其輸出作為下一層的特征(這裡的Deep Learning相當于特征抽取器)。我們一共訓練了幾十個Deep Learning Model。
  • Stage2: 将 Deep Learning特征 與 手工抽取的幾百個傳統特征 拼接在一起,作為輸入。在這一層,我們訓練各種模型,有成百上千個(通過改變參數麼得到不同種類模型,用hyperopt的預設政策來搜尋參數空間,将中間結果全保留下來)。
  • Stage3: 上一層的輸出進行Ensemble Selection。

比賽中發現的一些深度學習的局限:

通過對深度學習産生的結果進行錯誤分析,并且參考論壇上别人的想法,我們發現深度學習沒辦法學到的特征大概可以分為兩類:

  1. 對于一些資料的Pattern,在 Train Data 中出現的頻數不足以讓深度學習學到對應的特征,是以我們需要通過手工提取這些特征。
  2. 由于 Deep Learning 對樣本做了獨立同分布假設(iid),一般隻能學習到每個樣本的特征,而學習到資料的全局特征,比如 TF-IDF 這一類需要統計全局詞頻才能擷取的特征,是以也需要手工提取這些特征。

傳統的機器學習模型和深度學習模型之間也存在表達形式上的不同。雖然傳統模型的表現未必比深度學習好,但它們學到的Pattern可能不同,通過Ensemble來取長補短,也能帶來性能上的提升。是以,同時使用傳統模型也是很有必要的。

2.2 第一名的解決方案

比賽結束不久,第一名也放出了他們的解決方案,我們來看看他們的做法。他們的特征總結為三個類别:

  1. Embedding Feature
  2. Text Mining Feature
  3. Structural Feature(他們自己挖掘的 Magic Feature)

并且他們也使用了 Stacking 的架構,并且使用 固定的k-fold:

  • Stage1: 使用了 Deep Learning,XGBoost,LightGBM,ExtraTree,Random Forest,KNN等300個模型。
  • Stage2: 用了 手工特征 和 第一層的預測 和 深度學習模型的隐藏層,并且訓練了150個模型。
  • Stage3: 使用了分别是帶有 L1 和 L2 的兩種線性模型。
  • Stage4: 将第三層的結果 權重平均。

我們模型存在不足:

  • 對比以後發現我們沒有做 LDA、LSI 等特征
  •  N-gram 的粒度沒有那麼細(他們用了8-gram),還有他們對 Magic Feature的挖掘更加深入。
  • 還有一點是他們的 Deep Learning 模型設計更加合理,他們将篩選出來的 手工特征 也輸入到深度學習模型當中,我覺得這也是他們取得好效果的關鍵。因為顯式地将手工特征輸入給深度學習模型,相當于告訴“它你不用再學這些特征了,你去學其他的特征吧”,這樣模型就能學到更多的語義資訊。是以,我們跟他們的差距還是存在的。

3. 工具篇

工欲善其事,必先利其器。

Kaggle 的上常工具除了大家耳熟能詳的XGBoost之外, 這裡要着重推薦的是一款由微軟推出的LightGBM,這次比賽中我們就用到了。LightGBM的用法與XGBoost相似,兩者使用的差別是XGBoost調整的一個重要參數是樹的高度,而LightGBM調整的則是葉子的數目。與XGBoost 相比, 在模型訓練時速度快, 單模型的效果也略勝一籌。

調參也是一項重要工作,調參的工具主要是Hyperopt,它是一個使用搜尋算法來優化目标的通用架構,目前實作了Random Search和Tree of Parzen Estimators (TPE)兩個算法。

對于 Stacking,Kaggle 的一位名為Μαριος Μιχαηλιδης的GrandMaster使用Java開發了一款內建了各種機器學習算法的工具包StackNet,據說在使用了它以後你的效果一定會比原來有所提升,值得一試。

以下總結了一些常用的工具:

  • Numpy | 必用的科學計算基礎包,底層由C實作,計算速度快。
  • Pandas | 提供了高性能、易用的資料結構及資料分析工具。
  • NLTK | 自然語言工具包,內建了很多自然語言相關的算法和資源。
  • Stanford CoreNLP | Stanford的自然語言工具包,可以通過NLTK調用。
  • Gensim | 主題模型工具包,可用于訓練詞向量,讀取預訓練好的詞向量。
  • scikit-learn | 機器學習Python包 ,包含了大部分的機器學習算法。
  • XGBoost/LightGBM | Gradient Boosting 算法的兩種實作架構。
  • PyTorch/TensorFlow/Keras | 常用的深度學習架構。
  • StackNet | 準備好特征之後,可以直接使用的Stacking工具包。
  • Hyperopt | 通用的優化架構,可用于調參。

4. 總結與建議

  1. 在參加某個比賽前,要先衡量自己的機器資源能否足夠支撐你完成比賽。比如一個有幾萬張圖像的比賽,而你的顯存隻有2G,那很明顯你是不适合參加這個比賽的。當你選擇了一個比賽後,可以先“熱熱身”,稍微熟悉一下資料,粗略地跑出一些簡單的模型,看看自己在榜上的排名,然後再去慢慢疊代。
  2. Kaggle有許多大牛分享Kernel, 有許多Kernel有對于資料精辟的分析,以及一些baseline 模型, 對于初學者來說是很好的入門資料。在打比賽的過程中可以學習别人的分析方法,有利于培養自己資料嗅覺。甚至一些Kernel會給出一些data leak,會對于比賽提高排名有極大的幫助。
  3. 其次是Kaggle已經舉辦了很多比賽, 有些比賽有類似之處, 比如這次的Quora比賽就與之前的Home Depot Product Search Relevance 有相似之處,而之前的比賽前幾名已經放出了比賽的 idea 甚至 代碼,這些都可以借鑒。
  4. 另外,要足夠地重視 Ensemble,這次我們組的最終方案實作了paper " Ensemble Selection from Libraries of Models" 的想法,是以有些比賽可能還需要讀一些paper,尤其對于深度學習相關的比賽,最新paper,最新模型的作用就舉足輕重了。
  5. 而且,将比賽代碼的流程自動化,是提高比賽效率的一個關鍵,但是往往初學者并不能很好地實作自己的自動化系統。我的建議是初學者不要急于建構自動化系統,當你基本完成整個比賽流程後,自然而然地就會在腦海中形成一個架構,這時候再去建構你的自動化系統會更加容易。
  6. 最後,也是最重要的因素之一就是時間的投入,對于這次比賽, 我們投入了差不多三個多月,涉及到了對于各種能夠想到的方案的嘗試。尤其最後一個月,基本上每天除了睡覺之外的時間都在做比賽。是以要想在比賽中拿到好名次,時間的投入必不可少。另外對于國外一些介紹 kaggle比賽的部落格(比如官方部落格)也需要了解學習,至少可以少走彎路,本文的結尾列出了一些參考文獻,都值得細細研讀。
  7. 最後的最後,請做好心理準備,這是一場持久戰。因為比賽會給你帶來壓力,也許過了一晚,你的排名就會一落千丈。還有可能造成出現失落感,焦慮感,甚至失眠等症狀。但請你相信,它會給你帶來意想不到的驚喜,認真去做,你會覺得這些都是值得的。

解答

1. 請問在Stacking中,你們如何得知可以這樣組合? 以及如何驗證其效果跟正确度呢?

       對于這個問題我們第一時間想到的是用deep learning,然後再抽手工特征,這就組成了stage1,在stage2的時候想要發揮stack的能力當然是要上非線性模型,然後在進入stage3,而stack層數越深,所用的模型需要更簡單,不然很容易過拟合,是以用了bagging ensemble selection,當然你也可以像第一名的做法,去訓練帶懲罰項的線性模型。至于magic feature為什麼要放在deeplearning的輸入,那是因為我們發現deep learning會容易過拟合到某些特征,加入magic feature可以顯式地告訴它“你已經有這些特征了,你可以去挖掘其他的語義特征”,其實你甚至可以把所有的 手工特征 也加入deeplearning的輸入,這樣效果可能會更好,第一名就是這麼做的。

         如何驗證stacking的效果,很簡單啊,用那份固定的kfold做交叉驗證。但是要注意,stacking有過拟合到  valid set 的風險,是以最好的評判當然是leaderborad啦。

2. stage2中的非線性模型,是任何的非線性模型皆可嗎? 還是需要數學驗證呢?  

使用 Ensemble 的時候秘訣就是多嘗試,不能吊死在一棵樹上,如果你認為xgboost是裡面表現最好的,不需要嘗試其他模型了,那就太可惜了。我們不能保證一種模型一定能夠學習到所有的方面,是以需要去嘗試其他模型,盡量讓學出來的模型好而不同,這樣可以讓各種模型發揮自己的長處。是以,不僅僅是非線性模型可以,就算是線性模型也可以,當然我們還要考慮時間、資源等因素進行一些取舍。

如果我們追求的隻是實用性和準确性,隻要實驗的效果出色即可,如果要嚴謹地用數學證明再去使用,說不定等你證明完比賽已經結束了。

每次學習感覺都醍醐灌頂,在此感謝知乎大神分享

參考文獻:

1. Paper: Ensemble Selection from Libraries of Models

2. Kaggle 資料挖掘比賽經驗分享

3. Kaggle Ensembling Guide

繼續閱讀