KATS简介
时间序列分析建模是数据科学和机器学习的一个重要的领域,在电子商务、金融、供应链管理、医学、气象、能源、天文等诸多领域有着广泛的应用。目前时间序列分析以及建模的技术非常多,但相对散乱。
Facebook开源的Kats 是第一个开发标准并连接时间序列分析各个领域的综合 Python 库,用户可以在这里探索其时间序列数据的基本特征,预测未来值,监视异常,并将其合并到ML模型和pipeline中。
Kats (Kits to Analyze Time Series) 是一个轻量级、易于使用、可扩展和通用的框架,用于在 Python 中执行时间序列分析。具有以下功能:
- 预测(Forecasting)
- 异常和变化点检测(Anomaly and Change Point Detection)
- 特征提取(Feature Extraction)
github地址:https://github.com/facebookrese
KATS安装
pip install kats
安装遇到的问题:
安装过程中涉及fbprophet的安装,问题主要集中在这个包上
问题一:
Microsoft Visual C++ 14.0 is required
解决方法:安装visual studio2017,选择“使用C++的桌面开发”选项
问题二:
error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\cl.exe' failed with exit status 2
ERROR: Failed building wheel for fbprophet
解决方法:执行以下语句:
python -m pip install -U pip
conda install -c conda-forge pystan
pip install fbprophet
完成fbprophet
安装后再次进行pip install kats
参考:
(12条消息) Fbprophet安装过程遇到的问题及解决方法实录_bkdly9的博客-CSDN博客
KATS功能介绍
数据类型:TimeSeriesData,此类数据类型可由dataframe转换,dataframe应包含时间列(time)以及需要处理的时序数据(value,可包含一列或多列)
tsd = TimeSeriesData(df)
tsd = TimeSeriesData(time=df.time, value=df[['value1', 'value2']])
注:多列的数据能否进行预测需要根据实际模型功能判断
以下内容介绍中参数为基本参数,即可以保证使用的参数说明,其他进阶参数请参考源代码说明。
预测(Forecasting)
KATS包含13种模型
- ARIMA
- BayesianVAR
- HarmonicRegression
- HoltWinters
- Linear
- LSTM
- Prophet(prophet是facebook开源的python预测库,较为常用)
- Quadratic
- SARIMA
- STLF
- Theta
- VAR
- Nowcasting
以下内容模型名称以model_name
代替
1. 实例化参数
params = model_nameParams(**kwargs)
参数:
- 具体参数详见各模型包代码
返回:
- 实例化参数
2. 实例化模型
model = model_nameModel(data, params)
参数:
- data:(TimeSeriesData)输入数据
- params:(实例化参数,与模型对应)模型参数
返回:
- 实例化模型
注:
- BayesianVAR模型的实例化模型代码为
model = BayesianVAR()
3. 模型训练
model.fit()
返回:
- 训练后的模型,训练集为实例化模型过程输入的data数据
4. 预测
model.predict(step, include_history, **kwargs)
参数:
- step:(int)预测范围,表示预测n个单位时间长度的value
- include_history:(bool,default=False)是否包含历史数据
返回:(dataframe)
- **fcst:**预测值
- **fcst_lower:**预测下界
- **fcst_upper:**预测上界
5. 绘图
model.plot()
返回:
- 包含历史结点与预测节点的图,预测部分包含预测值与上下界
代码示例
# 导入prophet模型和参数类
from kats.models.prophet import ProphetModel, ProphetParams
# 创建参数实例,和原生的prophet的参数一致,周期性叠加选择乘法模型
params = ProphetParams(seasonality_mode='multiplicative', interval_width=0.80)
# 创建一个模型实例
model = ProphetModel(data=air_passengers_ts, params=params)
# 模型训练
model.fit()
# 预测未来30个月的数据
forecast = model.predict(steps=30, freq='MS')
# 画图展示
model.plot()
# 预测结果是个pd.DataFrame,fcst:预测值,fcst_lower预测下界,fcst_upper预测上届
forecast.head()
params = ProphetParams(seasonality_mode='multiplicative')
model = ProphetModel(data=multi_tsd, params=params)
model.fit()
forecast = model.predict(steps=200,freq='s')
model.plot()
检测(Detection)
检测器分类:
- 检测离群点异常点
- 检测突变点
- 检测趋势变化
检测离群异常点
异常点即指时序数据在某个时间点突然变大或变小,随后恢复正常的节点
Outlier Detection
使用STL时序分解法,对分解后的时序数据进行判断,若节点高于n倍四分位距的节点作为离群异常点。(STL时序分解法大体上是将时序数据的季节性和趋势性处理的过程)
1. 实例化模型
outlier_detection = OutlierDetector(data, decomp, iqr_mult)
参数:
- data:(TimeSeriesData)输入数据
- decomp
- **additive:**加法模型
- **multiplicative:**乘法模型
- iqr_mult:(default=3.0)超过四分位距的倍数
2. 异常点检测
outlier_detection.dector()
返回:
- (List)离群异常点序列,Timestamp格式数据
3. 异常点替换
outlier_detection.remover(interpolate)
参数:
- interpolate:(bool)是否进行插值替换,否则以NAN替换
返回:
- 替换后的时序数据
检测突变点
突变点即指时序数据发生整体性突变的时间节点,例如均值在突变点前后显著不同等。
包含以下模型:
-
CUSUM
-
BOCPD
CUSUM DETECTION
CUSUM主要研究信号均值和方差信息判断系统是否发生了变化,其主要思想是:当监测量的CUSUM明显比正常平稳运行条件下的平均水平高或者低的时候,就意味着系统发生了变化。
1. 实例化模型
model = CUSUMDetector(data)
参数:
- data:(TimeSeriesData)输入数据
2. 检测
check = model.detector(change_directions, interest_window)
参数:
- change_directions:(List,default:两者都检测)变化方向
- **[‘increase’]:**增长变化
- **[‘decrease’]:**下降变化
- interest_window:(List),感兴趣的检查区间,例如:
[20, 40]
注:
- 每个区间只检测一个突变点
**BOCPD **
贝叶斯在线变化点检测是一个用于在线估计变化点的模块化贝叶斯框架。它通过估计游程长度上的后验值来模拟数据生成参数的变化,并利用共轭指数模型实现模块化和高效的参数估计。
1. 实例化模型
model = BOCPDetector(data)
参数:
- data:(TimeSeriesData)输入数据
2. 检测
check = model.detector(threshold)
参数:
- threshold:(float,default=0.5)阈值,可以理解为进行检验时判断该点是否为突变点的阈值,越接近1判断条件越严格
注:
- 全部突变点检测
3. 绘图
detector = BOCPDetector(multi_tsd) #CUSUMDetector同理
point = BOCPDetector(multi_tsd).detector()
detector.plot(point)
检测趋势
趋势检测即指时序数据是否具有随时间增加或减少的趋势
MKDetector
利用Mann-Kendall检验检测是否存在单调趋势
1. 数据转换
d = MKDetector(data)
参数:
- data:(TimeSeriesData)输入数据
返回:
- MK格式数据
2. 模型实例化
model = MKDetector()
参数:
- data:(MKData)输入数据
- threshold:(float,default=0.8)变动趋势阈值
- **alpha:**MK检验的显著性水平
3. 趋势检测
mk_detector = d.detector()
参数:
- window_size:
- **direction:**检测的趋势方向
- **up:**上升
- **down:**下降
- both:(default)两种情况都检测
- **freq:**数据是否季节性变化(default=None,默认没有季节性)
- **weekly:**按星期计算
- **monthly:**按月计算
- **yearly:**按年计算
返回:
- (List)包含时序数据的趋势判断与时间区间
特征提取(Feature Extraction)
基于时序数据生成数据的特征(是数据本身的特征,类似describe)
model = TsFeatures()
ts_feats = model.transform(data)
参数:
- data:需检测的数据
返回:
- (dict),包含40个时序特征,具体含义可参考代码注释
示例:
model = TsFeatures()
ts_feats = model.transform(multi_tsd)
ts_feats
outputs:
{'length': 500,
'mean': 52.504,
'var': 665.6539839999997,
'entropy': 0.7540887174452835,
'lumpiness': 28498.858991470755,
'stability': 74.71133788662327,
'flat_spots': 4,
'hurst': -0.02461373397406244,
'std1st_der': 15.549033924974246,
'crossing_points': 143,
'binarize_mean': 0.564,
'unitroot_kpss': 0.12227942016708582,
'heterogeneity': 120.05568322323352,
'histogram_mode': 10.0,
'linearity': 0.036508833811668015,
'trend_strength': 0.6058395262816343,
'seasonality_strength': 0.3750212016915916,
'spikiness': 0.38161570986593146,
'peak': 4,
'trough': 6,
'level_shift_idx': 249,
'level_shift_size': 5.549999999999997,
'y_acf1': 0.5248392413557613,
'y_acf5': 0.4618439743121168,
'diff1y_acf1': -0.23144668198542026,
'diff1y_acf5': 0.14283730667364275,
'diff2y_acf1': -0.48329360080462136,
'diff2y_acf5': 0.2921125116452738,
'y_pacf5': 0.3160059590171947,
'diff1y_pacf5': 0.19237189053244722,
'diff2y_pacf5': 0.7730136887443844,
'seas_acf1': -0.04378234476847962,
'seas_pacf1': -0.07589936491438594,
'firstmin_ac': 2,
'firstzero_ac': 7,
'holt_alpha': 0.5212829451180244,
'holt_beta': 0.017189713924912486,
'hw_alpha': 0.5162902516381802,
'hw_beta': 4.935561928168426e-05,
'hw_gamma': 4.332446540165993e-05}