0
本文作者: AI研習(xí)社-譯站 | 2019-05-21 10:25 |
本文為 AI 研習(xí)社編譯的技術(shù)博客,原標(biāo)題 :
How to Start Competing on Kaggle
作者 | Chirag Chadha
翻譯 | IinIh 編輯 | 鄧普斯?杰弗、王立魚
原文鏈接:
https://towardsdatascience.com/how-to-begin-competing-on-kaggle-bd9b5f32dbbc
如果剛剛完成你的第一個(gè)機(jī)器學(xué)習(xí)課程,不確定如何開始使用新學(xué)的知識(shí)。那你應(yīng)該從簡(jiǎn)單的Iris數(shù)據(jù)集開始,或者是練習(xí)下Titanic的數(shù)據(jù)(這可能是最先應(yīng)該做的事)。但是有什么更有趣的,能直接上手,和網(wǎng)絡(luò)上的陌生人一起比賽并獲得獎(jiǎng)金呢?
如果你正在讀這篇文章,你應(yīng)該已經(jīng)知道Kaggle是一個(gè)數(shù)據(jù)科學(xué)的比賽平臺(tái),在這里大家可以使用結(jié)構(gòu)化(數(shù)值或者類別的表格化數(shù)據(jù))和非結(jié)構(gòu)化數(shù)據(jù)(比如文字,圖像,音頻),參與到大量機(jī)器學(xué)習(xí)話題的比賽中,并且?guī)е@取獎(jiǎng)金和人人向往的Kaggle金牌的目標(biāo)。盡管你可能會(huì)說(shuō)和別人一起比賽會(huì)有所膽怯,但是最重要的是學(xué)習(xí)到更多的知識(shí),而不是關(guān)注比賽結(jié)果。帶著這樣的心態(tài),你會(huì)發(fā)現(xiàn)比賽會(huì)變得有趣,收獲滿滿,甚至上癮。
在你開始一個(gè)新的比賽的時(shí)候,這是要考慮的最重要的事。你需要給自己大約兩個(gè)月的時(shí)間來(lái)解決一個(gè)問(wèn)題,并真正熟悉數(shù)據(jù)的來(lái)龍去脈。這需要花費(fèi)大量的時(shí)間。選擇了一個(gè)你沒(méi)有很大興趣的比賽,只會(huì)讓你變得更加沒(méi)有興趣,在加入比賽的幾個(gè)星期之后就放棄了。在比賽時(shí)間軸的早期加入,會(huì)給你更多的時(shí)候去了解背景知識(shí),在與社區(qū)成員一起解決問(wèn)題的各個(gè)階段提高學(xué)習(xí)質(zhì)量。
聚焦在學(xué)習(xí)上
如果你發(fā)現(xiàn)對(duì)比賽感到沮喪并認(rèn)為這太困難了,那么就要盡可能地集中精力學(xué)習(xí)并持續(xù)向前。專注于學(xué)習(xí)材料中,這樣你可以學(xué)習(xí)更多。當(dāng)你不在擔(dān)心在排行榜上的排名時(shí),也許你就能找到一個(gè)突破口。
嘗試去理解分?jǐn)?shù)排名最高的kernels的每一行代碼。
問(wèn)問(wèn)自己是否有淺顯的方法能夠提高他們的結(jié)果。比如說(shuō),你是否可以創(chuàng)建新的特征來(lái)提升模型的分?jǐn)?shù)?是否可以稍微調(diào)整他們使用的學(xué)習(xí)率來(lái)獲得更好的性能?去尋找一些垂下來(lái)的水果,而不要嘗試重新發(fā)明輪子。這種心態(tài)能極大加速你的學(xué)習(xí),同時(shí)確保你不會(huì)變得沮喪。
檢查規(guī)則中奇怪的規(guī)定
這一點(diǎn)沒(méi)有和其他內(nèi)容那么重要,盡管如此還是要注意下。最近的一個(gè)比賽中包含了下面這樣一條規(guī)則:
[ 你的提交] 中不能包含機(jī)密信息和商業(yè)秘密,不能是已注冊(cè)的專利或者是正在提交申請(qǐng)專利的應(yīng)用.
一個(gè)用戶在論壇中說(shuō)到,這個(gè)對(duì)規(guī)定會(huì)使得使用dropout變成違法的,這個(gè)技術(shù)已經(jīng)由Google申請(qǐng)了專利。
在整個(gè)比賽過(guò)程中你需要常常去查看下Kernels和討論區(qū)。
從查看一些EDAs(Exploratory Data Analyses?, Exploratory Data Analysis’s?, Exploratory Data Analysii?)開始,來(lái)判斷你在這個(gè)領(lǐng)域和話題的興趣程度。在你瀏覽別人的成果時(shí),一邊思考適合這個(gè)模型的數(shù)據(jù)的新想法,比如說(shuō)特征工程等等。
在討論區(qū)中“歡迎”的帖子中提供了非常好的背景知識(shí)。
獲取在這個(gè)比賽領(lǐng)域中的知識(shí)一定是有好處的,這能夠幫助你深入理解你的模型怎樣工作,能極大地幫助到你的特征工程。我通常在比賽開始之前會(huì)花費(fèi)一周或者兩周的時(shí)間去閱讀盡可能多的材料理解這個(gè)問(wèn)題。為了幫助到大家,大部分的比賽組織者會(huì)在論壇中創(chuàng)建入門的帖子,并給出這個(gè)領(lǐng)域中重要的論文/文章的鏈接。他們也許還會(huì)提供如何解決大數(shù)據(jù)集的提示,和數(shù)據(jù)的基本見解。當(dāng)您獲得有關(guān)手頭問(wèn)題的更多信息時(shí),這些流程總是值得檢查并回顧。
最初對(duì)于數(shù)據(jù)集的分析,針對(duì)你分析的數(shù)據(jù)類型的不同差別很大。但是,這些概念通常在各個(gè)領(lǐng)域都是相似的,下面的內(nèi)容可以根據(jù)你研究的特定領(lǐng)域進(jìn)行調(diào)整。為了簡(jiǎn)單起見,我們假設(shè)這里是結(jié)構(gòu)化的數(shù)據(jù)。這里是一些在進(jìn)行數(shù)據(jù)分析前基礎(chǔ)的問(wèn)題。
目標(biāo)數(shù)據(jù)是怎樣分布的?
在不同的特征之前是否有顯著的相關(guān)性?
數(shù)據(jù)中共是否有缺失值?
訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù)多相似?
目標(biāo)數(shù)據(jù)是怎樣分布的?
第一件事你應(yīng)該做的是看下數(shù)據(jù)集中各個(gè)類別的分布。如果存在類不平衡,你需要快速找到,因?yàn)檫@會(huì)對(duì)模型產(chǎn)生重大影響。特別是在訓(xùn)練中一個(gè)類別會(huì)淹沒(méi)到其他類別的信息。這里有一些解決不平衡類別的技術(shù)(比如,SMOTE,ADASYN,手動(dòng)移除樣本,模型的參數(shù)來(lái)解決不平衡的數(shù)據(jù)集),但是首先我們需要確定數(shù)據(jù)中的類別是否均勻。一個(gè)快速檢查的方法就通過(guò)繪制庫(kù),seaborn,基于流行的matplotlib庫(kù)。
多類別的不平衡目標(biāo)
我們可以看到,類別90在數(shù)據(jù)中被過(guò)分表示。前面提到的SMOTE和其他技術(shù)可以創(chuàng)建一個(gè)更加平衡的數(shù)據(jù)集。繼而,可以使得模型更好地推廣到從沒(méi)見過(guò)的,不存在平衡問(wèn)題的數(shù)據(jù)中。
特征之間是否存在顯著的相關(guān)性?
計(jì)算特征之間的皮爾遜相關(guān)系數(shù)(Pearson correlation coefficient)能夠獲得特征中極有用的信息。知道特征是否相關(guān)能夠幫助我們做特征工程,或者是去除不需要的數(shù)據(jù)列。比如說(shuō),在下面展示的熱圖中,EXT_SOURCE_1是外部來(lái)源提供的對(duì)一個(gè)貸款申請(qǐng)者的信用評(píng)級(jí)。DAYS_BIRTH,申請(qǐng)者按天的方式計(jì)算的年齡,和EXT_SOURCE_1是負(fù)相關(guān)的。這可能意味著EXT_SOURCE_1的計(jì)算中包含了申請(qǐng)者的年齡。通常來(lái)說(shuō),我們想要避免包含一個(gè)能夠被其他特征線性組合得到的特征(稱之為線性相關(guān)),它為模型提供了冗余的信息。
顯示數(shù)值特征之間的Pearson相關(guān)系數(shù)正值和負(fù)值的熱圖
數(shù)據(jù)中是否有缺失值?
你總是想要確保得到一個(gè)完整的數(shù)據(jù)集,包含盡可能少的缺失值。例如,如果模型發(fā)現(xiàn)一個(gè)非常重要的特征,但卻發(fā)現(xiàn)該特征中的大量行是缺失值,則可以通過(guò)輸入缺失值來(lái)大大提高模型的性能。這可以通過(guò)不包含NaN的類似行推斷特征的值來(lái)完成。另外一個(gè)方式(稱為backfill)是用下一個(gè)非空的值來(lái)填充缺失值。特征中非空數(shù)據(jù)的均值,中值或模式有時(shí)也用于估算缺失值。pandas.DataFrame.fillna()的方法提供了一些不同的選項(xiàng)來(lái)處理缺失值問(wèn)題,這個(gè)Kaggle Kernel也是有幫助值得一讀的資源。
但是,缺失值并不總是意味著沒(méi)有記錄數(shù)據(jù)。有時(shí)候,一個(gè)特征中包含NaN是有意義的,那上述的方法就不適用于這個(gè)數(shù)據(jù)行。例如,一個(gè)包含二元目標(biāo)的貸款申請(qǐng)數(shù)據(jù)集中(是否批準(zhǔn)申請(qǐng)者的申請(qǐng))包含一個(gè)申請(qǐng)者是否擁有一輛車的特征。如果某個(gè)人沒(méi)有汽車,那么另一個(gè)關(guān)于汽車登記日期的特征會(huì)包含NaN值,因?yàn)檫@里沒(méi)有可填寫的信息。
訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù)有多少相似?
pandas的DataFrame對(duì)象包含了pandas.Dataframe.describe() 方法能夠提供特征在數(shù)據(jù)集中的統(tǒng)計(jì)信息,比如說(shuō)最大值,平均值,標(biāo)準(zhǔn)差,第50百分位值等等。這個(gè)方法會(huì)返回另外一個(gè)DataFrame,這樣你就可以添加額外你想要的信息。比如說(shuō),你可以添加一行來(lái)檢查每一列中缺失值的數(shù)量,實(shí)現(xiàn)的函數(shù)如下:
這是一個(gè)非常有用的方法,可以讓你快速地檢查訓(xùn)練集和測(cè)試集中特征的相似性。但是如果是想要有一個(gè)單一數(shù)值就可以很好地了解訓(xùn)練集和測(cè)試集的相識(shí)度呢?那就要用到對(duì)抗驗(yàn)證(adversarial validation)方法了。這個(gè)詞匯可能聽起來(lái)有點(diǎn)嚇人,但是一旦理解了這個(gè)技術(shù),那它就非常的簡(jiǎn)單。對(duì)抗驗(yàn)證包含下面的步驟:
將訓(xùn)練和測(cè)試數(shù)據(jù)集結(jié)合起來(lái)組成一個(gè)大的數(shù)據(jù)集
將所有的訓(xùn)練行中目標(biāo)特征都設(shè)置為0
在所有的測(cè)試行中目標(biāo)特征都填充1(等下你就會(huì)知道這在做什么)
從數(shù)據(jù)中創(chuàng)建分層折疊(可以直接使用sklearn中的實(shí)現(xiàn))
將LightGBM模型,或者其他模型,擬合到訓(xùn)練折疊并驗(yàn)證驗(yàn)證折疊
在整個(gè)數(shù)據(jù)集上做驗(yàn)證預(yù)測(cè),并計(jì)算ROC曲線(area under the receiver operating characteristic curve)。我使用的是這個(gè)實(shí)現(xiàn)來(lái)計(jì)算這個(gè)面積。
ROC曲線下面積為0.5表示模型無(wú)法區(qū)分列訓(xùn)練和測(cè)試行,因此兩個(gè)數(shù)據(jù)集相似。 如果面積大于0.5,那么模型可以看到訓(xùn)練和測(cè)試集之間存在一些差異,因此值得您深入挖掘數(shù)據(jù)以確保您的模型能夠在測(cè)試中做好預(yù)測(cè)。
我找到下面的兩個(gè)kernel能幫助你掌握這個(gè)技術(shù):
https://www.kaggle.com/tunguz/adversarial-santander
https://www.kaggle.com/pnussbaum/adversarial-cnn-of-ptp-for-vsb-power-v12
開始時(shí)確定正確的模型是很重要的,當(dāng)你剛開始參加比賽時(shí)可能會(huì)非常困惑。假設(shè)說(shuō)你現(xiàn)在處理的是結(jié)構(gòu)化數(shù)據(jù),你想要在進(jìn)入構(gòu)建模型之前先獲取數(shù)據(jù)的內(nèi)在信息。在你進(jìn)入一個(gè)新的比賽時(shí),非常適合將數(shù)據(jù)扔給LightGBM或者XGBoost模型。他們都是基于樹的提升模型,并且具有很好的可解釋性,很容易理解。兩者都提供了繪制其分割的功能,這個(gè)功能很有用,創(chuàng)建最大深度= 3左右的樹,可以從一開始就準(zhǔn)確查看模型分割的所利用的特征。
lightgbm.Booster.feature_importance()方法給出了對(duì)于模型而言最重要的特征,這是從模型在特定的特征上做了多少次分割(重要類型=“分割”)或者是在特定特征上的每次分割獲得了多少的信息(重要類型=“獲得”)的角度上來(lái)說(shuō)的。查看特征重要性在匿名數(shù)據(jù)集中特別有用,在這些數(shù)據(jù)集中,可以獲取前5個(gè)特征并推斷出特征可能是什么,并了解它們對(duì)模型的重要性。 這可以極大地幫助特征工程。
即使不使用GPU,你也會(huì)發(fā)現(xiàn)LightGBM的訓(xùn)練速度是非常快的。最后,對(duì)于這兩個(gè)模型都有著非常優(yōu)秀的文檔,初學(xué)者學(xué)習(xí)他們應(yīng)該沒(méi)有任何問(wèn)題。
在不知道如何使用可靠的模型評(píng)估方法時(shí),你沒(méi)有辦法在比賽中得到性能最好的模型。在參與比賽之前了解官方評(píng)估指標(biāo)是至關(guān)重要的。一旦確切了解你的提交是如何評(píng)估,就應(yīng)該確保在訓(xùn)練和驗(yàn)證中使用官方評(píng)估指標(biāo)(如果沒(méi)有合適的實(shí)現(xiàn)方案,則使用自己的版本)。將評(píng)估指標(biāo)與可靠的驗(yàn)證集相結(jié)合,可以避免在提交上反復(fù),并能夠快速且經(jīng)常地進(jìn)行測(cè)試和驗(yàn)證。雷鋒網(wǎng)雷鋒網(wǎng)雷鋒網(wǎng)
此外,如果你想要在最后用單一的數(shù)值來(lái)設(shè)置模型的評(píng)估。查看訓(xùn)練損失與驗(yàn)證損失或一系列指標(biāo),包括精確度,召回率,F(xiàn)1得分,AUROC等,這些對(duì)于實(shí)際產(chǎn)品中非常有幫助,但在比賽中,你想要的是能夠快速看到一個(gè)數(shù)字并說(shuō)出 “這個(gè)模型比我之前的更好”。再次強(qiáng)調(diào),這個(gè)數(shù)值需要是官方的指標(biāo)。如果不是的話,你應(yīng)該有充分的理由不這樣做。
如果你遵循上述建議,在經(jīng)常的實(shí)驗(yàn)中,你需要一種可靠的方法來(lái)跟蹤結(jié)果。我喜歡用一個(gè)跑在Docker容器上的MongoDB實(shí)例,在每次執(zhí)行我的評(píng)估腳本之后,將模型和參數(shù)和驗(yàn)證分?jǐn)?shù)發(fā)給這個(gè)實(shí)例。我為每個(gè)模型分別保存了一個(gè)表格(或者是在MongoDB中稱為collection)。當(dāng)我執(zhí)行完成了幾次實(shí)驗(yàn)之后,我將記錄作為一個(gè)MongoDB.archive文件和csv文件,下載到我電腦的本地目錄中,以便于快速瀏覽。代碼在原文。
在這里說(shuō)明下,關(guān)于如何處理記錄結(jié)果有不同的思想流派,這是我的首選方法,但我很想知道其他數(shù)據(jù)科學(xué)家如何處理它!
Chirag Chadha 是一名在愛爾蘭都柏林 UnitedHealth Group/Optum.的數(shù)據(jù)科學(xué)家。你可以使用這個(gè)郵箱與之聯(lián)系(chadhac@tcd.ie), 他的LinkedIn, 或者在Kaggle 和GitHub關(guān)注他。
要繼續(xù)查看該篇文章相關(guān)鏈接和參考文獻(xiàn)?
點(diǎn)擊【如何開始 kaggle 比賽之旅】即可訪問(wèn):
https://ai.yanxishe.com/page/TextTranslation/1698
社長(zhǎng)今日推薦:AI入門、大數(shù)據(jù)、機(jī)器學(xué)習(xí)免費(fèi)教程
35本世界頂級(jí)原本教程限時(shí)開放,這類書單由知名數(shù)據(jù)科學(xué)網(wǎng)站 KDnuggets 的副主編,同時(shí)也是資深的數(shù)據(jù)科學(xué)家、深度學(xué)習(xí)技術(shù)愛好者的Matthew Mayo推薦,他在機(jī)器學(xué)習(xí)和數(shù)據(jù)科學(xué)領(lǐng)域具有豐富的科研和從業(yè)經(jīng)驗(yàn)。
點(diǎn)擊鏈接即可獲取:https://ai.yanxishe.com/page/resourceDetail/417
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。