一、行船軌跡
這里我畫了幾張相同trace的行船記錄,看看他們的軌跡是否一致,為了和test保持一致,我畫了出現在test里面的trace.
上面的軌跡圖可以看出,一些軌跡還是比較規整的,但是一部分軌跡是存在不一致的,有的船可能因為總總原因,並不是按原路線行駛,甚至會有提前登陸的情況,這種情況在test可能也會發生。為此 我們在看看test里面截斷的路線是怎樣的
從test里面的gps軌跡可以看出來, 一半截取的是前面的一小段 ,而后的記錄幾乎沒有,這就需要我們的模型能夠從test里面識別出完整的路勁,以及當前航道的目的地是哪里,這樣才能准確預測到港時間。 從另一個角度來說就是通過test被截取的gps軌跡數據,能夠在train里面找到 相近的gps軌跡數據 ,從而找出這段軌跡對應的完整路勁。當然 通過trace字段也可以粗略知道軌跡,但是可能港口的名字有誤差並不統一,或者說實際到港的目的地與trace並不相符,實際路勁也是有差別的,需要好好做數據清洗的工作。
二、數據提取
1、首先我們從20G的數據中,先通過流的方式逐一讀取,由於test里面沒有vesselNextport等字段,所以我暫時把這些字段都刪除了,並對一些數值特征進行了類型轉化,最大化在不損失精度的情況下壓縮數據,下面是初步壓縮后的信息。可以看到數據已經從原來的20G變成了5G以內。 2、第二步就是對我們抽取的數據進一步壓縮,通過觀察數據我們發現,一條船是可以有多個訂單的,所以可能存在多個訂單的狀態全是一樣的,這個相當於重復數據,同時存在一個訂單在同一時間有多個一模一樣重復的數據,所以我們可以通過vesselMMSI和timestamp 這兩個字段去重,只保留一條船的運行數據,當然去重前要 對訂單和時間排序 ,這樣才能保證保留一個船上同一個訂單的完整記錄。 去重之后我們的數據瞬間減少到了1G以內,這個對於普通的筆記本電腦內存都是可以足夠操作的。
三、觀察數據
接下來我們對數據觀察一下,看看有什么規律。 Label問題 1、首先題目是要我們預測到港時間,那么怎樣才算到港呢,這里我們截取了一個訂單的最后幾條記錄,發現船的經緯度已經不在發生什么改變,speed也是0的狀態,但是該訂單仍然在記錄,並且方向在不斷改變,從這里結合實際情況我們能猜想到,該運單船只應該是遇到了塞港,導致需要不斷變換方向,緩慢移動到目的地。但是根據官方的說明,其實這已經算是到港了。我們觀察到這前后的時間差長達4個小時之久, 那么如果我們取記錄的最后一條log作為到港時間,就顯的不太合理,這會與官方給的時間上有比較大的誤差 。所以在制作label的方面,我們可以考慮通過行船的狀態比度speed為0,或者經緯度不在劇烈改變,或者距離目標港口一定距離等一系列方式,判斷實際的到港。 軌跡問題 2、test中的trace 在trian里面並不是全都有,但是目的港口相同的或者相識的軌跡是存在的,所以我們從訓練集中提取軌跡相似的數據進行訓練就可以達到比較好的效果,保證訓練集和測試集的一致性。 我們先對trace相同的trian中的數據做一個label的平均,看看不同trace和相似trace的分布差異性。
從上圖我們可以看到,相似trace即目的地和始發地相識或者相近的trace,他們的平均用時是差不多的,所以我們在篩選數據的時候,可以把相近的數據也拿出來,擴大訓練樣本。當然也可以對這些相似的trace或者用時相近的trace做一個分箱,將相近的數據作為同一類別特征,輸入到模型當中,相當於衡量了相似度。 對於相似度計算,其實有很多方法,比如直接把路由信息做KNN聚類,KD樹分類,或者對GPS進行geohash編碼,采用文本分類的方法,比如w2v、TFIDF等訓練詞向量,計算距離,等等。(當然如果時間多,並且追求准確性,也可以采用
人工智能
的方法把軌跡圖全部畫出來,人工分類) 坐標問題 3、對於測試集中的數據,我們觀察到Onboard的時間都是第一條記錄的時間,但是 第一條記錄的坐標卻和出發港的坐標相差很大 ,我們猜測test里面的起始數據也有可能被截斷了,導致記錄並不是真正的初始記錄,而是已經行船了一定時間的記錄,但是Onboard的時間確實是截斷的最早時間。這樣說可能有點繞,我們從下圖看就一目了然。 關於港口坐標信息,我們可以從event里面的sport文件中得到,當然里面存在大量無用或者錯誤的Gps信息,通過官方的說明我們可以 刪除那些無用的數據 ,然后merger到我們的訓練集中。一般test里面的港口信息在event里面都是有的,所以我們不需要做太多處理。另外我們也可以根據百度地圖來分析驗證各個港口的坐標以及船只的實際航行位置。這里放上百度地圖的坐標查詢工具:
四、總結與展望
那這次的分析分享大概就到這里,由於目前排名並不是很靠前,所以太多技巧性的東西也不是很有把握,希望大家在看完本篇后能有所啟發,也預祝大家能取得好成績!后期復賽的話自己也有很多想法,比如從NLP的角度,這個題目有點類似於文本分類、文本相似度、以及句子翻譯等任務。比如輸入一段gps等特征序列,得到一串的估計時間等等。當然也可以傳統的NN+LGB來做,這些都還只是猜想,思考問題從不同的角度出發,有時候往往能有意想不到的收獲。不過目前最重要的還是先狗進復賽再說。后續如果還有時間和機會做這個比賽的話,也會和大家持續分享自己的思路!希望大家多多支持! 共同學習進步!!