kaggle 相关知识汇总(转载+自己整理)
本文只保留了重要的信息,泛泛之談全部予以刪除。(在知乎中分別搜索kaggle、Kaggle stack之后所有信息的摘錄)
剛參加一個比賽,需要花點時間了解這個比賽的領域背景,甚至需要查一些資料或閱讀一些文獻,這對后面構建特征和選擇模型很重要。我看到有很多 winners 分享經驗說自己構建的大多數特征都是從商業(領域)層面思考得到的,所以領域的先驗知識很重要。
另一需要注意的是比賽的時間線。比賽有一個開始時間,一個組隊截止時間和一個最終提交時間。一般一個比賽會持續幾個月,最終提交時間就是比賽結束的標志。組隊截止時間一般是比賽結束前一周,過了這個時間點就不允許再組隊了。留意好這些時間點,對你把握比賽的進度至關重要,尤其是用業余時間打比賽的上班族。很多比賽的數據量比較大,模型跑下來很耗時,如果到最后半個月才開始發力,會發現時間不夠用,很多想法都沒機會嘗試。有大牛分享自己的時間安排是:在比賽剛開始的時候會多花點時間做探索,把pipeline 搭起來,接下來可以少花點時間,平時有什么想法可以直接測試,最后一個月或半個月再做集中沖刺。
Data
介紹數據,提供數據下載。
這個模塊需要認值閱讀,它介紹數據的產生方式、存儲形式、每個字段的含義等。我們很多時候是通過對數據規模或形式的判斷來決定要不要參加這個比賽。比如,數據規模很大,你沒有內存足夠大的服務器可以hold住,可能就沒法打這個比賽;再比如,是圖像數據,那就得用深度神經網絡,如果對這方面不熟或者沒有GPU可用,可能也沒法打這個比賽。對新手而言,該開始可能更傾向于擇一些表格類、數據量適中的數據集。
為方便大家打比賽,kaggle 提供了一些運算資源。kaggle 用戶的每個 kernel 可以有 16G 的內存和 4 核CPU,這足夠打多數比賽了。另外,最近還提供了 GPU,在新建 kernel 的時候可以選擇開啟 GPU,但當打開 GPU 時,CPU 和內存資源會少一些,大家可以根據情況選擇使用。
?
如果不設置 Private LB(即所有的測試數據都用于計算 Public LB),選手不斷地從 Public LB(即測試集)中獲得反饋,進而調整或篩選模型。這種情況下,測試集實際上是作為驗證集參與到模型的構建和調優中來。Public LB上面的效果并非是在真實未知數據上面的效果,不能可靠地反映模型的效果。劃分 Public LB 和 Private LB 這樣的設置,也在提醒參賽者,我們建模的目標是要獲得一個在未知數據上表現良好的模型,而并非僅僅是在已知數據上效果好。
(這段話我自己的理解是,因為public LB上面有得分,選手會根據這個來改進,所以這種方式等于變相告訴了參賽者測試集的未知類別標簽是什么),知乎上一位網友的說法是這樣的,我很認同.
?
國內用戶可能會存在一個延遲或連接不穩定的問題,有時候甚至刷不出,這個應該是因為墻的原因,最好自己花錢搞個翻墻的代理。
?
Leaderboard
排名區,分 public LB 和 private LB。比賽方會將 test 數據集中一部分(比如 30%)拿出來做為 public LB 評分和排名,剩下的部分作為 private LB(也就是最終結果)的評分和排名。
這個意思是,你下載到的測試集,其實分為兩部分,但是是怎么分的,故意不讓你知道,而是混在一起的,當你把所有測試數據的的結果提交以后,Kaggle服務器會根據事先的劃分方法,以private LB的結果作為你的最終排名.而Public LB的則只是比賽過程中的排名.
你每天都可以提交并查看自己的答案在 public LB 的得分和排名情況,在比賽結束前需要選擇兩個提交作為自己的最終答案,比賽結束后,平臺會計算你的答案的 private LB 得分并自動挑選得分高的一個作為你的最終成績。
在討論區你會經常聽到大家討論 CV score、LB score,指的就是你模型本地交叉驗證的得分和提交后的 public LB 得分。
需要注意的是,public LB 得分可能會和 private LB 得分差別很大,比賽結果公布前你可能排名前十,比賽結果公布后發現自己跌到上千名了,這就是所謂的 shake up,很嚇人的。這次的 Elo 比賽因為異常值的原因也有很大的 shake up,大家很早就預料到了,好在我們組做了一定的準備,抗住了 shake up,從第 8 名跌倒 14 名,還算是比較幸運的。
引用kaggle上面的一段話:
Competition scoring and ranking are based on two leaderboards : public and private. These two leaderboards are created by randomly splitting the test dataset. Public leaderboard is based on a subset of 30% of observations in test dataset you are submitting while the private leaderboard is based on the remaining 70% of data. The private leaderboard remains secret until the end of the competititon. It will determine the final competition ranking!So far, all your submissions are based on the public leaderboard dataset. Using it, you are receiving a feedback about your performance. It can tell you how good you model is and how it is generalizing on unseen data.However, the final leaderboard (70% of test dataset) will determine final result. Before the end of competition ranking (Submissions dead line : 02 April 2019, 23:59), you will have to select your two favorite submissions. By default, Kaggle chooses the two submissions that have performed the best on public leaderboard. However you are free to select the two submissions you want.Finally, these two submissions will result in the private leaderboard and so final ranking. In a Kaggle competition, the purpose of this division is to prevent people from winning by overfitting to the public leaderboard. Participants then are motivated to make sure their models will generalize well to the private leaderboard test set.Therefore, your results on public and private leaderboard could be slightly different. There are multiple ways to explain this difference including :Making a lot of submissions on Kaggle can result in an overfitting situation on public leaderboard. When making dozens of submissions, you could "learn" some imperfection in dataset that would promote a configuration towards an other.什么意思呢?就是本地模型最優的情況下,你的public越低,你的private才能越高
?
Rules
比賽規則。這個很容易被新手忽略,因為都是講一些條款。很多新手甚至是大牛都在這個上面吃過虧。講兩個需要注意的地方。
一是提交次數,這里會寫明每天允許的最大提交次數,一般是 5次,也有比賽時 3次的。假如一個比賽持續時間是三個月,那么總提交次數差不多就是 5×90=450 次,即便組隊,你們隊的總提交次數也是這個值。假如你們隊的三個成員,在比賽最后一個月打算組隊,大家已經各自提交了200、100、50 次,是沒法組隊的(),必須10天不提交,等提交次數達到 350(5×70天)。
很多人為了躲過提交次數的限制或者“節省提交次數”,專門注冊了小號,這是很危險的,這被稱為 multiple accounts,是會被 kaggle 的反作弊系統偵察出來的。在比賽結束后,會先公布初步排名,然后 kaggle 平臺反作弊系統開始運行,大約兩三天后,凡是被判為作弊的隊伍直接從排名中移除,幾個月的努力就打水漂了!
另一個是組外私自分享代碼和結果,這也是明令禁止的。組隊之后隊員之間可以分享,或者通過公開的 kernel或discussion區分享。同樣,如果被檢測出不同隊伍或個人間有相似的結果,也會被移除最終榜單。
Team
這里管理你的隊伍。可以向別人發起組隊邀請,或者接受別人的邀請,當然,也可以時不時給自己隊伍改一個騷氣的名字。我們隊伍最后集齊四人之后,改名為 skynet,是電影《終結者》里人類創造的一個人工智能防御系統,本來是想通過這個霸氣的名字“終結”其他人的,后來發現我們還是 too young too simple, sometimes naive,差點被別人終結。
2. 挑選比賽
對于新手而言,我覺可以從一下幾個方面考慮
比賽類型
借用 Eureka 大牛的觀點,可將 kaggle 平臺上的比賽分成挖掘、圖像、語音和 NLP 四類。其中挖掘類主要面對的是結構化數據,也就是表格數據,包括了各式各樣的預測問題(預測銷量、點擊率、推薦排序等)。主要的共性就是理解數據,理解問題,從數據中找到有用的信息用來預測,這類問題勝負更多的是在特征上。
對于圖像問題,可能就較少涉及到特征了。圖像問題現在主要用到深度學習的相關技術,基于深度學習做了很多改進或者演繹,已經完全不需要在特征層面上去做什么了。
對于新手而言,挖掘類問題可能更容易上手。
數據規模
新手盡量選擇中等規模的數據,這樣數據處理和模型訓練的時間更短,方便嘗試盡可能多的方法。新手缺乏經驗,可以通過多嘗試來彌補,但如果選擇的數據集太大,嘗試的時間成本和計算成本都很大,不管從時間還是精力層面考慮,都是很大的障礙。
數據盡可能有豐富多樣的特征,太完美的數據集不要選。這個大家可能會比較費解,完美的數據集不是更方便嗎?沒有缺失值,都是數值特征,多方便。其實不然,越是這樣的數據集,可供新手發揮的余地就越小,你會發現你唯一能做的就是把數據喂給模型,結果是怎樣就是怎樣了,甚至不知道如何改進、提升。所以,盡量選擇有缺失值、有很多類別特征的數據集,這樣你可以借鑒前人經驗對這些特征做各種變換、嘗試,時不時能收獲一些小驚喜,甚至最后還能取得一個不錯的成績。
3. 如何打好一個比賽
起這樣一個標題有點大言不慚,可能需要一個身經百戰的 Grand Master 來回答這個問題。我這里想分享的是作為一個菜鳥,怎么一步步通過學習和嘗試拿到自己的第一個獎牌。我就以這次參加的 Elo Merchant Category Recommendation 為例講講自己的經歷和感悟。
比賽早期加入
我是在比賽開始后不久就加入的,對于新手而言,早點加入比賽有好處,因為剛開始人不多,大牛更少(他們都是最后一個月強勢加入然后霸占榜首的),這樣你每天的嘗試都是有排名上的收獲,這對自己是一個很大的鼓舞。
理解背景、探索數據與驗證
比賽的背景我看了很多遍:Elo是一家信用公司,它提供了信用卡用戶的一些信息和歷史交易記錄,想通過這些數據預測用戶忠誠度。根據它的描述,我通過數據逐條驗證,發現有疑問的地方就會在 discussion區里提,也會發布一些公開的 kernel 驗證自己的猜測。其中有兩個比較重要的是 ① target 的預測偏差90%是異常值貢獻的,② hist_trans 和 new_trans 的一些基本信息的驗證。這些都很簡單,但對后面的模型起到了很大的幫助。
零模型和基模型
這算是比賽的套路了,先訓練一個baseline model, 然后在這個基礎上不斷優化、提升。我這里要補充的一個點是“零模型”,就是不用模型去做預測,一般就用全零或者全均值去做提交。比如這次的Elo比賽,用全零提交,public LB 得分3.9x,而基模型也只有 3.8x。通過這個對比可以看到模型的效果是很差的,這其實是太多異常值導致的。這些信息對后續的處理或模型評估都很有用。
GBDT已成為挖掘類比賽的主流算法,現成的包有xgboost、lightgbm、catboost,lightgbm因為速度快、準確度高脫穎而出。所以這次比賽,lightgbm 仍是主流的工具。
當然,前期也需要盡可能多地嘗試其他模型,機器學習領域有一個“沒有免費午餐定律”,是說沒有那種模型要比其他模型都好,不同的數據集可能適合不同的模型,這個只用通過嘗試才知道。所以,打 kaggle 比賽,其實更像是不斷地做數據實驗。我早期也試了libffm、RandomForest、LinearRegression、DeepNN等。
本地評估體系
模型評估體系沒建起來,其他任何探索都是盲目的,因為你沒法確定好壞。這個很有講究,你得判斷 public LB 和 private LB 的得分是不是一致的或高度相關的。否則你可能在接下來的幾個月中“一直努力擬合public LB”,結果卻偏離了 private LB,這就是為何大牛一直告誡我們“Trust your CV”的原因。
這次Elo比賽,我早起發現了可以通過手動矯正異常值來提高 public LB 得分,后面通過統計分析與驗證,發現原來是 public Lb 中異常點比隨機水平高,這是很危險的,后來就采用了保守的做法,比賽結果公布后證實了這個想法。
特征重要性和特征工程
前期適當做一些調參,獲取一組相對可以的參數就可以了,不用太花太多時間調參,因為它起得作用很有限。用這組參數和基模型來輸出特征重要性。挑選重要的特征(比如top10)進行分析和構建新特征,然后測試,然后擴大范圍(比如top20)重復以上過程。
這一步是拉開差距的關鍵,也是花最多精力的地方。在這個過程中需要不斷地關注discussion和kernel區,多看別人時怎么提取特征的,多看別人的 EDA,多嘗試,說不定就有啟發你的地方。
對于Elo比賽,前期大家模型輸出的top importance特征都是時間相關的,雖然難以解釋,但方向有了,所以我們也構建了很多時間相關的特征,事實證明,這些特征起到了重要的作用。直到后期,有位Grand Master利用他對數據神乎奇跡的轉換和驚人的洞察力揭開了忠誠度的商業含義,時間相關特征為何如此重要才得到了解釋。
組隊
對于新手而言,你的排名就是你組隊的籌碼。我前期發現異常值矯正后,排名飆升到top20,就有很多人聯系我組隊了,我在discussion區與北京一個小伙伴組隊了,沒過多久又邀請了一名在新加坡讀書的小伙伴,之后我們一直維持在top10的水平,一度長時間位于top5,差點迷失自己,直到后期大牛進入把我們擠出了top10,我們開始緊張起來,又吸收了一名韓國的朋友,慢慢回到了top10。
我們都是第一次打比賽,不過配合得挺好的,建了微信群用英文交流,幾乎無障礙。
模型融合
特征工程和模型融合是打 kaggle 比賽的兩大利器,比賽后期基本就是嘗試各種模型融合了。對于模型融合,大牛的觀點:真正重要的是要有兩三個強模型和很多相關性很小的弱模型,模型多樣性很重要,弱一點也沒關系。幸運的是我們每個人手里都有一個不錯的模型,然后我又批量生成了一些弱模型,融合起來,取得了不錯的效果。
?
?
?
補充:
比賽類型
從 Kaggle 提供的官方分類來看,可以劃分為以下類型(如下圖1所示):
◆?Featured:商業或科研難題,獎金一般較為豐厚;
◆?Recruitment:比賽的獎勵為面試機會;
◆?Research:科研和學術性較強的比賽,也會有一定的獎金,一般需要較強的領域和專業知識;
◆?Playground:提供一些公開的數據集用于嘗試模型和算法;(這個優勝者是不給獎牌的)
◆?Getting Started:提供一些簡單的任務用于熟悉平臺和比賽;(這個優勝者是不給獎牌的)
◆?In Class:用于課堂項目作業或者考試。
圖1. Kaggle 比賽類型
從領域歸屬劃分:包含搜索相關性,廣告點擊率預估,銷量預估,貸款違約判定,癌癥檢測等。
從任務目標劃分:包含回歸,分類(二分類,多分類,多標簽),排序,混合體(分類+回歸)等。
從數據載體劃分:包含文本,語音,圖像和時序序列等。
從特征形式劃分:包含原始數據,明文特征,脫敏特征(特征的含義不清楚)等。
比賽流程
一個數據挖掘比賽的基本流程如下圖2所示,具體的模塊我將在下一章進行展開陳述。
圖2. 數據挖掘比賽基本流程
?
#--------------------------------------------------------其他問題-----------------------------------------------------------------
常見的縮寫:
EDA:exploratory data analysis
https://zhuanlan.zhihu.com/p/52244024
這篇文章中提到pytorch的cuDNN存在不穩定的問題。
另外kaggle中使用的最主流的框架是keras
?
?kaggle 平臺上的比賽分成挖掘、圖像、語音和 NLP 四類
?kaggle既要通過內容來選擇比賽,又要通過shake up來選擇比賽
?triplet loss 主要用于人臉識別
?
往屆公開的比賽解決方案:
http://ndres.me/kaggle-past-solutions/
?
當然,基本的ML知識還是有的。
在比賽中,最常用的分類器一般是Gradient Boosting Tree(GBDT)和Random Forest
(對,你沒看錯,不是那個在教科書中推Dual時讓很多人痛不欲生的SVM)
一些常見的預處理技巧,比如PCA,KMeans,TF/IDF,Hashing等等都還是必須的。
這里就不展開講了。最后,但是非常關鍵的一點是Ensemble 從KDD Cup到Imagenet,
我從來沒見過ensemble不會改善結果的情況,只是多與少的問題。不做ensemble就意味著你自己告別了一大塊寶藏。
作者:Naiyan Wang
鏈接:https://www.zhihu.com/question/24533374/answer/34631808
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
?
magrittr,對于R來說革命性的Pipeline
?
下面是知乎上兩個爭鋒相對的回答。
比如說圖像分割,現在大家都用很長很長的網絡,像resnet101來達到最佳的性能。
而實際上如果你要把網絡部署在移動端,resnet18都已經不合格了,
這個時候我們會考慮使用傳統的卷積網絡,例如FCN,是不是感覺一下子回到了2015年以前?
所以現在很多文章發出來很吊,但實際上不被工業界采納,人們還在用著很早的成果。
作者:陳大寶
鏈接:https://www.zhihu.com/question/295475618/answer/527181753
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
至于說無法deploy和實際生產的,無非是不敢掀開自己只是個重復性搬磚工的遮羞布,
靠經驗和ppt來掩飾自己根本不敢真刀實槍拼精讀的事實。
因為其實在金融時間序列等領域,不同的data science精讀能相差很多的。
在金融領域,特征工程和工程上線落地的時間占90+%。
更糟糕的是數據缺失率很高。(來自知乎)
?
?
另外NLP中關于推薦算法最知名的是FFM,不再是SVD了。
?
Netflix 網飛公司網飛公司組織和推廣了第一個數據科學比賽。
在電影推薦的挑戰比賽中,整合創造真的推動了最新的成果,
也許是因為過于復雜,網飛公司決定不在生產中使用獲勝的算法。
那是一個簡單而復雜的算法。然而,許多的論述和新奇的算法,從這場比賽中產生:
- 堆放線性權重特征 [Feature-Weighted Linear Stacking]- ?
針對精確推薦系統的混合預測 [Combining Predictions for Accurate Recommender Systems]- ?
針對Netflix Prize的混合算法 [The BigChaos Solution to the Netflix Prize]
作者:HaoHao
鏈接:https://zhuanlan.zhihu.com/p/37106935
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
?
這個鏈接提到了在比賽中制造數據
https://zhuanlan.zhihu.com/p/62773597
?
提到了以label分布進行數據分割。(我覺得這個的意思應該是會按照特征分布來進行數據分割。)
https://zhuanlan.zhihu.com/p/33740042
?
?
?
特真工程的本質不就是還原線性或者還原分段線性
https://zhuanlan.zhihu.com/p/62773597
?
Kaggle上面有人提到了這個,說是自己沒看懂。
https://www.kaggle.com/ogrellier/feature-selection-with-null-importances
?
?
?
關于 pubilc LB以及private LB:
@cpmpml?is very much correct. We always split time-based data by time for Train/Test, and Public/Private. If we didn't do that, the Public leaderboard score would provide feedback (leakage) for future time points.
所以kaggle的數據分割方式是,希望你的模型能夠預測未來。
總結
以上是生活随笔為你收集整理的kaggle 相关知识汇总(转载+自己整理)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: kaggle奖牌发放体系(转)
- 下一篇: OSError: Could not f