2017摩拜杯演算法挑戰賽 第三名團隊解決方案
01-28
比賽已經結束快兩個月了,一直拖到現在才開始總結。
官網網址:https://biendata.com/competition/mobike/
GitHub源碼:https://github.com/Magic-Bubble/Mobike
任務背景
- 隨著綠色出行和環保觀念的深入人心,摩拜單車自推出以來不僅深受用戶喜愛,也減輕了城市路網壓力和擁堵情況
- 摩拜致力於應用前沿科技幫助人們更好地出行,利用機器學習預測用戶的出行目的地是眾多應用場景中重要的一個
- 目前,摩拜單車在北京的投放量已超40萬,為更好地調配和管理這些單車,需要準確地預測每個用戶的騎行目的地
任務目標
根據給出的300萬的用戶出行記錄訓練數據,對用戶出行的目標地點進行預測
衡量指標
其中,|U|是需要預測的orderid總個數,P(k)是在k處的精度,n是地點個數。
評測函數代碼請參考: https://github.com/benhamner/Metrics/blob/master/Python/ml_metrics/average_precision.py
數據說明
問題抽象
可以將其轉化為一個二分類的問題,首先構造出當前訂單可能會去的若干地方,然後用二分類的方式給每個候選地址進行打分,選擇分數最高的top3集合即可。
候選目的地構建
- 樣本預過濾。從海量候選集中篩選出最可能的候選樣本,清理異常樣本,減少樣本規模,提高候選集的覆蓋率和模型精度。比如用戶常去的topN地方,以及從這個地點出發常去的topN地方等。
- 規則預過濾。定義規則過濾候選集,如距離等,超過某個距離的就過濾掉
- 起點漂移。將geohash區塊臨界8塊區域記為同一區域,取該區域top連接數目的地。事實證明,這是我們整個方案的瓶頸所在,很多人找車不會在同一個地方找,而大概率可能也會去其附近的地方找車,所以這一步很有必要。
數據集構建
比賽給出的數據是連續兩周的用戶出行記錄,需要預測後面一周的目的地。因此數據集的合理構建也十分有必要,構建方式如下:
具體地,是採用19號之前的為19號加特徵,20號之前的為20號加特徵,...,最終構建出19,20,21,22,23,24六天的數據作為訓練數據。
特徵構建
通過對數據的統計和挖掘,從如下兩個視角進行特徵的構建:
- 特徵群。共有三個特徵群,用戶、時間和地點。其中,用戶包含熱啟動和冷啟動(之前沒有過出行記錄),時間包含周內、周末、小時、天等特徵,地點包括經緯度、熱度、方向等特徵。
- 特徵類型。主要包含五個部分,計數特徵(比如用戶到過這個地方多少次),距離角度特徵(出發地到候選目的地的距離方向等),Label窗特徵,比率特徵(用戶到這個地方占其出行次數的比率是多少)等。
模型訓練及融合
採用經典的XGBoost和LightGBM進行訓練,融合也非常簡單,就是兩個模型的概率相乘融合。
結果
訓練細節
- 樣本候選集覆蓋率
2. 特徵維度
特徵重要性排序
總結
- 樣本候選集的構建是整個比賽的瓶頸和突破點。我們和前面隊伍的差距主要在於此,可以再多擴展一層,變成4*4的漂移區域
- 候選集的覆蓋率提升很關鍵
- 特徵基本上都差不多,沒有什麼強特徵,維度太多不僅會影響速度,也可能拉低效果
總體來說,第一次參加數據挖掘類的比賽,還是收穫很多!
推薦閱讀:
※誰來用最通俗易懂的語言跟我講一下k平均演算法(k means clustering)??
※R實戰案例:利用演算法識別糖尿病患者(R語言實現)
※紅包都送不出去了?教你看懂數據,不再懷疑人生
※我們只談自己,不談友商
※NLP自然語言處理從入門到迷茫