姚一,周中雨,李洋,杨程屹
(中国民航信息网络股份有限公司,北京,100105)
航空公司电子客票航班查询动态缓存系统设计
姚一,周中雨,李洋,杨程屹
(中国民航信息网络股份有限公司,北京,100105)
本文采用机器学习技术实现航空公司电子客票航班查询的动态缓存。针对第三方大量抓取航空公司网站航班数据的问题,进行访问行为分析,建立航班查询缓存模型并进行系统改造,以达到降低查询预订比的效果。
航班查询;机器学习;缓存
随着民航电子客票的广泛使用,国内大多数航空公司已经实现了电子客票的线上销售模式,打造出各具特色的官方网站。但就像其它电子商务平台所面临的问题一样,也产生了航空公司网站航班数据被恶意采集的问题。互联网爬虫不正当抓取航空公司网站数据不仅使航空公司为超额流量支付大量额外费用,而且使其承受更大的访问压力,以至于需要投入更多的软硬件成本。
针对这种日益严重的问题,需要在网站端与后台航班查询系统之间建立一套高效的缓存机制。目前一般采用的方式主要是固定或者仅仅是粗粒度的划分不同航线的缓存有效期。这种做法过度依赖经验值,航空公司需要一种能够根据用户查询行为动态决策缓存策略的方式,利用缓存最大程度的节约后台流量并且保证缓存数据的相对准确。以下我们采用目前较为流行的机器学习[1]方式实现缓存有效期的计算,并且将其应用于实际系统中。
学习系统的关键在于如何对当前查询的请求和结果设置合理的缓存时效,比如用户今天9:00查询了北京-上海某航空公司的航班数据,其查询结果应当在缓存系统中保存多久才不会影响用户的预订。对此我们可以从历史查询日志中进行分析,通过查询量与频度预测当前的缓存时效。
参数名称备注departure起飞机场arrival到达机场departuredate起飞日期querydate当前查询日期airline航空公司direct是否直达
网站记录的用户每次航班查询的日志将作为用户行为分析的基础数据。一次正常的查询请求主要包括以下参数。其中起飞和到达机场对应的航线、起飞日期以及查询日期都可能是影响查询规律的因素。按照业务现状,航空公司不同航线的查询量分布差异很大,我们将其分为重点航线和普通航线。以下根据生产数据进行样本分析,以便发现其中的规律。
1.1 分析样本数据
选取某航空公司2014年11月-2015年1月查询日志,日均访问量在百万级。从中抽取查询量占60%以上的航线作为重点航线着重分析。以下是对其中访问量较大的几条重点航线查询量数据的初步分析。
图1 CAN-PEK航线查询90天内航班查询量
上面两幅图的纵坐标为查询量(次数),横坐标为起飞日期距离查询日期。每张图代表一个航线,图中每条线代表在一个固定的日期查询不同起飞日期的查询量,起飞日期距离查询日期的时间范围分布在0-90天。
可以观察到航班起飞日期距离查询日期当间隔为约30天时查询量有显著变化,而30天之内的查询,当查询/起飞日期间隔在约10天时,查询量又发生显著波动。根据业务特点,航班起飞日期离查询日期越近,查询越频繁。从以上两条航线的查询量分析得知频繁的查询主要集中在30天内。其次,某些航线(图1)在查询提前时间在30天之外保持平稳的较少查询量,但是某些航线(图2)会有剧烈的波动,经确认是该航线与春运购票有关。事实上重要假期或事件对航班查询规律都会造成显著的影响。
图2 CAN-CTU航线查询90天内航班查询量
图3 是分析一天内的查询规律,纵坐标是查询次数,横坐标是一天24小时,分析结果呈现出在大约在7时是查询量明显变化的分界点,同时库存变化的频度也与查询量变化规律基本一致。这也呼应了民航旅客普遍的作息规律。
图3 一天内24小时查询量的变化
根据以上分析结果,初步得出结论:
(1)对于航空公司特定航线影响查询规律的因素主要与查询日期(querydate),起飞日期(depaturedate)相关。
(2)缓存策略所影响的查询时间范围,每天集中在7时至24时,而航班起飞日期与查询日期间隔集中在30天以内。
1.2 构造样本数据
因查询量与缓存时效有相关性:查询量大,航班剩余可销售状态变化频繁,缓存时效需较短,反之亦然。为了动态计算缓存时效,首先需要预测查询量。根据对查询量数据的初步分析,判断影响航班查询量的日期因素包括:
星期:查询或起飞日期在每周一至周日会有差异,例如查询日期在周五附近会增多,而起飞日期在周六附近会增多;
节日:查询和起飞日期在各种节日附近的行为会有差异,节日可以分为长假的节日(7天及以上)、短假的节日(1至3天)和不放假的节日;
寒暑假:学生寒暑假也会是影响因素。可以分为假期开始和假期结束,假期开始附近(包括假期之前的若干天)和假期结束附近(包括假期之后的若干天);
查询日期与起飞日期的间隔也是一个重要的影响因素。
根据以上日期因素,起飞和查询日期可分别指定17个特征,再增加日期间隔一共35个特征。
表1 日期特征
对于多维特征的有限数据样本,我们采用机器学习中的支持向量机(SVM)模型,并使用其中的支持向量回归(SVR)[2]算法对未来查询量进行预测。
在JAVA环境下使用libsvm[3]工具进行学习训练。预先准备60天的历史数据,筛选重点航线,对每条航线生成样本特征文件,格式形如:
T1 T2 T3 ...... T35 querycount
querydate1 depdate1 0 1 0 0 100
querydate1 depdate2 0 1 0 0 200
querydate1 depdate3 0 0 1 1 300
querydate1 depdate4 1 0 0 0 150
......
querydate60 depdateN 0 1 0 0 100
其次构造预测结果文件,其中指定查询日期,航班时间为未来30天的不同查询条目
T1 T2 T3 ...... T35 querycount(待预测)
depdate1 0 1 0 0
depdate2 0 1 0 0
depdate3 0 0 1 0
depdate4 1 0 0 0
......
depdate30 0 1 0 0
接下来根据样本特征文件构造预测模型。我们使用的是SVR算法默认的核函数RBF[4]构建SVM预测模型,其中核函数的相关参数暂时使用默认值(libsvm的使用在这里不再赘述)。
按照预测文件进行计算生成每个起飞日期的预测查询量。图4是预测查询量与实际查询量的对比,基本符合实际查询量的变化规律。
图4 算法预测查询量与实际查询量的对比
1.3 缓存时效的转换与验证
通过前文步骤预测查询量后,需要转换为最终的缓存有效期,如果查询量为x,缓存时间为T,需要选定一个转换函数T=f(x)。按照业务特点分析:
(1)对于查询量越高的请求,应当给予越短的缓存时间以保证其及时更新,反之查询量越低则缓存时间越长。
(2)因为航线分为重点和普通航线,普通航线访问量较少,可以暂时固定其缓存时间。
(3)重点航线的缓存时间为最终需要计算的T,且有最低的缓存时间值。
根据以上可知的参数,我们使用多种函数进行试验并使用生产数据进行验证,以寻求最优的缓存效果。为此我们准备两个月的历史日志作为基础数据,并且取最后若干天的数据作为预测结果的验证比对数据。
我们试验在不同的缓存时间下,命中率与准确率的效果(命中率=从缓存获得结果总数/总请求数;准确率是通过缓存结果与真实结果是否一致来计算)。我们针对基础数据最后若干天的查询请求模拟在缓存的录入和失效下的查询行为,如果当前扫描到的请求在缓存中不存在时,会将其结果插入缓存;当下次相同请求被扫描到时比较两次请求的时间差,如果在缓存时效内则命中,否则清除当前缓存数据并获得最新结果;当缓存命中时与原有日志中的真实结果进行比对以验证准确性。
以下在选定某个查询量与缓存时间转换函数以及指定各已知参数(普通航线和重点航线最低缓存时间)的验证结果。经过多次实验验证得出结论:在业务许可的精度内,线性回归方程[5]T=a-bx即可满足表示查询量与缓存有效期的关系,并且通过不同参数设置可以达到较优的命中率与准确率平衡,图5所示,当横坐标x查询量越大时,对应纵坐标缓存时间T会越短。该函数中,参数a为重点航线最低缓存时间,参数b作为调控参数。
表2 验证结果
700 700 0.893513974 0.849014295 800 800 0.925494537 0.82853509 900 900 0.900102582 0.842538137
图5 查询量与查询时间的对应关系
至此总结获得缓存时效主要分为两大步骤:预测查询量和计算缓存时间,这其中包含的若干可变参数需要经过实际数据验证以选取最优组合。图6体现了不同参数设置下,验证的命中率与准确率的变化规律。为了保证生产环境下正常运行,我们按照准确率在95%以上的标准进行调优,当命中率能够达到降低冗余查询成本的要求时,该参数为最优调控组合。
图6 验证结果的命中率与准确率关系图
引入动态缓存系统后的系统架构如图7所示,新增的缓存系统与原有系统各自独立;缓存系统根据航班查询日志进行夜间离线学习训练,不会对实时系统造成影响,并将学习结果的缓存策略放到Cache中供实时系统调用。网站原有的航班查询系统新增缓存查询逻辑,可以决策查询真实数据或查询缓存数据。
图7 航班查询架构调整
缓存查询逻辑如图8所示。学习系统每天夜间执行一次,次日航班查询时,如果当前请求在缓存中不存在时,会根据学习结果的缓存时效将当前的查询结果录入缓存。
图8 缓存查询逻辑流程图
缓存系统投产后效果显著,以某航空公司实际投产前后数据对比为例,如图9所示,该系统于2016年4月底投产,5月份缓存命中率已经达到了50%以上,且查询量与订座量比例(查订比)的降幅也超过了50%。
图9 投产前后查询量效果对比
其次在这种命中率很高的情况下,用户的预订成功量并没有因为缓存存在准确率的问题而受到影响,如图10。
动态缓存系统投产后有效的节省了直接查询后台的流量。同时这种高命中率的查询对航班结果的准确性并没有造成明显影响,投产后为了进一步提高缓存的准确率,我们也采用了一些判断逻辑,比如当发现有舱位预订行为时会及时更新缓存中相应结果。在这些举措下通过一段时间的检验,缓存的使用不仅增加了后台承载能力,也促进了网站预订量的增涨,提高了航空公司收益。
在投产之后缓存的算法仍然需要进一步调优,算法中各项预设参数还有待进一步验证,以达到更优的命中率与准确率的平衡。
图10 投产后预订量变化
[1]杨树仁,沈洪远.基于相关向量机的机器学习算法研究与应用[J].计算技术与自动化,2010,29(1):43-47.
[2]杨玫,刘瑜,孔波.SVR模型参数选择方法的研究[J].计算机时代,2009(11):53-55.
[3]Chang C C, Lin C J. LIBSVM: A library for support vector machines[M]. ACM, 2011.
[4]林升梁,刘志.基于RBF核函数的支持向量机参数选择[J].浙江工业大学学报,2007,35(2):163-167.
[5]刘连福.一元线性回归方程中回归系数的几种确定方法[J].沈阳师范大学学报(自然科学版),2008,26(4):406-408.
The design of dynamic caching system for airline flight inquiry
Yao Yi,Zhou Zhongyu,Li Yang,Yang chengyi
(TravelSky Technology Limited,beijing,100105)
This paper introduced a method that involved Macheine Learning to achieve dynamic caching system for airline flight inquiry. According to the problem of data crawlers of third-parties, the system analyzed visiting behaviors and established a caching model for flight inquiry. As a result, the system can help reducing the query and booking ratio.
Flight inquires; Machine Learning; Caching
姚一(1981-),男,中国民航信息网络股份有限公司高级工程师,主要从事JAVA后台高并发服务设计和研发。
周中雨(1978-),男,中国民航信息网络股份有限公司资深工程师,主要从事J2EE平台软件设计研发,研究方向:高性能架构,规则引擎,机器学习等。
李洋(1977-),男,中国民航信息网络股份有限公司资深工程师,主要从事航空公司电子商务智能化解决方案的研究和实现。
杨程屹(1986-),男,中国民航信息网络股份有限公司工程师,主要从事数据分析、算法开发工作。
北京市科学技术委员会2017年度创新基地培育与发展专项(Z171100002217047)。