概述
趋势预测功能模块主要实现基于历史时序数据预测未来时序变化趋势。该模块框架解耦,可以实现不同预测算法的灵活替换,并且该模块功能可以实现不同特征时序的算法自动选择,支持线性特征时序预测lr回归算法和非线性特征预测arima算法。目前该模块可以覆盖线性时序、非线性时序和周期时序的准确预测。
dbmind的趋势预测模块是一个作为监控服务中的一个定时任务定时执行的。
模块数据流图:
参数配置和建表
它的主要参数配置是在misc/dbmind.config中:
tsdb:prometheus时序数据库的连接配置
metadatabase:保存预测结果的元数据库的配置,支持sqlite,mogdb/opengauss,postgresql。
forecasting_future_time:时序预测的长度,同时也是预测功能调度周期
golden_kpi:待时序预测进行预测的关键指标项
保存数据库预测结果的数据库表结构(metadatabase/schema/forecasting_metrics.py)如下(需要在数据库中创建该表):
1:表名 2:字段名 3:索引
在misc/metric_value_range.conf配置文件中对指标的值进行过滤,限制值范围:
定时任务调用代码
模块的调用入口在:app/timed_app.py中:
1:定时任务多久启动一次。它是由dbmind.conf配置文件中的forecasting_future_time(秒)参数转换为分钟而来的,定位任务的单位是秒,所以乘60
2:需要的历史训练数据的长度。
3:首先通过从数据访问接口层dai获取prometheus采集的指定指标的数据,第一个参数是指标名称,第二个是需要的距离当前时间多久的历史数据,第三个指标是对采集的数据做时间上的聚合。300就是没隔300秒采集一次(自己重构的方法,源代码中该方法没有该参数,prometheus采集间隔短)
4:并发执行时序预测。quickly_forecast_wrapper是封装时序预测的一个方法,下面会详细介绍。
5:预测后结果数据存储到源数据库中。
app/timed_app.py中quickly_forecast_wrapper函数解析:
1:quickly_forecast是趋势预测的核心方法
2:得到metric_value_range.conf中的值范围
3:值范围过滤
算法核心代码
核心预测方法在tools /common /algorithm /forecasting /forcasting_algorithm.py中:
1:预测步长:预测的时长除以采集的间隔
2:对原始数据做插值填补缺失值
3:时序分解
4:找到合适的算法并返回模型
5:对趋势分量进行训练和预测
6:合并时序,得到最终的预测结果
详细来看一下第3步的时序分解:
1:判断是否是周期性数据,acf 波峰 人为设定的峰的阈值来判断是否是周期数据。(效果不会很一般,有很大的改进空间,可以参考一下auto periods 和阿里的robust periods,再加入先验的搜索空间,比如小时、天、星期、月等)
2:时序分解,用的stl分解。
3:如果数据是非周期数据,直接把原始数据当做趋势分量建模
详细来看一下第4步的建模部分:
1:评估模型适合用什么模型(下面会详细介绍怎么评估)
2:根据上面选出来的algorithm_name选择线性回归或arima建模
上面的estimate_order_of_model_parameters()如何选择模型?
1:默认选择线性回归模
2:网格调参寻找arima模型最佳的最优参数组合
3: bic评估是否是arima的最优参数p和q
以上就是趋势预测模块的核心代码的详细介绍,后续会更新dbmind的慢sql根因定位和基于mcts的索引推荐。