本文將對資料競賽的『技巧』進行全面的總結,同時還會分享下個人對比賽方法論的思考。前者比較客觀,總結了不同資料型別下涉及到的比賽技巧;後者稍微主觀,是我個人對解決比賽思路的總結。
2019年下半年對我觸動很大的兩個知識分享是:
志峰現場講解的《Tricks in Data Mining Competitions 》
魚佬知識星球分享的《Kaggle資料競賽知識體系》
注:這兩個分享的原始資料,不要向我要,我沒有所有權。
碰巧最近也想將一些知識點整理下,本文將會參考上述兩個分享的結構來整理我個人的知識點。當然我整理的會比較雜,會按照討論點進行整理。
1 資料競賽的流程
這是老生常談的話題:資料分析主要目的是分析資料原有的分佈和內容;特徵工程目的是從資料中抽取出有效的特徵;模型訓練與驗證部分包括資料劃分的方法以及資料訓練的方法;模型融合部分會簡介模型融合的方法和實現方式。
我想表達的是:雖然資料探勘在流程上可以看成是瀑布式的,但各個流程相互影響:比如資料分析可以挖掘出資料的分佈規律,可以指導特徵工程;特徵的驗證又可以反饋資料分析的結果。所以在實際比賽過程中這個流程是反覆迴圈的,並不是一蹴而就的。
一個特徵不是拍腦袋想的,其最開始從EDA發現的,然後透過模型本地CV和線上PB得分進行驗證。所以我對比賽的baseline程式碼分享一向比較謹慎,一是baseline是最終的程式碼並不能包括失敗的嘗試;二是很多選手並不會跑baseline程式碼只是為了排名,並不會嘗試去理解程式碼的邏輯。在資料競賽流程上比較重要的一點是:你要知道你現在處於哪一個步驟,下一步應該做什麼,還有哪些TODO和改進的地方。
1.1 資料分析
在拿到資料之後,首先要做的就是要資料分析(Exploratory Data Analysis,EDA)。資料分析是數 據挖掘中重要的步驟,同時也在其他階段反覆進行。可以說資料分析是資料探勘中至關重要的一步,它給之後的步驟提供了改進的方向,也是直接可以理解資料的方式。
拿到資料之後,我們必須要明確以下幾件事情:
資料是如何產生的,資料又是如何儲存的;
資料是原始資料,還是經過人工處理(二次加工的);
資料由那些業務背景組成的,資料欄位又有什麼含義;
資料欄位是什麼型別的,每個欄位的分佈是怎樣的;
訓練集和測試集的資料分佈是否有差異;
在分析資料的過程中,還必須要弄清楚的以下資料相關的問題:
資料量是否充分,是否有外部資料可以進行補充;
資料本身是否有噪音,是否需要進行資料清洗和降維操作;
賽題的評價函式是什麼,和資料欄位有什麼關係;
資料欄位與賽題標籤的關係;
以上細節可能在部分賽題中非常有必要,但具體操作是否有效還是要具體進行嘗試。
1.2 賽題背景分析
在進行資料分析步驟前後,我們還需要對賽題的背景進行理解。賽題背景分析能夠幫助我們理解賽題的任務,以及賽題資料的收集和評價方法。當然有些賽題的業務邏輯比較簡單,容易理解;但有一些賽題的業務邏輯經過匿名處理,就會導致很難對賽題進行理解。
無論出題方給定了多少賽題介紹,參賽選手還是要自己從新理解一遍賽題,這樣可以加深賽題的印象。有很多時候,賽題的一些細節會直接影響到最後的精度,而這些關鍵的細節是需要人工發現的。
總的說來賽題背景分析包括以下細節:
賽題業務場景是什麼,資料是如何產生的,資料標籤如何得來的?
賽題任務是什麼,具體要解決的問題是如何定義的;
賽題任務是否有對應的學術任務?
在賽題背景分析步驟中最重要的是分析賽題是什麼任務,賽題任務是什麼問題,歷史是否有類似的賽題,學術上是否有對應的問題。如果歷史有類似的比賽/學術上對應的問題,那麼直接copy解決方案來就OK了。
1.3 資料清洗
資料清洗步驟主要是對資料的噪音進行有效剔除。資料噪音可能有多個來源,來源於資料本身,來源於資料儲存,或來源於資料轉換的過程中。因為噪音會影響特徵,也會影響最後的模型結果,因此資料清洗是非常有必要的。
資料清洗可以從以下幾個角度完成:
對於類別變數,可以統計比較少的取值;
對於數字變數,可以統計特徵的分佈異常值;
統計欄位的缺失比例;
1.4 特徵預處理
特徵預處理包括如下內容:
這一部分內容可以參考這個PPT:
https://www.slideshare.net/HJvanVeen/feature-engineering-72376750
1.5 特徵工程
特徵工程與EDA聯絡緊密,可以說是EDA具體的操作吧。因為資料分析本身就是“假設”-“分析”-“驗證”的過程,這個驗證的過程一般是指構建特徵並進行本地CV驗證。
可以從一下幾個角度構建新的特徵:
資料中每個欄位的含義、分佈、缺失情況;
資料中每個欄位的與賽題標籤的關係;
資料欄位兩兩之間,或者三者之間的關係;
特徵工程本質做的工作是,將資料欄位轉換成適合模型學習的形式,降低模型的學習難度。
2 結構化資料技巧
常規的特徵工程已經人人都會,不過我還是建議可以學習AutoML的一些操作,互補學習下。至少在結構化資料領域,常見的操作它都會。
在結構化資料中,針對不同的賽題任務有不同的magic feature。比如使用者違約風控類賽題需要考慮使用者資訊的交叉編碼,使用者流程等CTR型別賽題可以考慮target encoding,迴歸類賽題可以對對賽題目標進行標準化。如果賽題型別已知,則可以優先用此類方法進行求解。
如果賽題是匿名資料探勘,則需要煎餅果子啥都來一套了(任何操作都試試)。此外在匿名資料和多模態資料賽題中,可以嘗試下降噪自編碼器。
3 非結構化資料技巧
非結構化資料一定要找準baseline,一定要找準base model。
3.1 視覺型別任務
常見的視覺任務包括:
1. 影像分類(ImageClassification)
2. 影像檢索(Image)
3. 物體檢測(ObjectDetection)
4. 物體分割(ObjectSegmentation)
5. 人體關鍵點識別(PoseEstimation)
6. 字元識別
OCR(OpticalCharacterRecognition)
如果是簡單的分類任務,可以直接手寫CNN分類模型;如果是物體檢測、影像分割、人體關鍵點檢測、人臉識別等,優先找成熟的框架和模型。都9012年了,學深度學習不要只會分類。
在視覺型別賽題中,資料擴增非常重要,具體的資料擴增方法與具體的賽題相關。找好base model,找好資料擴增方法,基本上成功了一半。
3.2 文字型別任務
文字任務我不太熟,我只會BERT。文字任務設計到的技巧有:
TFIDF
詞向量
GPU
在這個bert滿天飛的時期,大家一定要保持對技術的耐心。不要只會bert,盲目的使用bert。bert雖然很好,但NLP的基礎不能跳過不學。
在煉丹過程中還有一些細節需要考慮,比如引數初始化、batch size、最佳化器、未登入詞的處理和網路梯度裁剪等,這些都是要自己根據任務進行總結的。
4 如何選擇一個合適的資料競賽?
最後我想聊聊如何選擇一個合適的賽題。現在資料科學競賽非常多,國內外大大小小的企業都可以組織各種型別的資料科學競賽。競賽多 了可選擇的機會也多了,但對於每個參賽選手來說我們的時間和精力是有限的,所以選擇一個合適的競賽參賽就至關重要了。這裡的合適的含義帶有一定的主觀色彩,我會從競賽內容和個人收穫兩個方面來闡述。
首先資料競賽的形式非常多:有的賽題要求選手開發應用,有的要求選手設計最佳化演算法,有的要求選手提出解決方案。選擇賽題一定要選擇自己擅長或者想學習的賽題,一定要選擇儘量靠譜公平的賽題(國內比賽偶爾會出現名次內定的情況)。此外還要根據具體的賽題日程和規則進行衡量,儘量選擇日程安排比較緊湊合理的賽題,儘量選擇換排行榜(切換不同測試集重新排名)的賽題。
此外賽題中也有不同的賽題型別,有結構化、語音、影像、影片和文字不同型別的。我期望大家是儘量能夠多參加不同型別的賽題,不要受到資料形式的限制,多接觸各種型別的演算法和知識。其實很多知識點都是類似的,在語音識別和語音分類中的特徵提取操作或許能夠用在某些結構化資料上,CNN 操作也經常用在語音分類上,序列資料通常可以用詞向量來編碼。
此外由於資料競賽本身具有一定的隨機性(資料噪音、演算法的隨機性和最佳化過程的隨機性),導致不同選手使用相同的資料和相同程式碼得到的結果在精度上都有差異。舉個例子在 XGBoost 演算法中有很多超引數可以調節,而不同的超引數可能會帶來一定的精度差異。我建議大家儘量參加不是由隨機性主導排名的比賽,儘量參加隨機性小一點的競賽。
最後還可以從賽題的獎勵和賽制進行選擇,我個人比較傾向於 TOP10 都有錢的比賽,同時國內比賽都有現場答辯的環節,所以比賽答辯城市也可以考慮下。