赞
踩
HyperTS是一个开源的时间序列分析库,是 DataCanvas Automatic Toolkits(DAT) 针对于 时间序列 任务推出了一款涵盖 自动机器学习(AutoML) 与 自动深度学习(AutoDL) 的全Pipeline学习工具。主要用于处理和分析时间序列数据。它提供了一系列功能强大的工具和算法,它涵盖了数据清洗、数据预处理、特征工程、模型选择、超参数优化、模型评估、预测可视化等一系列自动化的操作, 轻松几行代码便可以完全 端到端 地处理多种场景下的时间序列任务。
以下是关于HyperTS的一些详细介绍:
总的来说,HyperTS是一个功能强大的时间序列分析库,可以帮助你处理和分析时间序列数据。你可以使用它进行时间序列的预处理、特征提取、模型建立和预测等任务。
HyperTS的功能特性清单如下:
安装:
pip install prophet
pip install hyperts
可能会发生的是Numpy版本的一个兼容问题,更新Numpy:
pip install --upgrade numpy
其他:可选择安装tensorflow:
# 如果使用到深度学习时,需要安装
pip install tensorflow
主要是通过make_experiment函数来训练一个模型:
通用工作流程:
其他注意事项:
task设置:最简单的设置为’forecast’、‘classification’ 、‘regression’, 这样HyperTS将自行判断任务类型。
时间序列预测: 在时间序列任务中,我们除了按照惯例的流程外,我们还需要向make_experiment中传入参数timestamp,即指定时间戳。如果存在协同变量,我们也需要指定协同变量covariates。指定时序预测任务,即task= ‘forecast’
预测数据格式:在预测任务中, 输入数据应该是一个含有时间列(TimeStamp)(必须有时间列)和变量列的 pandas.DataFrame 格式的二维数据表。
其他:
案例如下:
from hyperts import make_experiment from hyperts.datasets import load_network_traffic from sklearn.model_selection import train_test_split data = load_network_traffic() # 分割训练数据和测试数据 train_data, test_data = train_test_split(data, test_size=0.2, shuffle=False) model = make_experiment(train_data.copy(), task='multivariate-forecast', mode='stats', timestamp='TimeStamp', covariates=['HourSin', 'WeekCos', 'CBWD']).run() # 测试数据分割成变量以及目标值 X_test, y_test = model.split_X_y(test_data.copy()) # 使用predict方法来执行结果的预测。 y_pred = model.predict(X_test) scores = model.evaluate(y_test, y_pred) model.plot(forecast=y_pred, actual=test_data)
输出:
from hyperts import make_experiment from hyperts.datasets import load_basic_motions from sklearn.metrics import f1_score from sklearn.model_selection import train_test_split data = load_basic_motions() train_data, test_data = train_test_split(data, test_size=0.2) model = make_experiment(train_data.copy(), task='classification', mode='dl', tf_gpu_usage_strategy=1, reward_metric='accuracy', max_trials=30, early_stopping_rounds=10).run() X_test, y_test = model.split_X_y(test_data.copy()) y_pred = model.predict(X_test) y_proba = model.predict_proba(X_test) scores = model.evaluate(y_test, y_pred, y_proba=y_proba, metrics=['accuracy', 'auc', f1_score]) print(scores)
输出:
时间序列异常检测: 在时间序列异常检测任务中,同时间序列预测任务类似,我们除了按照惯例的流程外,我们还需要向make_experiment中传入参数timestamp,即指定时间戳。如果存在协同变量,我们也需要指定协同变量covariates。
from hyperts import make_experiment from hyperts.datasets import load_real_known_cause_dataset from sklearn.model_selection import train_test_split data = load_real_known_cause_dataset() ground_truth = data.pop('anomaly') detection_length = 15000 train_data, test_data = train_test_split(data, test_size=detection_length, shuffle=False) model = make_experiment(train_data.copy(), task='detection', mode='stats', reward_metric='f1', max_trials=30, timestamp='timestamp', early_stopping_rounds=10).run() X_test, _ = model.split_X_y(test_data.copy()) y_test = ground_truth.iloc[-detection_length:] y_pred = model.predict(X_test) y_proba = model.predict_proba(X_test) scores = model.evaluate(y_test, y_pred, y_proba=y_proba) model.plot(y_pred, actual=test_data, history=train_data, interactive=False)
输出:
模型的保存:
model.save(model_file="./xxx/xxx/models")
# 或者是
from hyperts.utils.models import load_model
pipeline_model = load_model(model_file="./xxx/xxx/models/dl_models")
模型的加载:
from hyperts.utils.models import load_model
pipeline_model = load_model(model_file="./xxx/xxx/models/dl_models")
HyperTS内置了三种运行模式:统计模型模式(‘stats’), 深度学习模式(‘dl’)以及神经架构搜索模式(‘nas’, 未开放),默认统计模型模式。
experiment = make_experiment(train_data,
mode='dl',
...)
当使用 make_experiment 创建实验时, 缺省情况下, 预测任务默认的模型评估指标是’mae’, 分类任务是’accuracy’, 回归任务默认是’rmse’。您可以通过参数 reward_metric 重新指定评估指标, 可以是’str’也可以是 sklearn.metrics 内置函数
目前, reward_metric 可以支持多种评估指标, 具体如下:
分类: accuracy, auc, f1, precision, recall, logloss。
预测及回归: mae, mse, rmse, mape, smape, msle, r2。
案例如下:
# str
experiment = make_experiment(train_data,
task='univariate-binaryclass',
reward_metric='auc',
...)
# sklearn.metrics
from sklearn.metrics import auc
experiment = make_experiment(train_data,
task='univariate-binaryclass',
reward_metric=auc,
...)
max_trials: 设置最大搜索次数。
early_stopping: 搜索限制
pos_label:二分类任务中指定正标签
eval_data: 指定验证数据
eval_size: 评估数据集的大小
freq:时序预测任务中, 可能没有规律性的时间频率, 即非连续采样时,设置freq=‘null’参数来告知模型。
timestamp: 在某些时序预测数据中, 可能没有存储时间列 timestamp, 即只包含目标列以及协变量列等特征。此时, 您可以通过设置参数 timestamp=‘null’
forecast_train_data_periods : 对于某些存在很长历史数据的时序预测任务, 使用全部数据建模, 历史数据可能不符合未来数据的序列特性而且也会增加模型的训练成本。此时, 您可以通过参数 forecast_train_data_periods 来从训练数据末端向前截取一定周期的数据进行训练
random_state: 固定随机种子,保证结果可以复现。
cv: 通过参数cv指定是否启用交叉验证,当cv设置为True时,表示开启交叉验证,折数可以通过参数num_folds设置。
log_level: 调整日志级别,例如’INFO’,则是将日志设置为信息级别。
模式:直接选择模型为stats,即使用统计模型来自行决策。
from hyperts.datasets import load_real_known_cause_dataset from hyperts.toolbox import temporal_train_test_split import pandas as pd import matplotlib.pyplot as plt from hyperts import make_experiment df = load_real_known_cause_dataset() ground_truth = df.pop('anomaly') # 用于生成训练集和测试数据,temporal_train_test_split是专门用于时间序列数据集的划分方法 # 其保留了时间序列数据的时间顺序。train_test_split() 是机器学习中常用的数据集划分方法, # 这个方法是随机地将数据集分成两个部分, train_data, test_data = temporal_train_test_split(df, test_horizon=15000) outliers = ground_truth.loc[ground_truth.values == 1] # 异常点的索引值保存在outliers_index outliers_index = list(outliers.index) # 使用matplotlib绘制出训练数据、测试数据和检测到的异常点 plt.figure(figsize=(16, 6)) plt.plot(pd.to_datetime(train_data['timestamp']), train_data['value'], c='gray', label='train data') plt.plot(pd.to_datetime(test_data['timestamp']), test_data['value'], c='red', label='test data') plt.scatter(pd.to_datetime(df.loc[outliers_index, 'timestamp']), df.loc[outliers_index, 'value'], c='purple', marker='x', label='anomaly') plt.legend() plt.show()
输出图形如下:左侧为训练数据,右侧为测试数据,紫色的点,为数据本身的异常点。
experiment = make_experiment( train_data=train_data.copy(), mode='stats', task='detection', timestamp='timestamp', # 参数搜索的最大次数为60次 max_trials=60, random_state=2022) model = experiment.run() # 获得最终模型的超参数 print(model.get_pipeline_params()) X_test, _ = model.split_X_y(test_data.copy()) y_pred = model.predict(X_test) # predict_proba:在测试集上进行预测的方法,返回的是两个类别的概率 y_proba = model.predict_proba(X_test) y_test = ground_truth.iloc[-15000:] scores = model.evaluate(y_true=y_test, y_pred=y_pred, y_proba=y_proba) model.plot(y_pred, actual=test_data, history=train_data, interactive=False)
输出模型超参数如下:
<bound method Pipeline.get_params of Pipeline(steps=[(‘data_preprocessing’,
TSAFDataPreprocessStep(covariate_cleaner=IdentityTransformer(),
ensemble_size=10, freq=‘5T’,
name=‘data_preprocessing’,
timestamp_col=[‘timestamp’])),
(‘estimator’,
TSGreedyEnsemble(weight=[1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], scores=[0.8282828282828283, 0.8282828282828283, 0.8282828282828283, 0.8282828282828283, 0.8282828282828283, 0.8282828282828283, 0.8282828282828283, 0.8282828282828283, 0.8282828282828283, 0.8282828282828283]))])>
输出异常点如下所示:
IsolationForest: 孤立森林(Isolation Forest) 是一种使用隔离的手段(某点到其他数据的距离)来做异常检测无监督算法, 而不是对正常点建模。
该方法由Fei Tony Liu 在其2007年的博士论文中提出,是其最初的研究思路之一。该研究的意义在于,它不同于当时大多数现有异常检测的主流哲学,即先分析所有的正常实例,然后将异常识别为不符合正常分布的实例。孤立森林引入了一种不同的方法,即使用二叉树显式的分离异常, 展示了一种更快的异常检测的新可能性,该检测器直接针对异常,而无需分析所有的正常的实例。该算法具有线性的时间复杂度,低内存需求,适用于大容量数据。
单类支持向量机(One-Class SVM) 是一种无监督的异常检测算法,它学习区分特定类的测试样本与其他类的能力。
One-Class SVM 是处理单类分类问题包括异常检测最常用的方法之一。One-Class SVM 的基本思想是最小化训练数据集中单类实例的超球,并将超球之外或者训练数据分布之外的所有其他样本视为异常值。
变分自动编码器 (Variational AutoEncoder, VAE) 是一种无监督的深度学习模型,可以对训练数据的分布进行建模。
它来自贝叶斯推理,由编码器、潜在分布和解码器组成。其原理是一个参数已知,特征可叠加的简单分布 (如高斯分布),结合神经网络,理论上可以拟合任意分布。VAE在做异常检测的思想也很简单,即找出重构误差大的样本点即为异常点。
案例代码如下:
import numpy as np import pandas as pd import matplotlib.pylab as plt from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split from hyperts.datasets import load_real_known_cause_dataset # 卷积变分自编码器(Convolutional Variational Autoencoder,ConvVAE)是一种深度学习模型, # 结合了卷积神经网络(Convolutional Neural Network,CNN)和变分自编码器(Variational Autoencoder, # VAE)的思想。它在处理具有时序特征的数据(例如时间序列数据)时非常有用,可以用于特征提取、重构和异常检测等任务。 # ConvVAE类提供了构建和训练ConvVAE模型所需的功能和方法。通过使用该类,可以方便地定义和训练ConvVAE模型,并应用于各种任务,如异常检测、数据生成等。 from hyperts.framework.dl.models import ConvVAE data = load_real_known_cause_dataset() target = data.pop('anomaly') # 将timestamp列转换为日期时间格式。 data['timestamp'] = pd.to_datetime(data['timestamp']) detect_length = 15000 # 测试长度设置为15000,shuffle设置为False,即不打乱数据 train_data, test_data = train_test_split(data, test_size=detect_length, shuffle=False) train_X = train_data[['timestamp']] train_y = train_data[['value']] sc = StandardScaler() # 对目标值进行标准化处理 train_y['value'] = sc.fit_transform(train_y['value'].values.reshape(-1, 1)) # task='univariate-detection':指定模型的任务类型为单变量异常检测。 # timestamp='timestamp':指定输入数据中时间戳的列名。 # conv_type='separable':指定卷积类型为可分离卷积。 # window=24:指定滑动窗口的大小,用于提取时间序列特征。 # latent_dim=4:指定潜在空间的维度,即自编码器中编码器输出的维度。 # cnn_filters=64:指定卷积层的滤波器数量。 # learning_rate=0.0005:指定模型的学习率。 # drop_rate=0.2:指定Dropout层的丢弃率。 # nb_layers=3:指定卷积层的数量。 # kernel_size=1:指定卷积核的大小。 # out_activation='linear':指定模型输出层的激活函数为线性函数。 vae = ConvVAE(task='univariate-detection', timestamp='timestamp', conv_type='separable', window=24, latent_dim=4, cnn_filters=64, learning_rate=0.0005, drop_rate=0.2, nb_layers=3, kernel_size=1, out_activation='linear') # vae.fit(X=train_X, y=train_y, epochs=100) train_labels = vae.labels_ # 得出训练数据的异常样本 train_outliers = np.where(train_labels == 1)[0].tolist() # 对测试数据进行异常检测并且获取到异常样本 test_data = test_data.reset_index(drop=True) test_X = test_data[['timestamp']] test_y = test_data[['value']] # 测试集的标准化处理 test_y['value'] = sc.transform(test_y['value'].values.reshape(-1, 1)) test_labels = vae.predict_outliers(X=test_X, y=test_y) test_outliers = np.where(test_labels == 1)[0].tolist() # 图形绘制 plt.figure(figsize=(16, 6)) plt.plot(data['timestamp'], data['value'], c='gray') plt.scatter(train_data.loc[train_outliers, 'timestamp'], train_data.loc[train_outliers, 'value'], c='r', label='train anomaly') plt.scatter(test_data.loc[test_outliers, 'timestamp'], test_data.loc[test_outliers, 'value'], c='b', label='test anomaly') plt.legend() plt.show()
输出如下所示:
参考文章:
HyperTS官方文档.
github.
API.
案例分析.
深度学习调参tricks总结.
明天是端午节啦~ 想她
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。