一份完整的數(shù)據(jù)科學(xué)競(jìng)賽指南!
如今,數(shù)據(jù)科學(xué)競(jìng)賽(大數(shù)據(jù)競(jìng)賽,機(jī)器學(xué)習(xí)競(jìng)賽,人工智能算法競(jìng)賽)已經(jīng)成為各大知名互聯(lián)網(wǎng)企業(yè)征集解決方案和選拔人才的第一選擇,很多同學(xué)為了拿到大廠offer,紛紛加入了數(shù)據(jù)競(jìng)賽的浪潮之中。遺憾的是,大部分同學(xué)都在激烈的競(jìng)爭(zhēng)中成為炮灰,許多人不停地上網(wǎng)瀏覽各類(lèi)競(jìng)賽開(kāi)源分享,卻依舊感到困惑迷茫。
在過(guò)去幾年時(shí)間內(nèi),筆者靠著個(gè)人天賦和不懈努力,從0到1地走通了數(shù)據(jù)科學(xué)競(jìng)賽方法論,培養(yǎng)了一直數(shù)據(jù)科學(xué)競(jìng)賽的團(tuán)隊(duì),并作為隊(duì)長(zhǎng)率多名選手參與了近20次數(shù)據(jù)科學(xué)競(jìng)賽,獲得前5名5次,前10名8次,賽題方向包括金融、交通、信息安全、廣告推薦、運(yùn)籌優(yōu)化等。考慮到近幾年在數(shù)據(jù)科學(xué)競(jìng)賽里取得的豐厚的成果,我將自己的獨(dú)門(mén)秘笈進(jìn)行了詳細(xì)總結(jié)并開(kāi)源之,希望可以幫助更多同學(xué)快速上手相關(guān)比賽。
我認(rèn)為這份競(jìng)賽秘笈與市面上流傳的各種競(jìng)賽分享相比,更real,更direct,更c(diǎn)unning。如果你想快速成為競(jìng)賽高手,這份文檔是你必須要認(rèn)真研究的參考資料。
下面,我將從三個(gè)方面來(lái)詳細(xì)介紹數(shù)據(jù)科學(xué)競(jìng)賽,然后在結(jié)尾處談一點(diǎn)個(gè)人的感悟。建議不熟悉機(jī)器學(xué)習(xí)建模套路的同學(xué)先搞清楚流程,熟悉建模套路的同學(xué),直接看經(jīng)驗(yàn)干貨即可。

一、數(shù)據(jù)科學(xué)家競(jìng)賽是什么?
二、為什么要做數(shù)據(jù)科學(xué)競(jìng)賽?
三、怎樣做數(shù)據(jù)科學(xué)競(jìng)賽?
3.1 武器庫(kù)
3.2 賽題分析
3.3 數(shù)據(jù)探索
3.3.1 數(shù)據(jù)整體認(rèn)知
3.3.2 數(shù)據(jù)質(zhì)量分析
3.3.3 數(shù)據(jù)統(tǒng)計(jì)量分析
3.3.4 數(shù)據(jù)分布分析
3.3.5 數(shù)據(jù)探索小結(jié)
3.4 特征工程
3.4.1 數(shù)據(jù)預(yù)處理
3.4.2 特征構(gòu)造
3.4.2.1 思想方法
3.4.2.2 特征構(gòu)造舉例
3.4.2.3 特征構(gòu)造 注意事項(xiàng)
3.4.3 特征選擇
3.4.4 特征工程總結(jié)
3.5 模型選擇
3.6 模型優(yōu)化
3.6.1 評(píng)估方法
3.6.2 性能度量
3.6.3 參數(shù)調(diào)整
3.7 模型融合
3.8 迭代策略
3.9 其他
四、總結(jié)

數(shù)據(jù)科學(xué)競(jìng)賽是由企業(yè)或者研究機(jī)構(gòu)通過(guò)競(jìng)賽平臺(tái)發(fā)布商業(yè)和科研難題,通過(guò)高額獎(jiǎng)金的懸賞,吸引全球的數(shù)據(jù)科學(xué)家參與,利用眾包方式解決建模問(wèn)題的一種游戲。這個(gè)游戲本質(zhì)上就是一種打擂臺(tái)的玩法,符合各種有限游戲的規(guī)則設(shè)計(jì),不過(guò)你同時(shí)要與成百上千的人PK。
數(shù)據(jù)科學(xué)競(jìng)賽一般通過(guò)各類(lèi)數(shù)據(jù)競(jìng)賽平臺(tái)進(jìn)行發(fā)布,最著名的數(shù)據(jù)科學(xué)競(jìng)賽平臺(tái)是Kaggle和天池,Kaggle的背后是Google,天池的背后是阿里巴巴。當(dāng)然,還有很多公司自己組織的比賽和頂級(jí)學(xué)術(shù)會(huì)議籌辦的比賽。如果你想做比賽的話,去下面這些平臺(tái)上尋找適合自己的比賽即可:
Kaggle,天池
京東智匯平臺(tái),DataFountain,DataCastle,科賽網(wǎng),創(chuàng)新工場(chǎng)AIChallenger等
騰訊,滴滴出行,第四范式,中國(guó)平安,融360,中國(guó)農(nóng)業(yè)銀行等
SIGKDD,ICDM,CIKM,IJCAI等

第一,讓你100%清楚哪些算法在實(shí)際應(yīng)用中更有效。解釋一下,這里的“有效”包括算法的性能和效率。現(xiàn)在很多人往往是看過(guò)了周志華的西瓜書(shū),就覺(jué)得自己懂機(jī)器學(xué)習(xí)了,這是很可笑的。最典型的例子就是很多人覺(jué)得SVM是最好用的分類(lèi)器。包括很多發(fā)過(guò)會(huì)議論文的同學(xué),其實(shí)也是停留在理論的烏托邦,而且論文的results部分有多real也很難判斷。做比賽你可以拿到工業(yè)界的數(shù)據(jù),而且這些數(shù)據(jù)都是頭部互聯(lián)網(wǎng)大廠的實(shí)際業(yè)務(wù)數(shù)據(jù),所以在實(shí)戰(zhàn)的過(guò)程中,我們可以逐漸井底之蛙蛻變?yōu)榘肯柙谔炜盏男埴棧芮宄刂滥男┧惴ê糜茫男┓椒孔V,哪些人在吹逼和忽悠。
第二,結(jié)識(shí)朋友,提升人脈。做比賽時(shí)如果你運(yùn)氣比較好,可以和優(yōu)秀的同學(xué)組隊(duì),當(dāng)然前提是你自己足夠牛逼。另外,如果你拿到了某個(gè)競(jìng)賽top5或top10,你的team有可能被邀請(qǐng)去參加線下的答辯,這絕對(duì)是認(rèn)識(shí)技術(shù)大牛,提升人脈的好機(jī)會(huì)。比如筆者就去過(guò)像阿里云、京東、滴滴、馬上金融,中國(guó)平安、中國(guó)農(nóng)業(yè)銀行這樣的單位參與線下答辯,在緊張的答辯之余,利用吃吃喝喝的時(shí)間進(jìn)行social,運(yùn)氣好的話,你還能加到某些公司中高級(jí)管理者的微信。截止目前,國(guó)內(nèi)競(jìng)賽圈一半以上的頭部大佬都是我的朋友,有些還在一起玩比賽、做課題。
第三,訓(xùn)練和提高自己快速寫(xiě)代碼的能力。要知道每場(chǎng)比賽你要在短時(shí)間內(nèi)實(shí)現(xiàn)很多很多的idea,有時(shí)候一天之內(nèi)你要想出三到四個(gè)上分的辦法。這個(gè)過(guò)程講究的是速戰(zhàn)速?zèng)Q,不僅可以訓(xùn)練自己快速寫(xiě)代碼和實(shí)現(xiàn)idea的能力,也可以很好地訓(xùn)練你的判斷力和決策能力。
第四,實(shí)習(xí)機(jī)會(huì) & 高薪工作。像我之前就拿到過(guò)多家大廠的直通終面機(jī)會(huì)。統(tǒng)計(jì)了一下跟我做過(guò)比賽的學(xué)弟學(xué)妹的工作情況,目前大部分就職于知名國(guó)企和互聯(lián)網(wǎng)企業(yè),比如阿里、騰訊、京東、滴滴、美團(tuán)、中國(guó)農(nóng)業(yè)銀行、中國(guó)交通建設(shè)股份有限公司、中國(guó)人壽資產(chǎn)管理有限公司、一汽大眾等等。
第五,獎(jiǎng)金。一般的比賽都會(huì)有獎(jiǎng)金,不給錢(qián)的比賽就別做了,那種比賽除了練手,沒(méi)有任何價(jià)值可言。錢(qián)是體現(xiàn)賽題困難程度的重要指標(biāo)。具體的錢(qián)數(shù),最少1萬(wàn)起,多則稅前30萬(wàn)到50萬(wàn)。但悲哀的是,獎(jiǎng)金一般人是拿不到的,因?yàn)槿魏我粋€(gè)圈子都是1%的人賺走了99%的利潤(rùn),小白們只能跟著長(zhǎng)點(diǎn)見(jiàn)識(shí),苦逼陪跑。

3.1 武器庫(kù)
俗話說(shuō),臺(tái)上一分鐘、臺(tái)下十年功。雖然參加數(shù)據(jù)科學(xué)競(jìng)賽不需要十年的修煉,但還是需要一些基礎(chǔ)的知識(shí)技能作為支撐的,我講以下幾個(gè)方面。
基礎(chǔ)知識(shí)
數(shù)學(xué)基礎(chǔ):微積分、線性代數(shù)、概率論與數(shù)理統(tǒng)計(jì)、優(yōu)化理論
機(jī)器學(xué)習(xí)理論:周志華《機(jī)器學(xué)習(xí)》、李航《統(tǒng)計(jì)機(jī)器學(xué)習(xí)》、Ian Goodfellow和Youshua Bengo《Deep Learning》、Bishop的PRML
目前國(guó)內(nèi)大大小小的課程和博客都在講周志華的西瓜書(shū)和李航的書(shū),但這里我想補(bǔ)充一點(diǎn)個(gè)人的看法:
我認(rèn)為我看過(guò)的最好的講傳統(tǒng)機(jī)器學(xué)習(xí)理論的書(shū)籍是K. P. Murphy的《Machine learning: A Probabilistic Perspective》,其次是Bishop的PRML
另外,臺(tái)大李宏毅老師的網(wǎng)課,真的是十分良心,建議大家去B站學(xué)習(xí)
Python:《Python基礎(chǔ)教程》《利用Python進(jìn)行數(shù)據(jù)分析》《機(jī)器學(xué)習(xí)實(shí)戰(zhàn)》
文獻(xiàn)資料
Paper
主要關(guān)注CCF A里的頂級(jí)會(huì)議論文
arxiv要好好利用
Csdn、知乎、GitHub等開(kāi)源知識(shí)分享平臺(tái)
Kaggle、天池里的各種kernel
軟件配置
開(kāi)發(fā)環(huán)境
Anaconda
Jupyter Notebook
Pycharm
雖然Jupyter Notebook的交互性更好,但個(gè)人更喜歡用Pycharm
開(kāi)源庫(kù)
數(shù)據(jù)處理包:Numpy Scipy Matplotlib Pandas等
機(jī)器學(xué)習(xí)包:Sklearn XGBoost LightGBM Keras TensorFlow Pytorch等
硬件配置
高性能PC:
強(qiáng)推Macbook Pro,資金不足的話可以自己搭Linux。這個(gè)時(shí)代Windows也可以了其實(shí),但用起來(lái)總有些地方讓你不爽。
早年很多關(guān)鍵的包比如lightgbm不支持Windows,筆者也是畫(huà)了一兩個(gè)月的時(shí)間才熟悉了Linux,用熟了還是很順滑的
服務(wù)器
注:現(xiàn)在越來(lái)越多的比賽平臺(tái)提供運(yùn)算資源了,但除非是必須,能不用就不用,因?yàn)榇蠹乙黄饟屬Y源導(dǎo)致寫(xiě)了代碼不能跑的滋味真的很酸爽
關(guān)于以上這些知識(shí)技術(shù)儲(chǔ)備,我建議大家不要一直看書(shū),計(jì)算機(jī)科學(xué)和機(jī)器學(xué)習(xí)的相關(guān)應(yīng)用都是實(shí)踐性很強(qiáng)的項(xiàng)目。任何一門(mén)有關(guān)編程語(yǔ)言的教材,看一周的時(shí)間足夠了。關(guān)鍵在于動(dòng)手實(shí)踐,做項(xiàng)目做比賽,也就是任務(wù)驅(qū)動(dòng)型學(xué)習(xí)。關(guān)于編程我還想說(shuō)一個(gè)原則,就是“天下文章一大抄,看你會(huì)抄不會(huì)抄”。在做一個(gè)任務(wù)時(shí),你的代碼能復(fù)制粘貼就不要自己敲。這些年我見(jiàn)過(guò)很多喜歡耍小聰明的同學(xué),試圖通過(guò)自主實(shí)現(xiàn)一些算法來(lái)證明自己的智商。這其實(shí)是一種十分幼稚的心理,編程本質(zhì)上是一個(gè)結(jié)果導(dǎo)向十分明顯的活動(dòng),解決問(wèn)題遠(yuǎn)比證明你自己有多么優(yōu)秀更重要。
除了以上這些武器之外,你還需要知道做比賽的流程。參與一個(gè)數(shù)據(jù)科學(xué)競(jìng)賽,大致需要這么幾個(gè)步驟:賽題分析,數(shù)據(jù)探索,數(shù)據(jù)預(yù)處理,特征構(gòu)造,特征選擇,模型選擇,模型優(yōu)化,模型融合,預(yù)測(cè)提交。其中數(shù)據(jù)預(yù)處理、特征構(gòu)造、特征選擇合起來(lái)可以稱之為特征工程。然后,還需要一個(gè)有效的迭代策略來(lái)管理你的idea和代碼。做比賽之前一定要將此流程牢記于心并一步一步地進(jìn)行,下面就讓我為大家介紹圖中的每一步具體是如何操作的。

3.2 賽題分析
在我看來(lái)啊,賽題分析其實(shí)是在解決戰(zhàn)略層面的問(wèn)題,這一塊其實(shí)是非常重要的,但市面上的很多開(kāi)源的經(jīng)驗(yàn)分享往往有意回避這一塊內(nèi)容,只談各種具體的方法和技巧。殊不知,真正做成一件事,不僅需要“術(shù)”,還需要“道”,但可惜的是,懂“道”的人實(shí)在是不多。為了讓大家更好地理解數(shù)據(jù)科學(xué)競(jìng)賽中的“道”,我將賽題分析部分總結(jié)為以下這些內(nèi)容,包括對(duì)賽題背景的理解,對(duì)重要時(shí)間的把握,組隊(duì)的規(guī)則,評(píng)測(cè)機(jī)會(huì)的多少,以及對(duì)賽方提供訓(xùn)練數(shù)據(jù)的理解。
關(guān)于賽題背景。你需要仔細(xì)閱讀官方給出的賽題背景,然后查閱相關(guān)資料,對(duì)問(wèn)題場(chǎng)景做深入的理解。因?yàn)閷?duì)于我們這些學(xué)生來(lái)講,我們可能對(duì)機(jī)器學(xué)習(xí)和數(shù)據(jù)挖掘的理論知識(shí)掌握的很好,但缺乏對(duì)具體的問(wèn)題場(chǎng)景理解。這就好比你只會(huì)做算術(shù)題卻不會(huì)做應(yīng)用題。希望大家記住一句話,解決問(wèn)題的第一步是認(rèn)識(shí)問(wèn)題。你只有把問(wèn)題背景認(rèn)識(shí)清楚,看清出題者的動(dòng)機(jī),才有可能在比賽中取得好成績(jī)。
關(guān)于重要時(shí)間。一個(gè)數(shù)據(jù)科學(xué)競(jìng)賽一般要持續(xù)兩到三個(gè)月甚至更長(zhǎng)的時(shí)間,你在這么長(zhǎng)的時(shí)間內(nèi)肯定還會(huì)有其他的事情要做,所以時(shí)間管理是很重要的。所以要根據(jù)賽方給出的重要時(shí)間節(jié)點(diǎn)(包括初賽開(kāi)始時(shí)間、組隊(duì)完成時(shí)間、復(fù)賽開(kāi)始時(shí)間、復(fù)賽結(jié)束時(shí)間、線下答辯時(shí)間),規(guī)劃好比賽與其他工作的時(shí)間安排。這里要插一句,其實(shí)并行工作是很難的,也是很扯淡的。如果你想取的好成績(jī),還是需要專(zhuān)注在一件事上。
關(guān)于組隊(duì)規(guī)則。你一定要想清楚和什么樣的人組隊(duì)。我真心想告訴大家的一句話是,不怕神一樣的對(duì)手,就怕豬一樣的隊(duì)友。這句話什么意思大家應(yīng)該很清楚了。希望大家不拒絕豬隊(duì)友,也不要當(dāng)豬隊(duì)友坑別人。還有一點(diǎn)就是,搞清楚這個(gè)比賽能不能利用小號(hào)。每多一個(gè)小號(hào),意味著多一倍的評(píng)測(cè)機(jī)會(huì)。你的評(píng)測(cè)機(jī)會(huì)越多,你上分的可能性越大。因此,每場(chǎng)比賽都會(huì)有很多人拿不同的手機(jī)號(hào)去注冊(cè)競(jìng)賽平臺(tái)的賬號(hào)以求增加自己的評(píng)測(cè)機(jī)會(huì),排行榜上也存在大量的小號(hào)。有時(shí)候你雖然線上測(cè)評(píng)的分?jǐn)?shù)在提高,但名次依然再下降,這時(shí)候不要灰心,說(shuō)不定是前排大佬的小號(hào)把你踢了下來(lái)。
關(guān)于評(píng)測(cè)機(jī)會(huì)。搞清楚每天有幾次評(píng)測(cè)機(jī)會(huì)、幾點(diǎn)開(kāi)始評(píng)測(cè)。較大的比賽受限于計(jì)算資源,每天只有一次評(píng)測(cè)機(jī)會(huì),這種情況下還是得好好做線下的測(cè)試,珍惜每一次提交的機(jī)會(huì)。同時(shí),基于評(píng)測(cè)次數(shù),設(shè)計(jì)每天的模型迭代策略。另外要注意的是,評(píng)測(cè)次數(shù)多不一定是好事,因?yàn)榇螖?shù)多了之后對(duì)自己有利,但對(duì)手也有利。所以在同樣的游戲規(guī)則下,如何充分利用各方面的條件提高自己的排名,的確是個(gè)需要你認(rèn)真琢磨的事情。
關(guān)于賽題數(shù)據(jù)。你需要搞清楚,賽方提供了什么數(shù)據(jù)?要解決的問(wèn)題:分類(lèi)問(wèn)題 or 回歸問(wèn)題?用什么軟件工具:個(gè)人PC or 官方計(jì)算平臺(tái)?提交什么樣的結(jié)果?也就是結(jié)果的數(shù)據(jù)格式要求。我在剛剛做比賽的時(shí)候經(jīng)常出現(xiàn)因?yàn)樘峤粩?shù)據(jù)文件格式不正確而浪費(fèi)評(píng)測(cè)機(jī)會(huì)。
3.3 數(shù)據(jù)探索
主要包括四個(gè)方面:數(shù)據(jù)整體認(rèn)知、數(shù)據(jù)質(zhì)量分析、數(shù)據(jù)統(tǒng)計(jì)量分析、數(shù)據(jù)分布分析
3.3.1 數(shù)據(jù)整體認(rèn)知
所謂的整體認(rèn)知就是,研究訓(xùn)練集、測(cè)試集、表數(shù)、記錄數(shù)、用戶數(shù)、變量數(shù)、變量類(lèi)型、變量屬性值、標(biāo)簽等內(nèi)容,然后繪制實(shí)體-關(guān)系圖。實(shí)體-關(guān)系圖(E-R圖)包括三個(gè)組成部分:實(shí)體、屬性、關(guān)系。學(xué)過(guò)數(shù)據(jù)庫(kù)的同學(xué)應(yīng)該熟悉E-R圖這個(gè)概念。
比如我在做IJCAI2018阿里媽媽國(guó)際廣告算法大賽時(shí),就繪制了如下圖的實(shí)體關(guān)系圖來(lái)幫助我們理解數(shù)據(jù)。

把這個(gè)圖畫(huà)出來(lái)之后,對(duì)每個(gè)屬性變量,施以哲學(xué)中的三大靈魂拷問(wèn):
你是誰(shuí)?
你從哪兒來(lái)?
你要到哪里去?
也就是搞清楚每一個(gè)變量包含了什么信息,搞清楚它的來(lái)龍去脈,搞清楚變量和變量之間的關(guān)系。通過(guò)這個(gè)過(guò)程,讓你對(duì)整個(gè)問(wèn)題背景和原始數(shù)據(jù)有一個(gè)深入地了解,為后續(xù)工作做準(zhǔn)備。
3.3.2 數(shù)據(jù)質(zhì)量分析
所謂數(shù)據(jù)質(zhì)量分析,就是分析數(shù)據(jù)的缺失值、重復(fù)值、異常值、歧義值、正負(fù)樣本比例(樣本不平衡)等特性。由于這些東西都會(huì)影響到模型的學(xué)習(xí)效果,所以在后面做數(shù)據(jù)預(yù)處理時(shí)需要做相應(yīng)的工作。

3.3.3 數(shù)據(jù)統(tǒng)計(jì)量分析
數(shù)據(jù)統(tǒng)計(jì)量分析主要分為三塊:
第一,對(duì)單個(gè)變量的統(tǒng)計(jì)分析。比如考察單個(gè)變量的均值、中位數(shù)、眾數(shù)、分位數(shù)、方差、變異系數(shù)等。常用的工具有:直方圖、箱線圖、小提琴圖等。
第二,對(duì)兩個(gè)變量的統(tǒng)計(jì)分析。這里主要考察的是兩個(gè)變量統(tǒng)計(jì)分布之間的關(guān)系。常用的工具包括散點(diǎn)圖、相關(guān)性分析圖、熱力圖等。
第三,對(duì)多個(gè)變量的統(tǒng)計(jì)分析。可以使用彩色的散點(diǎn)圖,或者RadViz(詳見(jiàn)scikit-yb.org/en/latest)。

3.3.4 數(shù)據(jù)分布分析
數(shù)據(jù)分布分析指的是考察某個(gè)字段或某些字段的統(tǒng)計(jì)分布。包括頻數(shù)、時(shí)間、空間三個(gè)方面。
頻數(shù)統(tǒng)計(jì)。用概率論的語(yǔ)言講叫累積分布函數(shù)CDF。比如在IJCAI2018阿里媽媽國(guó)際廣告算法大賽中,我們就統(tǒng)計(jì)了不同點(diǎn)擊次數(shù)下各有多少用戶。基于類(lèi)似的累積分布函數(shù)圖我們就可以知道用戶行為的分布情況,進(jìn)而可以幫助我們充分理解數(shù)據(jù)。
時(shí)間維度上的統(tǒng)計(jì)分布。我們可以觀察事件發(fā)生的趨勢(shì)和周期性,這里會(huì)涉及不少時(shí)間序列的知識(shí)。比如下圖所示的“每天的點(diǎn)擊數(shù)趨勢(shì)”,就是在時(shí)間維度上考察點(diǎn)擊數(shù)的變化情況。
空間維度上的統(tǒng)計(jì)分布,我們可以尋找某個(gè)變量在地理位置上的相關(guān)關(guān)系。比如2020年以來(lái)我們十分熟悉的疫情地圖,就是一種空間上的分布分析。
另外,以上三種分析常常結(jié)合分組or聚類(lèi)方法,對(duì)細(xì)分的業(yè)務(wù)場(chǎng)景進(jìn)行考察,為后面的數(shù)據(jù)建模做鋪墊。
3.3.5 數(shù)據(jù)探索小結(jié)
對(duì)于數(shù)據(jù)探索,我總結(jié)了幾個(gè)需要牢記在心的關(guān)鍵點(diǎn),分別是:對(duì)比,分組,頻數(shù),抓大放小和可視化。
所謂對(duì)比,指的是在做數(shù)據(jù)探索時(shí),考慮對(duì)比訓(xùn)練集不同樣本之間的特征分布,還要考慮對(duì)比訓(xùn)練集和測(cè)試集中每一個(gè)特征的分布。
所謂分組,就是在做數(shù)據(jù)探索時(shí),常常用到按類(lèi)別標(biāo)簽、某個(gè)離散變量的不同取值groupby后的sum、unique。
所謂頻數(shù),就是要注意考察并自行計(jì)算某些變量的概率累積分布。諸如“事件發(fā)生次數(shù)”這樣的的統(tǒng)計(jì)量需要自己計(jì)算;有時(shí)還要關(guān)注“同id下某個(gè)事件多次發(fā)生”的統(tǒng)計(jì)。
所謂抓大放小,就是對(duì)于那些特征重要性較高的變量,要做重點(diǎn)分析。因?yàn)檫@些變量對(duì)你模型預(yù)測(cè)能力的影響是較大的。
所謂可視化,就是建議大家在做數(shù)據(jù)探索的時(shí)候多畫(huà)圖(尤其是各種趨勢(shì)圖、分布圖),圖形給人的沖擊力往往是要大于數(shù)字本身的。
3.4 特征工程
下面我們來(lái)講特征工程。這也是做數(shù)據(jù)競(jìng)賽時(shí)最重要的一項(xiàng)內(nèi)容。
首先說(shuō)一下為什么要做特征工程。
在我們解決一個(gè)機(jī)器學(xué)習(xí)問(wèn)題時(shí),輸入機(jī)器學(xué)習(xí)模型的數(shù)據(jù)必須是標(biāo)準(zhǔn)的向量形式。但當(dāng)我們處理現(xiàn)實(shí)世界的數(shù)據(jù)時(shí),數(shù)據(jù)并不會(huì)以格式規(guī)范的特征向量的形式呈現(xiàn)在我們面前。相反,呈現(xiàn)給我們的數(shù)據(jù)是數(shù)據(jù)庫(kù)記錄、時(shí)間序列、圖像、音頻、文字等形式,同時(shí)還存著在大量的噪聲數(shù)據(jù)。所以我們需要一定的方法把非結(jié)構(gòu)化的數(shù)據(jù)轉(zhuǎn)化為結(jié)構(gòu)化的數(shù)據(jù)。
結(jié)合維基百科,我給特征和特征工程做了如下定義:
特征:An variable useful for your modeling task,which describe/represent our data
特征工程:A process of using domain knowledge, techniques, experiences or even tricks to create features that make machine learning algorithms work well.
為了說(shuō)明特征工程的重要性,這里聚一個(gè)小例子。下圖中有一些藍(lán)色的點(diǎn)和一些綠色的點(diǎn),在直角坐標(biāo)系下它們的分布如左圖所示,肉眼看上去,它們顯然是屬于兩個(gè)類(lèi)別,但是如果你想用一個(gè)機(jī)器學(xué)習(xí)的線性分類(lèi)器去做分類(lèi)的話是很困難的。但是你把這些點(diǎn)轉(zhuǎn)移到極坐標(biāo)系下,它們就可以很容易用一個(gè)線性分類(lèi)器做分類(lèi)了。從這個(gè)地方我們就能看出數(shù)據(jù)的表示方式對(duì)機(jī)器學(xué)習(xí)模型的效果的影響還是很大的。

我希望大家記住一點(diǎn),就是在解決一個(gè)機(jī)器學(xué)習(xí)問(wèn)題時(shí),最關(guān)鍵的就是去研究如何表示你的樣本,而特征工程解決的就是representation的問(wèn)題,F(xiàn)eature engineering is a?representation?problem。這里把傳統(tǒng)的軟件開(kāi)發(fā)和機(jī)器學(xué)習(xí)項(xiàng)目做一個(gè)簡(jiǎn)單的比較:在編程開(kāi)發(fā)項(xiàng)目中,很關(guān)鍵的地方在于如何優(yōu)化你的代碼;而在機(jī)器學(xué)習(xí)項(xiàng)目中,關(guān)注點(diǎn)變成了表示。也就是說(shuō),開(kāi)發(fā)者通過(guò)添加和改善特征來(lái)調(diào)整模型。
所以,這也是我們?nèi)?nèi)經(jīng)常說(shuō)的,“數(shù)據(jù)和特征決定了機(jī)器學(xué)習(xí)的上限,而模型和算法只能去逼近這個(gè)上限”。我希望大家應(yīng)該牢牢地記住這句話。不管是做機(jī)器學(xué)習(xí)的比賽還是實(shí)際的項(xiàng)目,特征工程都是最最重要的一部分。這里引用了兩句英文來(lái)進(jìn)一步證明這個(gè)道理:
Coming up with features is difficult, time-consuming, requires expert knowledge. "Applied machine learning" is basically feature engineering.
—?吳恩達(dá)Andrew Ng, Machine Learning and AI via Brain simulations
“...some machine learning projects succeed and some fail. What makes thedifference? Easily the most important factor is the features used.”
—《終極算法:機(jī)器學(xué)習(xí)和人工智能如何重塑世界》作者 Pedro Domingos
我將特征工程分為三個(gè)部分,分別是數(shù)據(jù)預(yù)處理、特征構(gòu)造和特征選擇。下面分別介紹這些內(nèi)容。
3.4.1 數(shù)據(jù)預(yù)處理
首先來(lái)說(shuō)一下為什么要做數(shù)據(jù)預(yù)處理。首先,考慮到海量原始數(shù)據(jù)中存在大量信息缺失、不一致、冗余值、異常值等,會(huì)影響我們模型的學(xué)習(xí)效果。另外,在用各種模型算法時(shí)也要牢記監(jiān)督學(xué)習(xí)的假設(shè),即正負(fù)樣本要平衡且訓(xùn)練集和測(cè)試集樣本是獨(dú)立同分布的。第三,在模型訓(xùn)練時(shí),數(shù)據(jù)規(guī)范化的操作可以讓梯度下降算法收斂得更快,也就是更快地找到最優(yōu)超參數(shù)。
傳統(tǒng)意義上的數(shù)據(jù)預(yù)處理一般包括數(shù)據(jù)清洗、數(shù)據(jù)集成、數(shù)據(jù)重采樣、數(shù)據(jù)變換(特征編碼)和數(shù)據(jù)規(guī)范化(特征縮放),這一塊的內(nèi)容也是網(wǎng)絡(luò)上流傳最廣、介紹最多的數(shù)據(jù)分析技巧,因此我不做具體的解釋?zhuān)瑑H僅把各自常用的處理技巧羅列一下。
數(shù)據(jù)清洗
缺失值插補(bǔ)
均值、中位數(shù)、眾數(shù)插補(bǔ)
固定值插補(bǔ)
最近鄰插補(bǔ)
離群值
直接刪除
替換法
異常、冗余值
直接刪除
小技巧:用訓(xùn)練集數(shù)據(jù)學(xué)習(xí)一個(gè)模型,然后用它預(yù)測(cè)訓(xùn)練集的標(biāo)簽,刪除預(yù)測(cè)結(jié)果偏差較大的樣本
數(shù)據(jù)集成
多表數(shù)據(jù)整合
一對(duì)一
一對(duì)多
多對(duì)一
多對(duì)多
數(shù)據(jù)重采樣
滑窗法:
對(duì)于時(shí)間序列數(shù)據(jù),選取不同的時(shí)間窗間隔,可以得到多份訓(xùn)練數(shù)據(jù)集
該方法可以增加訓(xùn)練樣本,也方便做交叉驗(yàn)證實(shí)驗(yàn)
非平衡重采樣:調(diào)整正負(fù)樣本量
欠采樣
過(guò)采樣
組合采樣
數(shù)據(jù)變換
連續(xù)變量離散化(分箱)
等頻
等寬
聚類(lèi)
離散變量編碼
One-hot Encoding
Label Encoding
長(zhǎng)尾分布
Ln、Log
數(shù)據(jù)規(guī)范化
Min-Max
Z-score
MaxAbs
網(wǎng)絡(luò)上羅列的這些方法,如何更高效地使用,詳見(jiàn)t.zsxq.com/IMfe2vB。
3.4.2 特征構(gòu)造
在一個(gè)機(jī)器學(xué)習(xí)比賽中,很多的有效特征都不是直接給出的,需要自己去挖掘。不要以為實(shí)際中的訓(xùn)練數(shù)據(jù)都像UCI開(kāi)源的數(shù)據(jù)集那樣簡(jiǎn)單直接好用。
我把基于對(duì)原始數(shù)據(jù)的數(shù)據(jù)探索,不斷構(gòu)造新特征的過(guò)程定義為特征構(gòu)造(Feature Construction)。在這個(gè)過(guò)程中,你需要深入了解場(chǎng)景知識(shí),并做大量開(kāi)腦洞的工作。但僅憑開(kāi)腦洞和無(wú)腦地堆砌并不能真正解決問(wèn)題,如果你想構(gòu)造出具有可解釋性且豐富的特征,需要一套思想方法。
在此我給出一種特征構(gòu)造的思想方法,希望能給大家一定的啟發(fā)。
3.4.2.1 思想方法
理解字段
抽取實(shí)體
分析實(shí)體關(guān)系
設(shè)計(jì)特征群
按特征群分別構(gòu)造特征
考察特征群關(guān)系,進(jìn)一步構(gòu)造新特征
3.4.2.2 特征構(gòu)造舉例
t.zsxq.com/IMfe2vB
3.4.2.3 特征構(gòu)造 注意事項(xiàng)
t.zsxq.com/IMfe2vB
3.4.3 特征選擇
前面你構(gòu)造了很多特征,但這些特征不一定都是有用的,需要用特征選擇的辦法把有用的特征選出來(lái)。Feature selection is a process that chooses an optimal subset of features。特征選擇可以幫你篩選有效特征,消除冗余信息,提高訓(xùn)練效率,避免模型發(fā)生過(guò)擬合。
常用的特征選擇方法如下圖所示:

我一直覺(jué)得特征選擇是那種爛大街的知識(shí)。可問(wèn)題是,這些方法都要用嗎?哪個(gè)好用?哪個(gè)效率最高?t.zsxq.com/IMfe2vB
3.4.4 特征工程總結(jié)
這樣整個(gè)特征工程部分就講完了。我最后想提醒大家,在數(shù)據(jù)科學(xué)競(jìng)賽中,特征工程是一個(gè)需要不斷迭代測(cè)試的過(guò)程,也就是說(shuō),數(shù)據(jù)探索、數(shù)據(jù)預(yù)處理、特征工程要反復(fù)多次進(jìn)行。所以,一定要把75%以上的時(shí)間放在特征工程的工作上。

3.5 模型選擇
我知道每個(gè)機(jī)器學(xué)習(xí)小白在做比賽前都把周志華的西瓜書(shū)和李航的《統(tǒng)計(jì)機(jī)器學(xué)習(xí)》翻了一遍又一遍。那我想問(wèn)大家一個(gè)問(wèn)題:書(shū)上講的算法模型,比如LR,GLM,SVM,KNN,NN,Tree,RF,Adaboost,在機(jī)器學(xué)習(xí)比賽中,到底用什么,哪個(gè)好用,哪個(gè)效率最高?
答:都不用!!!!!!!!
我想這個(gè)答案可能有點(diǎn)出乎大家的意料吧。畢竟大家學(xué)了大半學(xué)期的機(jī)器學(xué)習(xí),都是在講這些玩意兒的原理。你是不是忽然覺(jué)得有些迷茫了呢?自己學(xué)了大半學(xué)期的書(shū)本竟然像垃圾一樣沒(méi)用。
然后我想告訴大家,數(shù)據(jù)科學(xué)競(jìng)賽的模型大殺器是:基于決策樹(shù)的集成學(xué)習(xí)模型,例如LightGBM、XGBoost、CatBoost等。
從好用程度上來(lái)看:LightGBM > XGBoost > CatBoost。你甚至可以只用LightGBM來(lái)學(xué)習(xí)你的訓(xùn)練數(shù)據(jù)。
下面我想解釋兩個(gè)問(wèn)題:
一,為什么梯度提升樹(shù)打數(shù)據(jù)挖掘競(jìng)賽優(yōu)勢(shì)明顯?
看一個(gè)機(jī)器學(xué)習(xí)模型的開(kāi)源工具好不好用,主要是看訓(xùn)練效率和學(xué)習(xí)能力的trade-off。像LightGBM這樣的模型,訓(xùn)練速度快,效率高,還支持并行和GPU計(jì)算;同時(shí)能夠處理大規(guī)模的數(shù)據(jù),算法的學(xué)習(xí)能力更強(qiáng),預(yù)測(cè)精確度高。
二、為什么深度學(xué)習(xí)模型打數(shù)據(jù)挖掘競(jìng)賽優(yōu)勢(shì)不大?
在此引用吳恩達(dá)老師在Coursera公開(kāi)課中的一張圖。

該圖橫軸表示的是訓(xùn)練數(shù)據(jù)的條數(shù),縱軸顯示的是多種模型的學(xué)習(xí)效果。從這個(gè)圖可以看出,當(dāng)你的數(shù)據(jù)規(guī)模比較小時(shí),深度學(xué)習(xí)模型的效果甚至還不如普通的機(jī)器學(xué)習(xí)模型。所謂的數(shù)據(jù)規(guī)模比較小,我給一個(gè)判斷標(biāo)準(zhǔn):2000萬(wàn)訓(xùn)練樣本。也就是說(shuō),沒(méi)有兩千萬(wàn)的訓(xùn)練樣本,深度學(xué)習(xí)模型根本無(wú)法施展它的威力。所以在傳統(tǒng)的機(jī)器學(xué)習(xí)比賽中,我們還是用lightGBM這種集成樹(shù),簡(jiǎn)單粗暴卻又威力無(wú)窮。
3.6 模型優(yōu)化
模型優(yōu)化主要分為三塊,在此以一個(gè)思維導(dǎo)圖呈現(xiàn):

3.6.1 評(píng)估方法
周志華老師的西瓜書(shū)中討論了三種模型優(yōu)化的方法,分別是留出法,自助法和交叉驗(yàn)證法。在我看來(lái)這也屬于爛大街的知識(shí)。還是老問(wèn)題,在打比賽時(shí),我們應(yīng)該如何使用這些方法,有哪些關(guān)鍵性的技巧?這里有幾條經(jīng)驗(yàn)跟大家分享。

來(lái)點(diǎn)干貨:
比賽中最常用的模型評(píng)估方法是留出法和K折交叉驗(yàn)證法。
t.zsxq.com/IMfe2vB
3.6.2 性能度量
在比賽中常見(jiàn)的指標(biāo)(性能度量)包括AUC、Logloss、K-S、F1、Kappa系數(shù)等,這些指標(biāo)都是綜合考量模型對(duì)正類(lèi)和負(fù)類(lèi)的預(yù)測(cè)能力,更具有說(shuō)服力。
來(lái)點(diǎn)干貨:
線下測(cè)試時(shí),應(yīng)多使用幾種指標(biāo),單刷賽題給定的指標(biāo)容易發(fā)生過(guò)擬合
如果幾個(gè)指標(biāo)同時(shí)上漲,則可以證明你的特征&模型取得了實(shí)質(zhì)性的改進(jìn)
針對(duì)賽題使用的性能度量指標(biāo),推導(dǎo)其數(shù)學(xué)原理,思考特殊的優(yōu)化策略
3.6.3 參數(shù)調(diào)整
主要方法:
網(wǎng)格搜索(Grid Search)
貝葉斯優(yōu)化(Bayesian Optimization)
啟發(fā)式算法(Heuristic Algorithms,如GA、模擬退火,PSO)
工具包:Hyperopt等
關(guān)于調(diào)參我實(shí)在不想講太多東西,雖然網(wǎng)上這一塊可能扯的很多。但一般扯的越多的東西,一般都是扯淡。事實(shí)上,用一用網(wǎng)格搜索就足夠了。
來(lái)點(diǎn)干貨:t.zsxq.com/IMfe2vB
3.7 模型融合
所謂的模型融合,主要是指對(duì)不同子模型的預(yù)測(cè)結(jié)果的融合。江湖上有人說(shuō),“Feature決定了模型效果的上限,而ensemble就是讓你更接近這個(gè)上限”。
模型融合的方法網(wǎng)上有很多,在此我簡(jiǎn)單羅列一下。
方法:
簡(jiǎn)單加權(quán)平均:0.5*result_1+0.5*result_2
Bagging:對(duì)訓(xùn)練集隨機(jī)采樣,訓(xùn)練不同的base model,然后投票;可以減少方差,提升模型的穩(wěn)定性(隨機(jī)森林就是這個(gè)原理)
Boosting:弱分類(lèi)器提升為強(qiáng)分類(lèi)器,并做模型的加權(quán)融合;可以減少學(xué)習(xí)誤差,但容易過(guò)擬合
Blending:拆分訓(xùn)練集,使用不重疊或者部分重疊的數(shù)據(jù)訓(xùn)練不同的base model,然后分別預(yù)測(cè)test數(shù)據(jù),并加權(quán)融合(這是個(gè)好辦法)
Stacking:網(wǎng)上講的很多,但極易造成過(guò)擬合,尤其是數(shù)據(jù)量小時(shí)過(guò)擬合嚴(yán)重,不建議使用

其實(shí)網(wǎng)上的資料總會(huì)給你各種誤導(dǎo),所以我想直接講干貨,告訴你如何更高效地用這些方法。
t.zsxq.com/IMfe2vB
3.8 迭代策略
t.zsxq.com/IMfe2vB

3.9 其他
還有一些內(nèi)容是我想強(qiáng)調(diào)的,這些東西依然是戰(zhàn)略層面的。不得不說(shuō),它們對(duì)你很重要。
第一,做比賽的第一步是完成一個(gè)從0到1的原型設(shè)計(jì)。這是一種原型思維。也就是說(shuō),你要先做出一版能提交的結(jié)果,并提交成功。走完這一步,你才算剛剛上路。做任何事,完成從0到1的過(guò)程都是最重要的。
第二,一定保證自己的代碼是正確的,所謂正確指的是,正確地表達(dá)了你的idea而不僅僅是沒(méi)有語(yǔ)法邏輯bug。這一點(diǎn)也是小白常常犯的錯(cuò)誤。
第三,寫(xiě)一個(gè)較為自動(dòng)化的、高效率的代碼框架。在數(shù)據(jù)預(yù)處理的部分,一定要少用暴力的for循環(huán)。一個(gè)入門(mén)級(jí)的baseline在這里:github.com/yzkang/My-Da,大家可以直接基于此代碼做特征工程即可。
第四,關(guān)于時(shí)間和精力的分配。做比賽是一件很辛苦的事情,每天壓力很大,常常晝夜顛倒,沒(méi)日沒(méi)夜地寫(xiě)代碼。所以,一定要善于抓住主要矛盾。數(shù)據(jù)探索+特征工程的部分要分配75%的時(shí)間和精力。模型優(yōu)化及調(diào)參占15%,模型融合占10%。另外,珍惜你的每一次提交機(jī)會(huì)。
第五,在閑暇時(shí)間,及時(shí)更新你的武器庫(kù),多閱讀開(kāi)源經(jīng)驗(yàn)分享,多跟大佬們請(qǐng)教和學(xué)習(xí)。

最后我想談一談自己這幾年做比賽、做項(xiàng)目、做論文、做團(tuán)隊(duì)的一點(diǎn)收獲,希望大家批評(píng)指正。
首先,我認(rèn)為不管是在學(xué)校做事情還是在公司做事情,結(jié)果導(dǎo)向、以終為始是十分重要的思維方式。牢記鄧公所講的黑貓白貓論,通過(guò)不斷地磨練讓自己成為一只好貓。當(dāng)然,這種思維方式可能不太適合體制內(nèi)的工作人員。
其次,編程的目的不是秀自己的智商,而是蓋一棟房子,解決一個(gè)問(wèn)題,實(shí)現(xiàn)一個(gè)目標(biāo)。所以不重復(fù)造輪子是很重要的,我一直堅(jiān)持的一個(gè)觀點(diǎn)是,能抄別人的代碼堅(jiān)決不自己寫(xiě),不到萬(wàn)不得已堅(jiān)決不自己寫(xiě)。我們的手機(jī),每個(gè)零件都有專(zhuān)門(mén)的廠家進(jìn)行加工,編程做比賽也是一個(gè)道理。如果華為不購(gòu)買(mǎi)別人家的芯片,一百年也造不出一個(gè)手機(jī)。通過(guò)借鑒吸收別人的經(jīng)驗(yàn)成果,安全避坑,高效率地完成自己的目標(biāo),才是快速創(chuàng)造價(jià)值的真諦。
第三,很多事情都是實(shí)踐出真知。就拿編程來(lái)講,你把編程語(yǔ)言的課本翻爛也學(xué)不會(huì)編程。機(jī)器學(xué)習(xí)的理論學(xué)的再好,你依然不會(huì)解決實(shí)際問(wèn)題。很多工科性質(zhì)的知識(shí),你看過(guò)但沒(méi)有用過(guò),跟沒(méi)看過(guò)一樣。如果你是工科生,一定要注意多動(dòng)手,多實(shí)踐。
第四,有競(jìng)爭(zhēng)的地方就有江湖。在江湖上混,打鐵還需自身硬。希望你知道,優(yōu)秀的人只會(huì)和優(yōu)秀的人合作,想升級(jí)你做事的圈子,先把自己搞成相對(duì)優(yōu)秀的人。世界上絕大多數(shù)的合作都是強(qiáng)強(qiáng)聯(lián)合。
第五,靠天賦、努力還是運(yùn)氣?我認(rèn)為做比賽最需要的是強(qiáng)烈的興趣和自我驅(qū)動(dòng)力,和智商的高低其實(shí)沒(méi)有太大關(guān)系。一個(gè)比賽,你想做到Top50,我猜用這份資料講述的經(jīng)驗(yàn)應(yīng)該足夠了。你想做到Top10,需要堅(jiān)持不懈的努力。你想做到Top5,多多少少還是需要一點(diǎn)運(yùn)氣的,畢竟在一個(gè)比賽的最后幾天,提交機(jī)會(huì)相對(duì)越來(lái)越少,怎么把握這些提交機(jī)會(huì),還是需要你與生俱來(lái)的判斷力。
最后,送給大家一句話吧:勝利后的復(fù)盤(pán)可能非常精彩,但實(shí)現(xiàn)的過(guò)程則枯燥而艱難。
祝大家都能在數(shù)據(jù)科學(xué)競(jìng)賽中取得好成績(jī)!
附:我的競(jìng)賽成績(jī)總結(jié)

部分未完成競(jìng)賽

?
