Predix平台上通过分类器实现时间序列的实时异常检测

Author: Alex Zhang,Data Scientist,GE Digital

内容简介
    本文提供了在Predix上进行数据分析的实例 。该实例 通过AnalyticFramework定时调用分类器对Timeseris 数据库中的数据进行实时读取、分析,并将结果写回Timeseries中存储。若读者已经注册Predix帐号,可根据本文中的操作步骤表进行实际操作。
主要步骤:

1.   数据准备:训练数据的准备;测试数据导入到Timeseries;
2.   建立分类器用于Anomaly Detection(以Python为例);
3.   将分类器和在线分类打包上传到Analytic catalog;
4.   在Analytic Framework上配置Analytic的输入输出;
5.   用Analytic Framework的jobscheduler实时调用分类算法并将结果写回Timeseries。 

1.  数据准备
    通过随机数发生器产生一段随机数,以10000个点为例,并在此基础上做基于移动平均的平滑,以窗口大小为100为例,可以产生一段数据。并在随机的时间点产生幅度较大的随机数,如下图中的红点所示。在我们的例子中,我们将分类黑线中的sample,并通过一个分类器来判断其是否为异常点(即红点)。

    在我们的例子中,我们将黑线数据分成长度相等的两部份,一部份用于分类器的训练,另一部份用于仿真实时数据的得到和分类。我们将每二部份数据导入到预先建好的时间序列数据库中,每五秒钟存一个数据点。过程请参考:http://blog.csdn.net/predixcn/article/details/70227396

2.  训练分类器
    在这一步,我们要训练一个分类器来判断黑线中的样本点是否为异常数据。在此,我们用sklearn.discriminant_analysis中的QuadraticDiscriminantAnalysis方法,即QuadraticDiscriminant Analysis方法。该方法假设每一类数据均符合高斯分布,每个类所属高斯函数有不同的协方差矩阵。我们将训练中的正常数据标为0,异常数据标为1,并对分类器进行训练:

qda =QuadraticDiscriminantAnalysis(store_covariances=False, priors=(0.9, 0.1))
qda.fit(X, label)

    其中X为黑线的sample数据,label为类标,即0或1。由于数据中大部份为正常数据,所以我们可以调整先验概率大部份为正常样本(0.9)。之 后,我们将模型序列化并存储:

output = open('qda.pkl', 'wb')
pickle.dump(qda, output)
output.close()

    实时处理时,我们导入刚刚得到的模型,对实时得到的数据进行分类并得到结果:

model_file = open('/home/vcap/app/analytics/qda.pkl', 'r')
qda = pickle.load(model_file)
model_file.close()
y_pred = qda.predict(X)

    此例子相关的Python代码会用于下一步Analytic中相关的操作。该例子中包含两个函数:tsAnomalyDetection和ts_training。其中ts_training为模型训练,即在本地进行操作并产生模型文件。tsAnomalyDetection为实时分类函数,是在Predix上分析的入口函数。

3.  建立Analytic并上传Python代码

    此步骤的目标为在Predix平台上建立Analytic并上传刚刚编写的Python代码以及相关的template文件。请参考predix-io官网上的documentation作进一步了解,此处为本任务所涉及的步骤:

a.   订阅analytics framework服务;
b.   建立一个分析(Create Analytic);
c.   建立一个分析所属物件(Create Artifact),定义为executable类型,将python分析代码打包导入此物件(实际例子请参考最后的下载);
d.   建立另一个分析所属物件(Create Artifact),定义为template类型,将定义输入输出的template文件导入此物件(实际例子请参考最后的下载);
e.   得到分析中的所有物件(Retrieve Artifacts for Analytic);
f.   验证分析(Validate Analytic),并得到验证ID;
g.   等待一段时间,并进行得到验证状态操作(Retrieve Validation Status),如果得到的结果和离线测试的结果一致,说明此分析已经可以用于调用。

    以上步骤的具体操作可用postman进行操作,具体的API请参考官方文档:https://docs.predix.io/en-US/content/service/analytics_services/analytics_framework。此步中所涉及的template文件描述了此Analytic所对应的输入输出,该文件为json格式,有关相关的内容如下:

"columns":[
{
"portName": "feature",
"portType": "FIELD",
"variable": false,
"dataType":"DOUBLE_ARRAY",
"required": true

}]

    此部份定义了输入的变量名为feature。

"columns":[
{
"portName": "detect_res0",
"portType": "FIELD",
"variable": false,
"dataType":"DOUBLE_ARRAY",
"required": true
}]

    此部份定义了输出的变量名为detect_res0。文件的整体内容和格式请下载template.json实例并阅读。
4.  配置­­Orchestration
    此步骤目标为在Predix平台上配置可作实时调用的Orchestration Configuration,并将刚刚建立的Analytic包含在其中,以作最后的实时调用。Orchestration Configuration主要用于组合并实施单个或多个Analytic。本文仅涉及单个Analytic,若读者想进一步了解,请参考predix-io上的官方文档。本任务所涉及的步骤如下:

a.   建立一个Orchestration配置(CreateOrchestration Configuration);
b.   建立一个Orchestration物件(CreateOrchestration Artifact),并指定为bpmn文件,其中定义了所需要调用的分析;
c.   建立另一个Orchestration物件(CreateOrchestration Artiface),并指定为portToFieldMap,该文件定义了各Analytic间连接的输入输出;
d.   得到Orchestration中的所有物件(Get Artifact Metadata for an OrchestrationConfiguration),如果两个物件都已经存在,可进行下一步操作;
e.   运行并验证Orchestration(Run Orchestration (sync) (v2)),如果得到的结果和离线测试的结果一致,说明此Orchestration已经可用于调用。

    操作时需注意b步中所涉及的portToFieldMap文件描述了此Analytic所对应的输入输出,c步中的bpmn文件描述了需要调用的Analytic。第e步运行Orchestration(RunOrchestration (Async) (v2))时需要提供以下信息作业Body信息:

{

  "orchestrationConfigurationId": "d1b8678a-0bec-42b2-8626-18c51cc09562",
  "assetDataFieldsMap": {
      "inputOfDetection0": "ts_detection0001",
      "outputOfDetection0": "ts_detection_result0001"
    }
}

    其中inputOfDetection0为portToFieldMap中所定义的输入名称,outputOfDetection0为portToFieldMap中所定义的输出名称,ts_detection0001和ts_detection_result0001为Timeseries中对应的tag name。请在本文最后下载实际例子。以上步骤的具体操作可用postman进行操作,具体的API请参考官方文档:https://docs.predix.io/en-US/content/service/analytics_services/analytics_framework
5.  实时调用算法
    此步骤的目标为用Analytic Framework中的SchedulerService来定时调用前几步所建立的Orchestration。所涉及的步骤如下:

a.   建立任务(Create Job)并记录JobID;
b.   通过Job ID得到任务的历史记录(GetJob History By Job ID)。

    在进行a步时,Body的inputData中填入配置Orchestration时第e步所提供的信息,并编辑Analytic Framework的Predix-Zone-ID和所需的调用频率。本文提供的例子为每五秒调用一次,以达到实时处理的目的(实时数据导入亦为5秒一个数据样本)。在Job建立以后,读者可以通过b步聚来观察结果,或通过Timeseries的Query服务得到分析的结果。
6.  下载链接 
https://github.com/alexwillzhj/Predix-Anomaly-Detection-Classifier-Template

----------

在使用中您有任何问题,请访问我们的论坛http://bbs.csdn.net/forums/GEPredix 
GE数字集团的技术专家们会在线回答您的问题。
也请访问我们在CSDN的Predix专区http://predix.csdn.net 了解更多Predix的内容和相关活动。


展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读