一、背景描述
已知某特征数据随着日期变动,长期以来有两种处理截点的方法:
(1) 人为判断“截点”的存在
(2) 直接设置每天12点划分一个“截点”,然后运行某程序。
人为判断的方式耗人力,直接划分的方式损耗计算机性能,因此急需一个自动划分截点的算法。
截点识别是面向实时数据的,当新数据生成,算法需判断该点是否为“截点”。
需要考虑以下内容:
-
是否是截点,人为判断的主观因素比较强,因此一开始的标签设置决定后面截点的模样。
-
不能因为曲线的频繁波动就划分很多截点,否则很可能短期内频繁启动程序,更耗性能。
-
截点划分只能看到前面的数据,不知道后一天的走向
-
需要设置阈值MAX_DAY, 保障如果MAX_DAY天数内,没有符合算法的“截点”生成,当天24点运行一次程序。
二、算法设计
一开始走过不少弯路,例如一维时序的周期性识别、峰值谷值的自动识别,...
一番探索以后,认为这应该是一个有监督的算法。先人工对“截点”进行标记,然后训练二分类算法。
(1) 特征提取
取前n天的环比数据作为特征,例如第i天的特征数据为:
count为原始一维时序数列,特征1-8为前8天的环比值,1表示为截点。
(2) 模型训练
- 算法选型:分类算法很多,需进行最优分类的选型。
- 特征工程优化:算法取前n天的环比数据作为特征,可配置n查看截点分类效果,选择最优n值。
(3) 截点自动划分器
配置信息:
- MIN_TIME:保障短期内不多次触动某程序,要求两个截点的时间差距要大于MIN_TIME才可触发某程序。
- MAX_DAY:如果MAX_DAY天数内,没有符合算法的“截点”生成,当天24点运行一次程序,避免长期不触发某程序。
新数据count生成,首先判断是否为“截点”,如果是,判断距离上一个截点的时间间距是否大于MIN_TIME天,如果是,触发某程序;
新数据生成,判断是否为“截点”,如果否,判断距离上一个截点的时间间距是否大于MAX_DAY,如果是,触发某程序,否则当天不允某程序。
网友评论