总结一下这半个月的工作(20190617-20190705),主要是围绕司机接驾阶段绕路检测这个问题开展了一些探索。
(本文所附代码都是网上开源代码或者在其基础上修改得到)
1. iBOAT算法做绕路检测
iBOAT算法是一篇IEEE Trans on ITS提出的绕路检测的算法,简单来说是根据目标轨迹和关联的历史轨迹的重合率(support)的大小来判断司机是否绕路。这个算法对于生成环境来说最大的好处是其可解释性,只要像下图展示出历史轨迹和目标轨迹,就能非常直观的知道司机有没有绕路。不过因为在实际生产环境中同样OD的轨迹很少,所以这里的关联规则改为只要是经过OD的轨迹都加入关联历史轨迹库中。实习期间最初的工作是复现这个算法,跑出来的效果如下:
绿色的是历史轨迹,颜色越深表示经过的历史轨迹越多,蓝色的是正常轨迹段(support<阈值),红色的是异常轨迹段(support>阈值)。
support值的图,红色的是一些异常轨迹点,也就是support<0.2的轨迹点。
然而这个算法存在一些弊端:
- 如果关联不到历史轨迹,或者说历史轨迹很少,那么算法的效果会很差甚至失效;
- 需要手动划分格网大小。因为单元是格网,要把轨迹聚合到格网内,格网的不连续问题可以用轨迹重采样的方式解决,但是如果格网大小选的不合适,可能对于目标轨迹而言根本就不能触发iboat计算。例如格网选取500米,但是目标轨迹的范围压根儿没超过一个格网大小,尤其对于接驾阶段,很多时候不会超过一个格网大小,那么iboat就会失效。
2. 用Logistic Regression做绕路检测
绕路检测本质上就是个二分类的问题。为了召回iboat无法召回的case,以及纠正iboat可能错召回的case,进一步采用逻辑回归的方式来对绕路检测问题建模。用逻辑回归的好处在于研究对象变成了轨迹点本身,不再需要将轨迹点聚合到格网,所以就避免了手动选取格网大小的问题。
逻辑回归是机器学习领域常用的一个分类器模型,其他还有决策树、SVM、GBDT、xgboost等等。先从最简单的模型入手,看看用在绕路分类问题上效果如何。
2.1 轨迹相似度特征
因为涉及到一些公司的数据隐私问题,不详述提取的特征,这里简单介绍几个轨迹特征。
调研的时候看了DTW和LCSS,都是常用的轨迹相似度衡量指标。在绕路问题的逻辑回归建模中,因为LCSS可以转换为0~1之间的数,所以这个特征更方便使用,就不用DTW,下面还是两个都介绍一下。
2.1.1 DTW (Dynamic Time Warping)
一个可以用来衡量目标轨迹与历史轨迹相似度的指标。简单来说DTW就是将两条轨迹的各个轨迹点对应起来需要花费的最小总匹配成本,匹配成本用两点之间的距离来衡量。下面的代码(