分析趋势主题的工具
moda的Python项目详细描述
moda
趋势主题检测和异常检测的模型和评估框架。
moda提供了一个接口,用于评估单变量或多类别时间序列数据集上的模型。它还允许用户使用scikit学习风格api添加其他模型。moda中提供的所有模型都通过包装一个单变量模型在多个类别上运行来适应多类别场景。它还允许使用序列/测试分割或时间序列交叉验证对模型进行评估。
安装
pip install moda
用法
将原始数据集转换为moda数据集:
moda使用多索引保存日期戳和类别。所有的模型都经过了调整,以接受这种结构。假设输入数据集每行有一个条目,并且有一个名为“date”的日期戳列。附加的“类别”列是可选的。 第一步,将数据集聚合为固定大小的时间间隔,并创建一个具有“date”、“category”(可选)和“value”列的新数据集。“date”(pandas datetimeindex)和“category”的多索引是数据集的索引。
importpandasaspdfrommoda.dataprepimportraw_to_ts,ts_to_rangeDATAPATH="example/SF_data/SF311-2008.csv"# The full dataset can be downloaded from here: https://data.sfgov.org/City-Infrastructure/311-Cases/vw6y-z8j6/dataTIME_RANGE="24H"# Aggregate all events in the raw data into 3 hour intervals# Read raw fileraw=pd.read_csv(DATAPATH)# Turn the raw data into a time series (with date as a pandas DatetimeIndex)ts=raw_to_ts(raw)# Aggregate items per time and category, given a time intervalranged_ts=ts_to_range(ts,time_range=TIME_RANGE)
运行模型:
运行一个模型,并使用手动标记的集合提取度量值
frommoda.evaluatorsimportget_metrics_for_all_categories,get_final_metricsfrommoda.dataprepimportread_datafrommoda.modelsimportSTLTrendinessDetectormodel=STLTrendinessDetector(freq='24H',min_value=10,anomaly_type='residual',num_of_std=3,lo_delta=0)# Take the entire time series and evaluate anomalies on all of it or just the last window(s)prediction=model.predict(dataset)raw_metrics=get_metrics_for_all_categories(dataset[['value']],prediction[['prediction']],dataset[['label']],window_size_for_metrics=1)metrics=get_final_metrics(raw_metrics)## Plot results for each categorymodel.plot(labels=dataset['label'])
模型评估
列车/测试拆分和评估示例
frommoda.evaluatorsimportget_metrics_for_all_categories,get_final_metricsfrommoda.dataprepimportread_datafrommoda.modelsimportSTLTrendinessDetectordataset=read_data("datasets/SF24H_labeled.csv")print(dataset.head())model=STLTrendinessDetector(freq='24H',min_value=10,anomaly_type='residual',num_of_std=3,lo_delta=0)# Take the entire time series and evaluate anomalies on all of it or just the last window(s)prediction=model.predict(dataset)raw_metrics=get_metrics_for_all_categories(dataset[['value']],prediction[['prediction']],dataset[['label']],window_size_for_metrics=1)metrics=get_final_metrics(raw_metrics)print('f1 = {}'.format(metrics['f1']))print('precision = {}'.format(metrics['precision']))print('recall = {}'.format(metrics['recall']))## Plot results for each category#model.plot(labels=dataset['label'])
示例
有这个例子的jupyter笔记本可以找到here。
包含探索性数据分析的更详细的示例可以找到here
当前包括的型号:
- 基于移动平均的季节性分解(适用于趋势检测的ma)
Statsmodel季节性腐烂的包装。一种简单的分解方法,它使用移动平均来去除趋势,并使用卷积滤波器来检测季节性。结果是残差的时间序列。为了检测时间序列中的异常和有趣的趋势,我们在分解的趋势序列和残差序列上寻找异常值。如果点的值高于前一窗口中历史值的若干标准差,则将其视为异常值。我们评估了不同的趋势预测策略:1。仅剩余异常,2.仅趋势异常、残差或趋势异常、残差和趋势异常。 这是基线模型,当季节性或多或少是恒定的时,它会给出不错的结果。
- 利用黄土的季节性和趋势分解(适应性stl)
stl采用迭代黄土平滑法得到趋势估计值,然后再进行黄土平滑,提取出变化的加性季节分量。它可以处理任何类型的季节性,季节性值可以随时间变化。我们使用了与基于移动平均的季节分解相同的异常检测机制。 包装(https://github.com/jrmontag/STLDecompose) 当趋势和季节性具有更复杂的模式时,使用此模型。它通常优于移动平均模型。
STL输出图示例: 左侧显示原点(顶部)和分解时间序列(季节、趋势、残差) 右侧显示在残差时间序列(顶部)、趋势、预测(残差和趋势异常的组合)和地面真实性(底部)上发现的异常。
- 天青异常探测器
使用azure异常检测器认知服务作为检测异常的黑盒。azure异常查找器提供了一个上限,可用于估计异常程度。当异常具有相对复杂的结构时,该模型非常有用
- 推特
twitter异常检测包的包装(https://github.com/Marcnuth/AnomalyDetection) 该模型与(1)和(2)相似,但在分析时间序列后,有一种更复杂的异常检测方法。
- LSTM
训练一个预测lstm模型,并在时间t与时间t的实际值。然后,通过与先前差异的标准差进行比较来估计差异。只有当存在足够的数据来表示时间序列模式时,这才是有用的。
运行lstms的示例可以找到here
运行测试和起毛
moda使用pytest进行测试。为了运行测试,只需从moda的主目录调用pytest
。对于linting,此模块使用pep8约定。