“終極學生搜索”比賽 TOP5獲獎學生獲勝秘籍
◆ ◆ ◆
介紹
“競賽中的終極勝利源自於全力以赴的內在滿足感。”
這是一次僅由學生參與的編程馬拉鬆比賽(hackathon) -- “終極學生搜索”。一經發布就引起了爆發性的反響,來自世界各地的年輕的機器學習的冠軍們競相在冠軍榜上爭得一席之地。在競賽的過程中,有接近1500名注冊參與者,並進行了15000份結果的提交!在學生論壇中有超過20000份關於競賽的信息交流。
老實說,起初我們既驚喜又驚訝於參賽者們的回應,並且覺得需要對學生論壇進行一些掌控。可事實證明我們完全是杞人憂天!代碼的質量、解決方案的複雜性和思維過程的精湛性與可行性都讓我們大吃一驚。可以很自信地說,機器學習的未來掌握在正確的人的手中。
為增強參賽者的體驗,我們邀請了贏得過去兩次AV編程馬拉鬆的頂級數據科學家Rohan Rao進行了一場AMA(Ask Me Anything)。Rohan不僅很平易近人而且給了學生們巨大的啟發。盡管我們聯係他的時間距離這次AMA很短,可他也答應了,而且AMA持續了比約定更長的時間,並且還在結束的時候做了快速問答。
相信我,如果你沒有參加這個獨一無二的競賽,你就錯失了一個巨大的機會。為了分享知識,排名前五位的參賽者分享了他們的解決辦法和代碼。讀接下來的內容看看你錯失了什麼,並且在那裏可以加強改進。
◆ ◆ ◆
競賽
這個競賽在2016年9月24號發布,吸引了來自世界各地的數據科學學生進行了注冊。競賽持續了九天,所有的參賽者都無所顧慮的進行了比賽。我們發布這個競賽是為了幫助學生們在機器學習編程馬拉鬆裏證明他們的氣魄。我們被這些對機器學習有著無限熱情的年輕人的互動震驚到了。
目睹著競賽帶來的騷動,學生們在開始之後還是持續的參與著。截至競賽截止時間2016年10月2日23時59分,共有1494名參賽者。
參賽者被要求幫助Gardenia這個國家來理解他的國民的健康習慣。使用的評估度量是RMSE(方均根差)。問題的設定是為了讓這些對數據科學熱情的年輕人應用機器學習探索、創新。
◆ ◆ ◆
比賽任務
Gardenia是一個堅信需要在科技與自然資源之間尋求和諧的國家。在過去的幾年中,他們想出了很多應用先進的科技來更有效地利用自然資源的辦法。
這個保護了自然資源和花園的做法讓他們引以為傲。接下來Gardenia政府就希望能夠應用數據科學產生出一些關於國民健康習慣的見解。
Gardenia的市長想知道在特定的某一天有多少人訪問了公園。他們提供一些相關的環境信息,並希望年輕的數據科學家們能幫助他們。
◆ ◆ ◆
獲勝者
盡管這個競賽很激烈、很具有挑戰性,可總還是會有一些參賽者的解決方案與大多數人不同,並最終成為冠軍。讓我們給這些獲勝的冠軍們送上最誠摯的祝賀,這的確來之不易。
第一名 – Benedek Rozemberczki
https://datahack.analyticsvidhya.com/user/profile/benedekrozemberczki
第二名 – Aakash Kerawat & Akshay Karangale ( Team – AK )
https://datahack.analyticsvidhya.com/user/profile/aakashkerawat
https://datahack.analyticsvidhya.com/user/profile/Akki9011
第三名 – Mikel Bober ( a.k.a. anokas )
https://datahack.analyticsvidhya.com/user/profile/anokas
第四名 – Akhil Gupta
https://datahack.analyticsvidhya.com/user/profile/guptakhil
第五名 – Akash Gupta
https://datahack.analyticsvidhya.com/user/profile/akashgupta222
◆ ◆ ◆
冠軍的解決方案
第五名:Akash Gupta (羅奧爾凱埃,印度)
Akash Gupta是印度羅奧爾凱埃IIT大學四年級的學生。他很熱愛數據科學,並且參與了幾個競賽來測試他的知識與技能。
下麵是他分享的內容:
我起初使用pad方法(直接複製前一行的數值)來處理缺失值,因為一個公園某一天的狀況應該和前一天比較相似。更好的辦法可能是分別對每一個公園做這個步驟。接下來在特征選擇的過程中我發現月份和日期很大程度上影響並決定了腳步數。
我給冬季(11月,12月,1月,2月,3月)做了一個0/1特征。 至於日期我發現了一些規律:平均腳步數隨著日期的增加而改變。遇到一些特例,我就把當日的腳步數與和他相鄰的兩天的腳步數加和進行平均(我把所有的公園和到一起來做的,更好的辦法是把每一個公園分開對待)。同時,我把風向整合為四個方向。
建模的時候,我先用了Gradient Bossted Tree的方法,一點點的調試它以得到最好的結果(用2000-2001年做測試集)。接下來我試著用XGBoost並調試。最終,我采取了一個隱藏層的神經網絡和一個寬隱藏層。我把三個模型的結果進行了平均得到了最終的結果。
除此之外,在用gradient boosting和xgboosting模型是,我分別對每一個公園進行了回歸,因為我相信每一個公園的特征和與其它變量的關係都不相同。而在神經網絡模型中,我把公園的ID作為一個變量放進了模型(即該模型是對所有公園的)因為需要一個大一些的訓練集。
代碼鏈接(https://github.com/analyticsvidhya/The_Ultimate_Student_Hunt/tree/master/Rank%204)
第四名: Akhil Gupta(魯爾基,印度)
Akhil Gupta是IIT Roorkee大四的學生,對於深度數據科學研究很感興趣,他希望能在年輕人中普及數據科學。而他也和我們分享了他的方法:
我的方法挺簡單直接的。我著重把精力都花在數據預處理上了,具體的模型實現上反而沒花那麼多時間。這是個平衡數據集,有連續變量也有類別變量。
一開始我一直在處理缺失值,因為有些變量40%的數據都缺失了。通過觀察我發現一個公園的特征都和那一天同一地點的其他公園相關。所以我的第一個解法隻用了日期,月份和公園ID。這個答案當時在排行榜上得分是146。後來我繼續處理缺失值,增加了一些特征,單憑這些分數就提高到到了113。
我清理了一些數據上的噪音,並把所有的變量都按比例轉變到0到10之間,因為不同特征原本的值域差別挺大的。
將類別變量分區也很重要,因為當你用Boxplot觀察它們的中位數時,你就能發現不同公園、月份和日期之間都有很大的相似度。我沒有在模型上花太多時間,隻試了Gradient Boosting Regressor,我覺得如果在調參之後用XGB可以讓分數再提高一些。
交叉驗證也是關鍵。我用了2000-2001的數據驗證我的模型。
相信我,這個數據集很有意思,讓我忙了四五天呢。我還算放鬆,但是LB排行榜的壓力給了我很多努力的動力。
代碼連接(https://github.com/analyticsvidhya/The_Ultimate_Student_Hunt/tree/master/Rank%204)
第三名:Mikel Bober(倫敦,英國)
Mikel Bober,也就是anokas,是一位年輕的機器學習冠軍,年紀輕輕的他卻已名聲在外了,他是Kaggle天才,就連專業人士也都稱讚不絕。這次比賽他全程都活躍在論壇裏,給所有參賽者分享他的知識和看法:
我在任何比賽裏做的第一件事就是先提交一個基礎模型來驗證數據集,並且用它的得分作為後續複雜模型的參照。我最先試的是XGBoost,我知道這裏不能用隨機分離,因為我們預測的是一個時間序列。
我把訓練集按照時間分為訓練和驗證集,用訓練集裏最後三年的數據作為驗證集。最初的模型驗證的時候RMSE是190,在排行榜上得分是220。這之後我做了些簡單地的特征工程。一開始最明顯的失誤就是沒有把日期變量考慮進來,因為它不是數值變量所以我最開始就把它排除了。我把特征按公園劃分了,這樣XGBoost可以更好地對每個公園建模。之後我又在XGBoost裏加了一個衡量特征重要性的函數。我看了一下各個特征的重要性得分,沒想到風向竟然是最重要的。
做了最初的特征工程之後我就想花時間想一些新的,很重要的特征。我發現像強行盯著各種圖這樣並不能有新的發現,相反,如果我退一步重新審視問題,從更簡單的角度出發,往往能發現別人想不到的。你得問問自己“有哪些事情會影響人們去公園?”
我的結論是,如果一周內連續下了很久的雨很能影響人們去公園。所以我創建了“lead”和“lag”變量,把過去兩天和未來兩天的特征也作為當下時間的特征。這麼做很成功,我的得分一下子就提高到109了。
而為了把天氣用進模型,我寫了一個爬蟲爬天氣網站的數據,爬到了印度主要城市從90年代以來的天氣數據。然而這些數據似乎全都沒用,我進入了一個死胡同。但即使很有可能失敗,也不能害怕去嚐試。那些最終獲勝的人也是嚐試過更多失敗特征的人,但他們不會因為失敗就止步不前。
在任何比賽裏我的最後一步都是做一個集成模型。這次的集成模型很簡單,我在Keras裏用了一批神經網絡。我把每一層的權重都存了起來,在神經網絡走完的時候取這些權重中損失值(loss)低於某一標準的值,用這些權重的平均值作為最終神經網絡的權重。最終,我用了兩個模型的均值作為最後的提交。
完整的方法在這裏(https://medium.com/implodinggradients/how-i-got-3rd-place-in-the-ultimate-student-hunt-3ecf827375a6#.op2t2q7kk)
代碼連接(https://github.com/analyticsvidhya/The_Ultimate_Student_Hunt/tree/master/Rank%203)
第二名:Aakash Kerawat(魯爾基,印度)和Akshay Karangle (魯爾基,印度)
Aakash Kerawat和Akshay Karangle都是印度IIT Roorkee大四的學生。Aakash已經參加過很多次機器學習的競賽了。這一次他們是組隊一起參加的。
看看他們都說了些什麼:
我們從研究數據和可視化目標變量與日期的關係開始,並且發現這兩個變量有明顯的關係。所以我們又從日期變量中創建了新的變量,像是星期,一年中的第幾天,一個月中的第幾天,月份和年份。用這些新特征和原始特征我們試著用了幾個不同的模型,從線性模型到XGBoost,而XGBoost的表現最好,在公開的排行榜上得分是133.xx。
之後我們把連續型的天氣變量拆分,創建像“平均風速”,“風向”等變量。直覺告訴我們還要把月份聚合成季度,因為不同季節公園的人流量會不同。作圖的結果也表明不同季節公園的平均人流量明顯不同。我們還根據提供的最大值和最小值,創建了對於氣壓、風速等變量的範圍特征。這些新特征將預測結果提高到123.xx。繼續調參之後分數又提高到118.xx。到這兒之後我們就找不到繼續提高的辦法了。我們還試過另一組特征,用了按照“公園ID及風向區間”,“公園ID及最小濕潤指數”等分組的平均人流量,但這個模型過度擬合了。
為了得到更好的結果我們對數據做了更深入的研究,對日期和幾乎其他所有變量做了圖。從這些圖裏我們似乎感覺到有些噪音在裏麵。去除噪音的方法是用了這些變量的移動平均線(moving average/rolling means),參數是3.7和30天。這一步讓我們的結果有了一大步提高,從118到了107.xx。不止於此,我們又想到了另一個特征,天氣變量兩天裏的的“變化百分比”。因為我們想把這種兩天內的天氣變化加入到模型裏。這使得我們的分數又進一步提高到了100.xx。然後我們調試了moving average的不同參數,測試它們在驗證集上的表現,同時得避免過度擬合。最終的模型有大概43個變量,在公開的和私人的排行榜上分別有96.xx和86.xx的得分。
這次比賽讓我們學到,正確的特征工程是提高比分的關鍵之一。
代碼連接(https://github.com/analyticsvidhya/The_Ultimate_Student_Hunt/tree/master/Rank%202)
第一名:Benedek Rozemberczki (愛丁堡,英國)
Benedek Rozemberczki 在愛丁堡大學的數據科學研究組實習。而他在這個領域的專業知識和能力也讓他成為了這次比賽的第一名。
來看看他說了什麼:
-
讓我早早領先的因素是對比賽的動力。每當其他組得分接近我的時候,我也總能夠想到新的特征工程方法。
-
很關鍵的一點是如果麵板數據(panel data)的時間序列除了季節性之外還相對平穩,xgboost能很好地處理數據的季節性。還有一點就是,如果能夠聚集不同單位內的數據(across observational unit aggregates),就沒有必要解決缺失值的問題了。用麵板數據就能很好地做特征工程。
-
碰壁的時候坐在電腦旁漫無目地地敲代碼並不能解決問題。我們得想辦法獲得新的靈感,哪怕是用白板組織思路都是有用的。
-
理解缺失值總會有幫助的,這次比賽也是。
-
自動化數據處理的過程:自己寫一些hot-one encoders和歸一化函數。我漸漸的在各種數據科學的項目裏用了自己寫的函數,我覺得有一套在各種地方都能用的函數是很重要的。
原文發布時間為:2016-10-27
本文來自雲棲社區合作夥伴“大數據文摘”,了解相關信息可以關注“BigDataDigest”微信公眾號
最後更新:2017-06-01 13:32:04