滴滴大數據算法大賽Di-Tech2016參賽總結

https://www.jianshu.com/p/4140be00d4e3python

  • 題目描述
  • 建模方法
  • 特徵工程
  • 個人幾回提高方法
  • 從其餘隊伍那裏學習到的提高方法
  • 總結和感想
  • 神經網絡方法的一點思考
  • 大數據量與分佈式計算的一點思考
  • 參加比賽和學習知識的對比
  • 最後的感覺
  • 趣事

寫在前面

我是一個以前PhD作分佈式計算、虛擬機調度,畢業以後年初才轉ML的傢伙,自恃有點學習開發能力和混跡ICPC競賽的底子,對數據還有些敏感度,有那麼幾個能夠跟着學習的人,斗膽在5月底開始利用業餘時間玩一玩。
最後的成績是預賽58名,隊名robust(預賽結束前一週還混跡在前15名以內的一個隊名),滴滴官方在剔除掉前50名的做弊參賽隊以後,出乎我意料的沒有「擴充」名額,僅41隊參加決賽(這和官網上掛出的「50隊探索科學邊界」的標語造成鮮明對(da)比(lian))。
就是說個人最終排名應該在49名(最差)。因此若是參加了決賽,再讓我學習一個月,結果可能還真何嘗可知。詳情請翻到本文最後「趣(tu)事(cao)」篇。
git

言歸正傳,如下介紹題目、方法(包括我知道的一些其餘隊伍的方法),而後說說個人總結和感想,最後還有一些趣(tu)事(cao)。github

由於我最後沒進決賽,因此個人總結和感想中會帶着不少和我本身方法的對比,以及會着重寫一寫我本身後來以爲值得學習和改進的東西。大牛們可能會以爲比較弱,能夠自行跳過。整體上感受應該仍是比較適合入門級選手。
本文部分圖是借用其餘隊伍的答辯PPT(會註明)。
文中會產生一些不專業不嚴格的名詞等等,還請你們批評指正。算法


更新:20160929,補充了一大批PPT報告的截屏圖片,豐富了一下內容。
更新:20170101,補充了一些關於神經網絡方法的想法。從滴滴比賽結束以後我一直在作機器視覺方面的工做,比較集中關注目標檢測以及目標檢測問題在移動設備上的實時性問題,歡迎感興趣的同窗討論交流。
可能還會時不時的更新我新學到的東西。網絡


題目

http://research.xiaojukeji.com/competition/detail.action?competitionId=DiTech2016數據結構

數據:架構

  1. 某市一段時間內(20+天,決賽時更換了數據連同預賽數據一塊兒有40+天的數據)的打車訂單日誌,包含乘客,司機,時間,價格,起始區域。司機爲空表明該單沒有被知足。數據量有上千萬條。
  • 各時段天氣信息、交通擁堵信息
  • 每一個區域POI信息,即該地區的基礎設施信息
  • test數據集中有被預測時間片的前30分鐘訂單、天氣、交通等信息
 
題目描述
 
test數據集中有被預測時間片的前30分鐘訂單、天氣、交通等信息

目標:
預測將來某時間(通常是將來十天)區域內打車供需差:即該時間片該區域中總的訂單數減去被知足的訂單數量。後文會稱其爲gap值。框架

猜想動機:
獲得供需關係,爲合理調度快車司機提供數據支撐。機器學習

評測指標:
預賽 MAPE(Mean Absolute Precise Error)
每一個時間片每一個地區的預測值和真實值差值的絕對值/真實值,最後求總的平均值
決賽 MAE(Mean Absolute Error)
每一個時間片每一個地區的預測值和真實值差值的絕對值,最後求總的平均值
全部時間片全部地區,取平均時權重相等。分佈式

 
MAPE and MAE

基本解決方法:
預測問題,迴歸方法

簡單評價:

  1. 我以爲地理信息給的有點少。
  • 或許涉及商業祕密。區域間的鄰接關係我想仍是有些影響。而且考慮交通擁堵信息時,只有起始區域,沒有途徑區域?
  • 區域太大啦,估計有幾千米甚至十幾千米一個,一個區域內都會常常出現上百塊錢的價格。或者說重要區域和非重要區域同樣大。即使是預測出來了,指派度是否太過於粗糙?重要區域若是能夠分割成更小的區域最好了。
  1. 評價指標,尤爲是預賽的,匪夷所思。
  • 預賽的標準是MAPE,在真實值較小的時候預測值變更的影響要遠大於真實值較大時候。好比,真實值是10的時候,若是你預測爲50,錯了40,mape貢獻4,可是若是真實值是100的時候,你預測爲140,一樣是錯了40,可是mape只貢獻0.4。
    這個爲何說匪夷所思呢,由於作比賽時,你不免會去想一些用途方面的問題。若是是這樣,那滴滴應該更加在乎小gap時的預測?這合理嗎?應該是很大的gap預測出來調度大批量的車過去才make sense啊。
  • 決賽時,明顯官方注意到了這個問題,特徵爲MEA,由於有絕對值,二階不可導,卻是考驗了一下各位選手,在使用XGBoost的時候該如何處理這個問題。

建模方法

須要設計的無外乎樣本,標籤,以及驗證集。
樣本構造的「標準方法」,即被訓練時間片的前30分鐘(或者20分鐘)的特徵做爲該時間片的樣本,而這個樣本對應的標籤即接下來的10分鐘的gap值。
其表明的物理含義是根據趨勢進行預測,而不是根據歷史進行預測。

後文都將對此方法稱爲30:10,或者20:10,即表明30分鐘樣本數據對應10分鐘標籤數據。

形成這個方法成爲「標準方法」的根本緣由是由於,只有幾十天的數據,若是訓練樣本中須要用到跨天甚至垮周的數據,勢必形成訓練樣本數量減小,而且沒有直接證據能夠證實用了跨天或者跨週數據會帶來很是好的提高。因此幾乎全部取得好成績的隊伍都是使用的該方案。
換言之,從這個數據集的角度出發,咱們能夠下這樣的結論:影響供需的主要因素就是這個時間片前面的20到30分鐘的種種特徵。
因此最後若是天天有144個時間片,每一個時間片都有前20-30分鐘的樣本,在不擴充樣本的狀況下每一個區域擁有144*21(+24)=3024(6480)個樣本,括號表明決賽。

 
在數據量很大,例若有20週數據時,右方法的樣本數量就不會比左方法差太多了,這時其效果我以爲可能會比左方法好。可是在比賽數據有限的前提下,右方法的樣本數量太少。

無論是30:10仍是20:10,這裏面能作的文章還有不少。由於訂單信息是精確到秒的,但交通和天氣信息大致是按10分鐘一個時間片來劃分的,因此直觀的,就是使用10,10,10:10(就是三個10分鐘的綜合特徵對應10分鐘的標籤)這樣的樣本。之因此說他直觀,是由於我就是用的這個方法,至關的naive,當時使用的樣本數量大概爲21w個。
其實,能夠作的文章有不少:

  • 相對複雜的特徵組合:30,25,20,15,10,5:10,20,10,5,3,2,1:10等等。固然,這裏的30是包含後邊的25的。還有,5,5,5,5,5,5:10,2,2,2,...,2:10等等,這個能夠隨意組合。
 
30,20,15,10,5,2:10的組合方式
  • 滑動窗口:打破10分鐘時間片的起始時間,再也不拘泥於測試集的整10分鐘開始。好比能夠是11點7分-27分樣本對應27-37分的gap值。滑窗的間隔能夠本身選,1分鐘,5分鐘,這都有人用。可是畢竟滑窗數據存在overlap,使得滑窗格子間存在必定的相關性,同時天氣和交通數據須要擬合,都致使滑窗太小效果並不必定好。這個須要謹慎對待。
 
5分鐘步長的滑窗
  • 若是使用(<20):10的方案,test集的前三十分鐘的數據,配合滑窗,還能作出幾個訓練樣本。不過這個的意義不是特別大。

驗證集構造方法常見的有兩種

  • 使用訓練集最後一週的數據
 
若是預測23號就用16號作驗證。這樣樣本量減小1天(或者更少)。結果是驗證效果有偏。另外,還能夠用16號、9號、2號作三次驗證取平均值
  • 使用測試集的最後十分鐘數據
 
樣本量不變。樣本抽取特徵的空間變小了,不少人以爲捨不得,可是事實上半小時前的特徵對GAP影響並不大。驗證效果基本無偏。

事實證實第二種略優一點。雖然使用第二種的代價是訓練樣本時間從30:10變爲20:10,可是事實證實,縮減掉的前30分鐘數據對結果影響並不大;相比之下使用訓練集最後一週數據則由於不一樣天反應出的不一樣特色嚴重影響驗證集效果,形成本地驗證效果沒法體如今上傳結果上。
個人方法在驗證集構造上失誤了,由於我一直用的第一種方法,略不一樣的是我選的還不徹底是最後一週的數據,而是一個精心設計的驗證集,簡單說是三個不一樣訓練-驗證集交叉驗證結果(這麼作的緣由是由於當時發現1月20號的數據極端詭異,缺數據,數據分佈和6/13號兩天不一樣),依舊抵不過使用第二種構造方法。形成我預賽最後幾天由於本地驗證集合線上測試集嚴重不匹配,又缺少經驗,各類抓狂,卻又機關用盡。


特徵工程

這裏簡單描述一下常規的特徵工程,複雜的、具備決定意義的特徵工程放在下面提高方法中概括總結時提出。
特徵工程是和樣本構造緊密相關的。
個人特徵最後只有140維左右,加上POI的50維,最多的時候也只有190維左右。而且前140維大部分是前30分鐘3個時間片的重複特徵。基本的特徵大概是50維左右。

  • 交通訊息,直接對應到樣本的每一個10分鐘時間片中。
  • 天氣信息,類型按one hot feature,01化以後做爲幾維特徵,溫度和PM2.5直接對應到時間片中。
  • 訂單信息,個人特徵相對較少,主要集中在前3個時間片的需求總量、供給總量、司機個數(接單/空單)、乘客個數(接單/空單)、目的地個數(接單/空單)、價格總和(接單/空單),以及該區域做爲目標區域對應的一些個數信息等等。這些特徵簡單說都是低階特徵。
    這裏的經驗教訓是這樣的,經過查資料和跟別人學習探討,我當時的確是已經已經知道了要使用高階特徵的。可是因爲已經體現出的成績相對還好,同時還有不少能夠優化的地方,增長高階人工特徵就被拖後了不少,這是經驗問題。而且,單個特徵的增長,每每沒有什麼太多助益,但上百維特徵組合起來對結果的助益才很大,當時並無意識到,這就使得繼續增長特徵的動力變得比較小。
    相對擴展的特徵以及我後來學到的特徵會在後邊幾節詳細介紹。

個人幾回提高方法

  1. 目標函數映射
    由於預賽的評價指標是MAPE,而我用的XGBoost的目標函數是線性的(小聲說,其實一開始我還不知道要去修改目標函數,後來知道了也不知道怎麼自定義目標函數。不過還好,如今都學會了),因此想了一種映射方法,即把標籤取log,而後預測完以後把結果取power。
    這個改進很是有效果。其物理含義是從新拉伸了目標值域的數據分佈,增長了小數據預測時的敏感程度,放鬆了大預測值的精度。我前面有講,由於MAPE自己對小數據敏感,這個改進那是至關的make sense。
    直觀上,決賽修改爲MAE以後貌似是不須要再修改映射關係了,可是聽說有的隊在決賽時候一樣經過這個映射完成了提高。我猜想是由於gap值自己成指數分佈,對小值預測敏感一些就合理了。
  • 樣本集構造方法改造
    一開始我使用的樣本不是前文所謂的「標準方法」,而是使用了跨天垮周的數據,即一開始我認爲,可能上一個星期同一天,也就是七天前的相同時間片,會對被預測時間片產生影響。由於樣本數據量太少,最終放棄。放棄以後效果飆升。

  • 對地理區域進行聚類後分開模型訓練
    其實這應該是一個有效的方法,若是能對區域進行有效分區的話。由於不一樣區域用戶行爲、基礎設施、擁堵狀況的差別巨大。若是能找到有效的聚類方法,是一個不錯的提高途徑。例如,最終第三名隊伍blitz給出了一張很是形象描述區域時間-訂單數量pattern的圖片,並大膽猜想了這幾個區域的屬性。


     
    blitz隊提供的不一樣區域訂單狀況的數據可視化圖

    我預賽set1的時候,我使用了區域聚類的方法,可是具體的聚類方法應該是碰巧了,而這個方法在預賽更換數據set2以後失效了。
    另外,由於區域太大,這形成區域聚類時,擁有共同特徵的區域就會比較少,若是區域還能夠細分,效果會更好。

  • 我所使用的具體的聚類方法是:
    簡而言之,對特定的特徵集,根據XGBoost輸出的importance score,進行KMeans聚類。即特定特徵集下表現類似的區域放在一塊兒再從新訓練。
    存在的問題是,由於特徵維度比較高,聚類時,每一維特徵的權重卻被設置爲相同,致使比較強的特徵對聚類結果影響沒有被突出。

  • 過後考慮:分區域聚類是個正確的方向,前提分開以後的區域,樣本量要足夠大。而對區域進行聚類的指標也是一項獨立的特徵工程,好比區域的拓撲關係,區域流向關係,區域的POI信息,區域在不一樣時間的活躍程度。

  • 特徵工程

  • 價格因素。由於原始數據提供的價格信息中加入了滴滴策略,例如優惠劵、用戶加價等,而最後僅保留了一個最終的落地價格。因此道理上不能經過簡單的價格來做爲特徵,不過由於我沒有怎麼使用高階特徵,我直接使用的價格特徵在XGBoost的importance中比重還比較高。
    這裏討論一下價格因素的可能使用方法:1)能夠分析區域間的相對距離關係;2)用來粗略估算訂單完成時間,從而得到司機的空單時間的統計信息;3)用戶價格偏好。

  • 後來去掉POI信息在我這裏也是一次提高。
    POI信息真的不知道該怎麼搞,或許能夠用在對地理區域進行聚類上面。

  • XGBoost的importance分析。
    發現importance的高低只是表明這個一維特徵在學習過程當中對XGBoost結果的影響程度,可是這種影響有多是正的,也多是負的。因此會交叉驗證importance比較高的特徵,若是發現是毒特徵,就直接去除。

  • 比較遺憾,我沒有想到時間片結束時空單量這個重要的影響因素。我如今以爲這多是一個直接影響成敗的特徵。回看本身的方法,其實個人特徵有一維,表明剛剛過去的10分鐘中的空單量。這個量太過於簡單了,由於我沒有區分這10分鐘結束時的已經被知足和仍未被知足這二者。
    以blitz隊的數據分析來講,blitz隊經過數據分析發現,通常空單以後兩分鐘會從新發單,若是尚未被響應,再次發單的時間會在五分鐘。這與滴滴打車APP的策略相關。滴滴叫車以後2分鐘才能夠再次發單而再次發單的單優先級高所以,(t:t-2)的空單數,是一個和GAP高度相關的參數。
    因此,用前10分鐘的空單數做爲一個特徵,在這樣的數據分析下就顯得實在是太過於粗糙了。


     
    blitz隊提供的空單再知足數據可視化圖
  • 數據後處理
    數據後處理是創建在對本身方法獲得結果的分析前提下的。
    例如,分析數據時我發現,週一到週五的第94號時間片,即工做日的下午15點半,預測值一直偏大。如圖表示個人方法對1月11號星期一(左圖)和1月13號星期三(右圖)的預測結果。橫軸表示時間片(4表明第5個即94號時間片),縱軸表明區域。紅色表明我預測的結果比真實值大,藍色表明個人預測小。圓大小表明相比真實值的比例,黑色表明真實值大小。因此94號時間片就顯得很是奇葩。


     
     

    最後我使用的方法是人工對週一至週五的94號時間片的預測值除以一個經驗值。該經驗值是統計結果,最後我取了4。
    而且這裏我還想討論一下這種後處理的方法。總以爲是一種沒有道理,又比較low的方法,
    我在這個時間片上花了很長時間,這就是經驗問題了,其實應該把有限的時間用來增強模型和特徵,而不是一個單一的畸變數據上。

  • 還存在代碼寫錯了,可是結果又提高的狀況。這個由於以爲是bug,沒記筆記,忘了是什麼了。其實搞很差還有的挖。

其餘工做

  1. 驗證集預測結果分析。也就是前文的5. 數據後處理,還有一些其餘的繁瑣的分析,主要集中在和真實結果的比對上,我並無統計出什麼太多規律出來。
  • 極端天氣影響。由於事先分析了天氣氣溫對應的城市信息,知道比賽選擇的城市是杭州,因此對杭州1月份的極端天氣進行了瞭解,不過比較不幸的是,極端天氣正好都發生在test集的幾天。因此並無什麼太大的幫助。
  • 預測需求-預測知足率的雙模型,可是這個是很快就被拋棄的一個改進,由於會形成偏差累積,這個比較基礎了,沒啥好說的。

這個領域,不經意的一個小改動能夠大幅提高效果,而費盡心思的一個很大的改動可能並不能起到什麼效果,甚至是負效果。可是你不嘗試不知道,甚至有可能有理論或者感受能夠支持一個改動,可是有可能實現完仍是會沒有用或者負做用。尤爲是在特徵工程中,只提取幾個簡單特徵可能會帶來必定的提高,當繼續增長特徵時,效果可能愈來愈不明顯。可是這時,可能最有效的提高就是由一點又一點的特徵積累獲得的,尤爲是愈來愈難以想到的,隱含的愈來愈深的,那些高階特徵。
是的,這是一個磨鍊耐心的過程,一個「修行」的過程。


從其餘隊伍那裏學習到的幾個提高方法

如下的方法都不是我本身實踐的,結合經過各類渠道得到的信息,加上本身的理解,先把乾貨拋出來,但願能夠和你們共同討論。

  1. 特徵統計屬性
    從最終比賽成績來看,僅使用XGBoost+特徵工程確實能夠作到前幾名。可是這樣作作的最好的隊伍,在特徵中融合了大量的統計特徵,這與他們擁有堅實的經濟學、統計學理論背景是有分不開的關係的。
  • 高階特徵的創建技巧,好比用最小二乘擬合統計信息。
    高階特徵能夠被認爲是一種超越單一視角的特徵。
    對特徵的詳細分類,以及對每類特徵物理含義的深刻理解。會有助於尋找更多的特徵。
  • 對於賽題,常見的分類方法通常是實時特徵、歷史特徵、趨勢特徵、臨近特徵,等等?這些名詞是借用的其餘隊的說法,對特徵的一種粗略的分類吧。另外我以爲主要仍是統計信息,或者是統計信息的統計信息,或者是多個不一樣維度統計信息的交叉統計信息。
  • 實時特徵好理解,就是某個時刻當下的特徵,特徵值能夠直接做爲一維特徵使用。我的認爲,實時特徵即簡單特徵,而其餘三種特徵則是高階特徵。
  • 歷史特徵,是指某個時間以前的某個信息維度上的信息統計量。因爲這個問題的樣本創建方式,使得歷史特徵也只能在預測時間以前30分鐘或者20分鐘中進行提取,這使得歷史特徵這個詞變得不是很名副其實。
  • 趨勢特徵,是指根據多個歷史特徵得到的變化速率信息。例如,咱們一般會直接使用level=x (x=1->4)的擁堵路段的數量做爲特徵,若是是用了本時間段level=x和上一個時間段level=x數量差的話,這個數量差就是一個趨勢特徵。
  • 臨近特徵,我以爲多是趨勢特徵的一個臨近特例。這兒我理解的不太到位。
  • 樣本擴充
    經過滑動窗口得到更多的信息量。這裏我實際上是有一些疑問的,就是10分鐘的區間,用1分鐘或者5分鐘的滑動窗口去滑動,存在多大的線性相關性的問題。這取決於統計性特徵的特色,若是統計性特徵統計的是這10分鐘的總和或者是變化曲線,或許5分鐘的滑動窗口的效果會比1分鐘的好,由於1分鐘可能重複了太多的冗餘信息。
  • 詳盡的數據分析和可視化分析
    這個就不展開講了,總之很重要,是幫助作出下一步決策的重要輔助手段。
  • 必要的數據清洗
    須要花費很大的精力去找出「毒樣本」,或許和意外狀況有關係,或許和特殊狀況有關係,或許和社會新聞事件有關係。
    好比前文所言的極端天氣。再好比當時我猜想是否與杭州當地大學、大專院校放寒假時間有關係?那麼,放寒假到底是特殊狀況,仍是深層規律並不差異的普通狀況,或者仍是能夠挖掘出一個新的特徵維度?我以爲須要把這部分數據單獨進行處理,隔離實驗,並進行對比實驗,分析和回答以上的問題。比賽時間有限,無法對這些問題逐個驗證,而且我以爲我尚未徹底掌握處理這些數據的經驗吧。
  • 目標函數的重要性,這個和下面一個問題合在一塊兒說。
  • 對XGBoost或者其餘樹模型、以及神經網絡等分類迴歸器自己深刻理解並修改模型方法
    XGBoost是一個被普遍接受的工具,惟一的美中不足是目標函數必須二階可導,若是目標函數二階不可導,就必須使用近似函數,這勢必影響最後的精度。
    那麼解決方法就集中在,改進XGBoost,或者換成其餘迴歸器。
    其實,XGBoost並非萬能的,改進開發新的決策樹模型,找到一個最適應問題自己的模型,確實是王道。
    其餘迴歸器的重要candidate,就必須是神經網絡了。

我本身的總結和感想

  1. 用來實現迴歸的方法主要仍是:決策樹和神經網絡兩大類。
  • 決策樹大多使用XGBoost,而神經網絡的方法則比較豐富多彩。神經網絡又分爲人工特徵+神經網絡作迴歸和神經網絡自動提取特徵兩類。

  • 決策樹方法自己的結構、學習方法、性能特色,對結果的影響仍是比較大的,我我的以爲取得第一名的inferrr的核心提高能力在其自身提出並開發的決策樹模型上面。若是能夠深刻了解和理解XGBoost自己,再針對問題做出相應的調整,是能夠有效提升預測方法的能力。(10月18日更新:inferrr團隊成員的開源GBDT/GBRT/GBM/MART框架,可是我並不肯定這就是用在比賽中的方法哦。 https://github.com/Microsoft/LightGBM

  • 能夠用來解決的方法有不少,MLP、one-shot memory network、dnn、feedforward neural network,等等。

  • 從時間消耗和能源消耗的角度來講,而且限定在滴滴比賽的量級下,XGBoost比神經網絡擁有很是大的優點。

  • 兩個東西都用,而後模型融合實際上是個不錯的選擇。

  • 人工特徵仍是影響方法效果的基石 @:
    (@標的幾點在前面介紹方法時進行了展開說明)

  • 數據可視化對人工特徵的提取貢獻很大。

  • 關鍵特徵和問題緊密結合的。好比時間片中的最後一個空單數量,是極容易影響結果的gap值的。這個特徵幾乎全部取得好成績的隊伍都用到了。

  • 高階特徵提取。而高階特徵中的統計特徵提取,是很重要的一類特徵。統計量的選取也頗有學問。

  • one-hot特徵的使用。

  • 目標函數的重要性 @:

  • 通常的,目標函數直接做爲分類迴歸器的目標函數,構造end-to-end的訓練方法。XGBoost由於引入了二階導數,所以須要損失函數必須二階可導,通常強行使用XGBoost時須要使用近似函數。

  • 而若是本身設計迴歸器,就能夠作到end-to-end。

  • 根據label的數據分佈修正目標函數,例如比賽中,能夠對label取log(預測結果取power)的方法,修正目標函數。這個修正方法簡單說對MAPE有重大修正做用,同時對MAE也有必定修正做用。

  • 樣本構造、驗證集構造的方法和技巧 @:

  • 利用滑動窗口增長樣本

  • 選擇不一樣的驗證集方案和交叉驗證方法

  • Domain Knowledge的重要性 @:

  • 專業領域的知識,對構建更加貼合實際應用的特徵有很是大的幫助。

  • 不一樣隊的方法差別真的很是的大,除去大的樣本構造、驗證集構造等大的方面,方法細節上、特徵工程、神經網絡的網絡結構都各自不一樣。同時,各自認爲提升成績的關鍵因素也不同,對各自方法優點的理解也不盡相同。

  • 排名靠前的隊伍在比賽結果上其實仍是差不太多,而大多數又難以突破最終的一個極限。

  • 不知道決定這個極限的緣由是什麼,是數據的信息量,仍是方法的限制?

  • 而以上前幾點所提到的方法,對前面幾名的結果的貢獻,每每是方方面面的,多是MAPE的1e-3,也可能只是MAE的1e-1。甚至,有些改進方法在某些大方法下有多是相反的貢獻。

  • 參賽團隊的組建和分工,以及團隊頭腦風暴的重要性。

  • 團隊協做這個事情,此次沒什麼發言權。原本拉了幾個師弟和同事一塊兒,結果由於各類緣由,後邊就是我一我的再弄了。一個很明顯的感受就是由於是一邊作一邊學,也沒有經驗,就無法去分配給別人任務。但這顯然是個短板。

  • 人工特徵提取是一件很容易掉到牛角尖裏面去出不來的過程,可能過後看,就是一個很簡單的東西啊,爲何我當時沒想到呢?而解決這個問題的方法就是頭腦風暴,對應回機器學習的方法,至關於增長一些隨機梯度,讓人能夠從局部極值中震盪出來,再回頭去看看有沒有全局極值。

  • 方法框架的靈活性。

  • 決定着新想法付諸實施的速度。由於有的時候你的想法可能對於你以前的框架是顛覆性的。有多是樣本集驗證集構造框架,有多是數據結構框架,也有可能模型框架。若是每次都要改好久或者很麻煩,有可能會下降你修改方法的積極性,極可能就錯過了一次重要的優化。

  • 在比賽有限時間內,或者說有限的時間內有效的解決一個實際問題時,經驗是很重要的,對作出正確決策是頗有幫助的。

  • 比賽最終的前幾名都是有着各種大數據比賽豐富經驗的,好比在阿里天池、kaggle等比賽都取得了很好的成績。

  • 在線的大數據比賽通常時間週期比較長,如何協調有限的業餘時間,在決策時間作出相對較優的決策,都須要經驗來斷定當前面臨的主要問題到底是什麼。否則只能選擇相信本身的直覺,慶幸的是我自認爲直覺還能夠,僅僅能夠而已。這或許就是大牛們所說的對數據的「嗅覺」吧。

  • 代碼實現快也是一項優點。由於又有工做時不時的還要出差,因此有了想法快速實現而且保證天天都有新鮮東西並能在線上測試集中跑一把,代碼實現上就毫不能有所耽誤。

  • 我本身值得反省的是,由於python的很多很優良的數據處理庫,好比pandas等等不熟,初始代碼時沒有使用,致使後邊迭代成本愈來愈高,有的改動須要對數據架構進行重構時,確實明顯體會到一直由於改起來麻煩改完收益不明確的無力感和惰性。


神經網絡方法的一點思考

個人感受是大部分人使用神經網絡仍是做爲一個替代決策樹的迴歸器,真正使用神經網絡來提取特徵的隊伍少之又少,能掌握這項技術的人也很少。
另外個人感覺是,神經網絡的效果仍是很不錯的,可是在這個問題自己看,其單位功耗創造的價值則遠小於決策樹模型。
這個問題同時存在於非圖像語音天然語言處理等數據挖掘領域,即使是在這幾個神經網絡大放異彩的領域,傳統方法在移動計算等方向上,由於計算成本的要求,依舊有着巨大的生命力。
固然,這不表明神經網絡不重要,或許某一天,隨着硬件成本的降低,算法能力的提高,這些問題就再也不是問題了。

----170102更新分割線----
滴滴比賽結束也有小半年時間了,這段時間作了很多神經網絡方面的工做。簡單總結一下,以CNN爲首的這一波深度學習大潮,我認爲核心帶來的應該是簡單特徵的非線性組合關係對有用特徵的篩選能力上。
若是咱們處理的是圖像,那麼像素值就是簡單特徵,那麼多層卷積層以後獲得的特徵,就是簡單特徵的非線性組合。簡單特徵相對比提取後的特徵,雖然特徵表達能力不行,可是保留了最多的信息量。同時,神經網絡對簡單特徵的非線性組合關係是多層的,非線性疊加非線性,從使反向傳播機制得到的特徵,其所能表達的事物和描述的能力,都是人工特徵所沒法比擬的。因爲無用特徵每每在訓練過程當中由於權重調整已經被「過濾」掉了,所以,由非線性組合出來的高層/深層特徵,也使得後續分類/迴歸器再整個模型訓練過程當中變得較傳統方法沒有那麼重了。
回到滴滴比賽,以及相似的有已經較爲抽象的特徵(訂單信息、時間信息、天氣信息、交通訊息等等)的問題上,神經網絡依舊能夠發揮其對簡單特徵的非線性組合能力。不一樣的是,第一,這類問題的簡單特徵自己已經再也不簡單,換言之,這類特徵是已經被組合過一次了的,由於他們可能自己就已是統計性的信息,丟失一些只有簡單特徵纔有的信息,類比圖像裏面像素級的信息;第二,在這些特徵中組合出來的更加複雜的高維特徵,由於維度較高,其可解釋性較差,很難加入領域相關的先驗知識進去,而組合過程的盲目性較大,致使真正有用的高維特徵難以被篩選出來。反而是傳統人工特徵方法在比賽這樣的數據量級下面並不輸給神經網絡。
另外,因爲本屆滴滴比賽裏面人爲刻意略掉了地理位置信息,至關於扔掉了一塊很大的空間信息,而卷積神經網絡自己是強在處理空間數據的,這也是傳統特徵工程能夠不輸於神經網絡的一個重要緣由。

----170102更新end----

利用深度學習來進行時空數據挖掘,這個領域也是由來已久。若是咱們把一個城市平面當成是一張圖,而把時間序列看作是多張圖組成的一個視頻,那麼就能夠相應對交通擁堵、流量預測、訂單預測等問題進行建模了。
這裏推薦兩篇文章:

講堂|鄭宇:多源數據融合與時空數據挖掘(上)
講堂|鄭宇:多源數據融合與時空數據挖掘(下)

----170426更新end----


大數據量與分佈式計算的一點思考

由於比賽只提供了預賽21天,決賽24天,單個城市(某一線城市)一共45天。相比滴滴公司的平常數據量,由於沒關注商務方面,因此簡單猜想全國大小城市應該都覆蓋過去了,應該有至關於至少一百個一線城市的量(不負責的猜想),每一年產生365天的數據。
相比比賽的數據,一年的數據就相差了至少3個數量級,同時仍是增量的,流式的,這很可怕。
同時,這個比賽的供需問題,僅僅是滴滴平常面臨的問題中,可能仍是相對比較不緊迫的問題,之一。由於不一樣問題對數據的需求不必定相同,用到所有數據的方法不必定比例特別高,可是徹底能夠猜想,這麼大的數據量,同時去處理這麼多的問題,真的是世界級的難題。固然我這麼猜想的主要緣由主要仍是由於坊間分佈式架構大牛的跳槽。


參加比賽和學習知識的對比

參加比賽時間緊,有壓迫性,好玩有趣,所以有動力去搞。可是每每目標單一,一切須要掌握的東西都圍繞着比賽目標出發,在整個知識體系中,是一條線而不是網絡和體系。
這種方法是從實際問題出發的,會去找到問題自己的特性,針對其給出方法和優化,重點是把掌握的知識和實際問題相結合。
這種方式進行學習,適合初學入門的人快速切入,可是隨着比賽次數的增長,你每次能從比賽中學到的東西會相對愈來愈少。即使運氣好,你也幾乎不可能徹底經過比賽來完善本身的知識體系。

而平常學習知識則正好相反,時間寬裕,可是每每須要本身編織知識網絡,由於常常要深刻一些看起來沒有用的小知識點,必然枯燥無味,容易懈怠,會混沌會茫然會停滯不前。
這種方法的研究手段也不同,每每從一篇paper或者是已有模型/算法,經過理論或者推導,找到其不足的地方,再去優化。處理的每每是一個泛化的問題,從解決一個具體的問題昇華到了解決一類問題上面去。
這種方式,學到的知識相對系統,完整。往後隨時隨地用起來的時候引經據典,信手拈來,得心應手,討論起來的時候拍案驚奇,舌戰羣儒,滴水不漏。不過也容易走過頭變成紙上談兵。

因此,二者相結合也是極好的。經過比賽發現問題,經過問題做爲切入點展開學習,最後再經過比賽查漏補缺。
所謂學而不思則罔思而不學則殆是也。(這裏學表明學習知識,思表明動手實踐獲得第一手資料)


最後的感覺

從一點不會,到一步步分析問題,分析數據特色,思考解法,設計模型,學習算法,編寫代碼,加進新想法,分析結果,嘗試不一樣的方法,提交,等待結果時的緊張和興奮,與其餘人交流時的傾聽與學習,看到了一次又一次突破性方法帶來的成績提高,也曾爲了能突破11名進入第一頁苦苦拼搏。

個人比賽其實在6月20號就結束了,細看看,從5月26號下載數據開始的一個月很充實,吃飯在想,睡覺在想,出差在想,崴了腳還在想。時間過得很快,有一種沉浸其中的感受,我想這是我好久以來沒有找到的一種感受了,一種當年參加ACM競賽時的投入感,第一次實際把學到的機器學習的東西付諸實踐,也算是去嘗試解決一個實際的問題。好久沒有實際解決真實問題了,確實很興奮。


趣事

我是一個以前PhD作分佈式計算、虛擬機調度年初才轉ML的傢伙,自恃有點學習和開發能力,有點對數據的敏感度,有幾個能夠跟着學習的人,斗膽在5月底下載了滴滴比賽的數據,由於一開始先拿到了師弟天池比賽預測的方法和一些基礎代碼,因此決定利用業餘時間好好學習一下這個領域。
一開始並無太多想法,可是隨着幾回比較大的優化,好比重建樣本集和映射目標函數兩個大的優化,大概在6月3日左右就爬到了33名,當時着實被驚到了,真的是沒有想到。其實我以爲真實緣由必須是由於個人隊名起的好,由於我用了早年參加ACM WF時的隊名robust,若是實在不是那就必定是由於那天是我家崽崽一週歲生日的緣由。
反正,總之,這個時候本身的學習熱情已經所有被激發了起來。6月8號報名截止時一口氣衝到11名。12號test數據切換完以後,一度掉到30+名,可是簡單調整以後14號又從新回到13名,這時候以爲進複賽應該是沒問題了。
由於畢竟能夠多一件衣服,想到本身最近正好沒錢買T恤衫了,想一想仍是很是很是有價值的。多是被免費衣服搞興奮了,結果15號去南京農大踢球的時候被人一個飛腿鏟崴了腳,而後在南京某酒店牀上躺了十天,最後居然是坐輪椅在機場展轉回到長沙家裏。
短暫恢復兩天以後,在酒店牀上完成了最後幾天的比賽。可是這時候出現了比較嚴重的問題,應該是驗證集選的很差,致使本地優化徹底體現不到線上去,成績一直沒有超越過14號的成績,須要你們腦補一下的曲線是這樣的:14號13名,15號16名,16號22名,17號33名,18號58名。

 
個人成績回顧

若是非要說這個曲線是正常的,殺進去的人都在最後時刻實力爆發,做爲從中學就開始參加信息學競賽、ACM退役以後又當了N年教練、組織過不知道多少比賽的我,是斷然不會相信的。更況且此次決賽僅取前50名,而剛恰好又是我本身跨越了這個門檻。可是當時天真的我居然相信必定會有個好的答覆,衣服啊。
按照組織比賽的經驗,網賽結束前通常都會出現詭異現象,實際上是人性使然,也無可厚非。網賽做弊一是代碼拷貝(或者小號),二是思路分享。第一種好檢查,比對代碼便可;第二種沒辦法。可是通常網賽後邊都是現場賽,通常是適當按照相對公平的標準,在現場賽能容忍的前提下擴大必定的範圍,你先進來,可是現場賽真刀真槍不會再任你胡做非爲。
固然,確定不能拿ACM競賽來簡單對比這種實際的比賽,畢竟大公司比賽的題目更加實際、比賽時間更長、賽事保障更加複雜。每一個隊的方法都不同,單單代碼復現這件事就意味着須要有大量人工投入進來,對於一個迅猛發展起來的大公司,嗯,也許大概的確可能仍是有點緊張吧。
只對比幾個能對比的吧,小號,代碼拷貝,模型分享,思路分享。固然官方也意識到了這些問題,前一百名都被要求提交文檔,沒提交的確定就是前三種,而第四種同樣的沒辦法。
固然,我就寄但願於他們寧肯放過一千也不肯錯殺一個,畢竟辦比賽的真實目的是爲了擴大公司的影響力和招人,迫切須要解決的問題也必定不會經過比賽來解決。可是,多放進些人來,是必定能夠擴大願者上鉤的範圍的。哎,我替它考慮這幹什麼,還不是爲了那件衣服。
萬萬沒想到
滴滴官方最後的作法是這樣的:預賽的實際排名前50名卡死,再去除小號,最後只剩41名。

 
官方決賽期間的主頁上赫然標出:「50支隊探索科學邊界」,看來是把各類做弊殭屍算進去了,寧肯錯殺一千,也不肯多放進一個

頓時有一種說不出話的感受。
不難受是不可能的。
用大腳趾頭想都能想到,遞補9個,不管我前面還有沒有小號,我均可以進決賽啊。
然而
沒有遞補
沒有遞補,就沒有衣服了啊。。
不過,
組委會後來終於在個人追問下告訴我說,衣服仍是照送的,提交了文檔的都有。哎,就是嘛,就當是給打車乘客的補貼嘛,小場面小場面。一顆懸着的心終於落地了,目的達成。

截止發稿,已經收到滴滴寄來的參賽記念衫。

感謝wyz、gxz、lmn、xtt、qz等隊友。
感謝一劍風吼,threshold等隊提供的算法交流。
感謝Blitz隊,提供的數據和豐富的圖表。
感謝幫助過個人人們。
感謝滴滴。http://research.xiaojukeji.com/competition/main.action?competitionId=DiTech2016

不少人留言問數據:
連接: http://pan.baidu.com/s/1nv2aY5z 密碼: 7ce4
只是不知道有沒有侵權,若是有請告知我刪除。

To be continued when 我何時再想到點什麼的吧

做者:刀刀寧 連接:https://www.jianshu.com/p/4140be00d4e3 來源:簡書 簡書著做權歸做者全部,任何形式的轉載都請聯繫做者得到受權並註明出處。
相關文章
相關標籤/搜索