經驗 | 數據競賽Tricks集錦

  • 2019 年 10 月 7 日
  • 筆記

本文將對數據競賽的『技巧』進行全面的總結,同時還會分享下個人對比賽方法論的思考。前者比較客觀,總結了不同數據類型下涉及到的比賽技巧;後者稍微主觀,是我個人對解決比賽思路的總結。

2019年下半年對我觸動很大的兩個知識分享是:

  • 志峰現場講解的《Tricks in Data Mining Competitions 》
  • 魚佬知識星球分享的《Kaggle數據競賽知識體系》

註:這兩個分享的原始資料,不要向我要,我沒有所有權。

碰巧最近也想將一些知識點整理下,本文將會參考上述兩個分享的結構來整理我個人的知識點。當然我整理的會比較雜,會按照討論點進行整理。

1 數據競賽的流程

這是老生常談的話題:數據分析主要目的是分析數據原有的分佈和內容;特徵工程目的是從數據中抽取出有效的特徵;模型訓練與驗證部分包括數據劃分的方法以及數據訓練的方法;模型融合部分會簡介模型融合的方法和實現方式。

我想表達的是:雖然數據挖掘在流程上可以看成是瀑布式的,但各個流程相互影響:比如數據分析可以挖掘出數據的分佈規律,可以指導特徵工程;特徵的驗證又可以反饋數據分析的結果。所以在實際比賽過程中這個流程是反覆循環的,並不是一蹴而就的。

數據挖掘是一個循環的過程,並不是瀑布式的

一個特徵不是拍腦袋想的,其最開始從EDA發現的,然後通過模型本地CV和線上PB得分進行驗證。所以我對比賽的baseline代碼分享一向比較謹慎,一是baseline是最終的代碼並不能包括失敗的嘗試;二是很多選手並不會跑baseline代碼只是為了排名,並不會嘗試去理解代碼的邏輯。在數據競賽流程上比較重要的一點是:你要知道你現在處於哪一個步驟,下一步應該做什麼,還有哪些TODO和改進的地方。

1.1 數據分析

在拿到數據之後,首先要做的就是要數據分析(Exploratory Data Analysis,EDA)。數據分析是數 據挖掘中重要的步驟,同時也在其他階段反覆進行。可以說數據分析是數據挖掘中至關重要的一步,它給之後的步驟提供了改進的方向,也是直接可以理解數據的方式。

拿到數據之後,我們必須要明確以下幾件事情:

  1. 數據是如何產生的,數據又是如何存儲的;
  2. 數據是原始數據,還是經過人工處理(二次加工的);
  3. 數據由那些業務背景組成的,數據字段又有什麼含義;
  4. 數據字段是什麼類型的,每個字段的分佈是怎樣的;
  5. 訓練集和測試集的數據分佈是否有差異;

在分析數據的過程中,還必須要弄清楚的以下數據相關的問題:

  1. 數據量是否充分,是否有外部數據可以進行補充;
  2. 數據本身是否有噪音,是否需要進行數據清洗降維操作
  3. 賽題的評價函數是什麼,和數據字段有什麼關係;
  4. 數據字段與賽題標籤的關係;

以上細節可能在部分賽題中非常有必要,但具體操作是否有效還是要具體進行嘗試。

1.2 賽題背景分析

在進行數據分析步驟前後,我們還需要對賽題的背景進行理解。賽題背景分析能夠幫助我們理解賽題的任務,以及賽題數據的收集和評價方法。當然有些賽題的業務邏輯比較簡單,容易理解;但有一些賽題的業務邏輯經過匿名處理,就會導致很難對賽題進行理解。

無論出題方給定了多少賽題介紹,參賽選手還是要自己從新理解一遍賽題,這樣可以加深賽題的印象。有很多時候,賽題的一些細節會直接影響到最後的精度,而這些關鍵的細節是需要人工發現的。

總的說來賽題背景分析包括以下細節:

  1. 賽題業務場景是什麼,數據是如何產生的,數據標籤如何得來的?
  2. 賽題任務是什麼,具體要解決的問題是如何定義的;
  3. 賽題任務是否有對應的學術任務?

在賽題背景分析步驟中最重要的是分析賽題是什麼任務,賽題任務是什麼問題,歷史是否有類似的賽題,學術上是否有對應的問題。如果歷史有類似的比賽/學術上對應的問題,那麼直接copy解決方案來就OK了。

1.3 數據清洗

數據清洗步驟主要是對數據的噪音進行有效剔除。數據噪音可能有多個來源,來源於數據本身,來源於數據存儲,或來源於數據轉換的過程中。因為噪音會影響特徵,也會影響最後的模型結果,因此數據清洗是非常有必要的。

數據清洗可以從以下幾個角度完成:

  1. 對於類別變量,可以統計比較少的取值;
  2. 對於數字變量,可以統計特徵的分佈異常值;
  3. 統計字段的缺失比例;

1.4 特徵預處理

特徵預處理包括如下內容:

  1. 量綱歸一化:標準化、區間放縮
  2. 特徵編碼:
    1. 對於類別特徵來說,有如下處理方式:
      1. 自然數編碼(Label Encoding)
      2. 獨熱編碼(Onehot Encoding)
      3. 哈希編碼(Hash Encoding)
      4. 統計編碼(Count Encoding)
      5. 目標編碼(Target Encoding)
      6. 嵌入編碼(Embedding Encoding)
      7. 缺失值編碼(NaN Encoding)
      8. 多項式編碼(Polynomial Encoding)
      9. 布爾編碼(Bool Encoding)
    2. 對於數值特徵來說,有如下處理方式:
      1. 取整(Rounding)
      2. 分箱(Binning)
      3. 放縮(Scaling)
  3. 缺失值處理
    1. 用屬性所有取值的平均值代替
    2. 用屬性所有取值的中位數代替
    3. 用屬性所有出現次數最多的值代替
    4. 丟棄屬性缺失的樣本
    5. 讓模型處理缺失值

這一部分內容可以參考這個PPT:

https://www.slideshare.net/HJvanVeen/feature-engineering-72376750

1.5 特徵工程

特徵工程與EDA聯繫緊密,可以說是EDA具體的操作吧。因為數據分析本身就是「假設」-「分析」-「驗證」的過程,這個驗證的過程一般是指構建特徵並進行本地CV驗證。

可以從一下幾個角度構建新的特徵:

  1. 數據中每個字段的含義、分佈、缺失情況;
  2. 數據中每個字段的與賽題標籤的關係;
  3. 數據字段兩兩之間,或者三者之間的關係;

特徵工程本質做的工作是,將數據字段轉換成適合模型學習的形式,降低模型的學習難度。

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。文本任務設計到的技巧有:

  1. TFIDF
  2. 詞向量
  3. GPU

在這個bert滿天飛的時期,大家一定要保持對技術的耐心。不要只會bert,盲目的使用bert。bert雖然很好,但NLP的基礎不能跳過不學。

在煉丹過程中還有一些細節需要考慮,比如參數初始化、batch size、優化器、未登錄詞的處理和網絡梯度裁剪等,這些都是要自己根據任務進行總結的。

4 如何選擇一個合適的數據競賽?

最後我想聊聊如何選擇一個合適的賽題。現在數據科學競賽非常多,國內外大大小小的企業都可以組織各種類型的數據科學競賽。競賽多 了可選擇的機會也多了,但對於每個參賽選手來說我們的時間和精力是有限的,所以選擇一個合適的競賽參賽就至關重要了。這裡的合適的含義帶有一定的主觀色彩,我會從競賽內容和個人收穫兩個方面來闡述。

首先數據競賽的形式非常多:有的賽題要求選手開發應用,有的要求選手設計優化算法,有的要求選手提出解決方案。選擇賽題一定要選擇自己擅長或者想學習的賽題,一定要選擇盡量靠譜公平的賽題(國內比賽偶爾會出現名次內定的情況)。此外還要根據具體的賽題日程和規則進行衡量,盡量選擇日程安排比較緊湊合理的賽題,盡量選擇換排行榜(切換不同測試集重新排名)的賽題。

此外賽題中也有不同的賽題類型,有結構化、語音、圖像、視頻和文本不同類型的。我期望大家是盡量能夠多參加不同類型的賽題,不要受到數據形式的限制,多接觸各種類型的算法和知識。其實很多知識點都是類似的,在語音識別和語音分類中的特徵提取操作或許能夠用在某些結構化數據上,CNN 操作也經常用在語音分類上,序列數據通常可以用詞向量來編碼。

此外由於數據競賽本身具有一定的隨機性(數據噪音、算法的隨機性和優化過程的隨機性),導致不同選手使用相同的數據和相同代碼得到的結果在精度上都有差異。舉個例子在 XGBoost 算法中有很多超參數可以調節,而不同的超參數可能會帶來一定的精度差異。我建議大家盡量參加不是由隨機性主導排名的比賽,盡量參加隨機性小一點的競賽。

最後還可以從賽題的獎勵和賽制進行選擇,我個人比較傾向於 TOP10 都有錢的比賽,同時國內比賽都有現場答辯的環節,所以比賽答辯城市也可以考慮下。

The End