應賽技巧,教你如何在Kaggle比賽中排在前1%
AiTechYun
編輯:xiaoshan
網友Akira Sosa最近參加了Kaggle比賽,並在medium上分享了他的參賽經驗,以下是全文。
最近,我參加了Kaggle比賽。雖然這是我第一次參賽,但我的成績相當不錯。我想和大家分享我的方法和從比賽中學到的東西。
Statoil/C-CORE Iceberg分類器挑戰是我選擇的題目。在這次比賽中,選手們使用衛星拍攝的雷達圖像來對船隻和冰山進行分類。inc_angle作為附加信息給出。更多的細節可以在比賽的頁面上看到。
Statoil/C-CORE Iceberg分類器挑戰地址:https://www.kaggle.com/c/statoil-iceberg-classifier-challenge/
下面是我的方法和總結。
成功的方法
堆疊,混合。
Bagging。
手動特徵提取。
測試基本模型。
分集(Diversity)。
具有不同架構的多種DNN。
輸入的不同比例。
是否使用擴展。
偽標籤。
成功的方法,但我並沒有使用。
有效的漏洞利用(leak utilization)。
時間主要用在:
學習堆疊和混合。
構建堆疊和混合的源代碼。
訓練多個DNN。
在堆疊的第二階段嘗試一些分類器。
我希望進一步探索的:
探索性數據分析。
概率方法。
一些無監督技術。
我和其他上層人士之間的區別主要是有效漏洞利用。這意味著我應該更仔細地研究數據,但我卻並沒有這樣做。雖然這種技術聽起來有點棘手,但探索性數據分析技術使它成為可能,並且它是我們最重要的技術之一。
因為這是我的第一個挑戰,我花了相當多的時間寫代碼。我在Github上公開了我的代碼。
我的ml項目的初學者工具包。
工具包地址:https://github.com/akirasosa/ml-starter
讓我們來看看更多的細節。
成功的方法
在我參加這次比賽之前,我並不太熟悉這些技術,比如堆疊和混合。幸運的是,我在比賽的前收到了Coursera的郵件。這是《如何贏得數據科學競賽:從頂端開始學習》課程的邀請。這對我有很大的幫助,尤其是Marios第4周的課程,對我非常有幫助。我看了很多遍。
堆疊的最終架構
堆疊的多樣性
堆疊的重要意義在於多樣性。我使用的基本模型是簡單的CNN,有4層。通過使用CNN,我做出了6種預測模式。
CNN-4L沒有強化訓練,沒有輔助輸入。
CNN-4L沒有強化訓練,MinMax縮放輔助輸入。
CNN-4L沒有強化訓練,標準縮放輔助輸入。
CNN-4L經過強化訓練,沒有輔助輸入。
CNN-4L經過強化訓練,MinMax縮放輔助輸入。
CNN-4L經過強化訓練,標準縮放輔助輸入。
我這裡使用的輔助輸入來自於下面的內核。
Ensembling GBMs (LB .203~
內核地址:https://www.kaggle.com/cttsai/ensembling-gbms-lb-203
在這個內核中,它提取圖像的統計信息。我用不同的縮放比例將它們輸入到CNN。而且,我從線性縮放圖像中提取了更多的統計數據(原始圖像是Decibel,所以是對數縮放)。
在驗證這些效果之後,我訓練了一些更不同的架構。
CNN-4L
WRN (Wide Residual Net)
VGG16
Inception V3
MobileNets
VGG16 + MobileNets
因此,我可以得到36(= 6 * 6)的模型模式。其中一些模式在沒有數據強化的情況下不能很好地融合,所以我最後從36個模式里選擇了24個。
基本模型
我意識到在早期找到一個基本模型是很重要的。CNN 4L是這個案例的基礎模型。
基本模型必須在短時間內進行訓練。通過使用基本模型,我可以對幾種實驗進行檢驗,如偽標記、線性縮放圖像、強化、輔助輸入等。
Bagging
結果表明,bagging對DNN模型的泛化能力是相當有效的。這是其中一個模型Bagging的結果。
Bag的數量和對數損失
雖然我確信更多的bagging會帶來更多的收益,但是我沒有足夠的計算資源。
堆疊的第二階段
當我在第一階段成功地獲得了24種預測模式時,我嘗試在第二階段將它們輸入到幾個分類器中。我最後選擇了兩個分類器。
NN-1L (100 bags)
ExtraTreesClassifier (100 bags)
NN-1L在公共/私人排行榜上的對數損失分別為0.1321 / 0.1292。ExtraTreesClassifier的對數損失為0.1316 / 0.1280。由於小數據的原因,公共排行榜看起來不那麼可靠。
我只是用相同的權值0.5和0.5來求均值。該平均提交的最終對數損失為0.1306 / 0.1271。
我嘗試了一些基於梯度樹的分類器,比如XGBoost和LightGBM。他們非常適合訓練數據。雖然他們在計算機視覺上的表現很好,但在公共LB上卻不是很好,我猜可能是用錯誤的方法解讀了inc_angle的漏洞。
沒有採用的成功的方法
現在,讓我們來看看其他頂級的選手的方法。他們的解決方案給我留下了深刻的印象。
第三名的解決方案地址:https://www.kaggle.com/c/statoil-iceberg-classifier-challenge/discussion/48207
正如你所看到的,他開始的步驟和我的差不多。但是他不使用inc_angle來訓練模型。而是選擇了另一種方法,用inc_angle來計算另一種預測。因此,他得到了兩種獨立的概率。
然後,他將它們按照公式混合。
p = p1 * p2 / (p1 * p2 + (1 - p1) * (1 - p2))
第一名的解決方案地址:https://www.kaggle.com/c/statoil-iceberg-classifier-challenge/discussion/48241
這些方法在頂級選手中很常見,他們會仔細查看數據。第一名的解決方案的可視化是非常清晰的。
第一名的解決方案:可視化漏洞
>>為什麼在group2訓練樣本中重新訓練100+模型而不使用group1或兩者?
>因為我們認為這些group2的樣本分布與group1不同。對group2的訓練只會消除group1所導致的「偏差」,group1中的數據全部是冰山,從而提高了group2預測的準確性,即使是在較少圖像(約400次)的低成本中也能提高精度。
第二名的解決方案地址:https://www.kaggle.com/c/statoil-iceberg-classifier-challenge/discussion/48294
他調整CV,以防止他的模型利用inc_angle漏洞。
※NASA項目利用人工智慧和區塊鏈讓宇宙飛船學會「思考」
※谷歌、微軟等合作 提出了一種新的量子光子晶元量子系統結構模擬演算法
TAG:ATYUN訂閱號 |