2020年4月17日

Thingworx Analytics介绍之二:TTF预测实操


本文介绍一个IoT领域较为关注的应用:机器失效时间(Time To Failure)预测。
系统环境:Thingworx Platform 8.5Analytics Server 8.5Analytics Extension 8.5

1步,配置Analytics参数。
点击Analytics图标>>Analytics Manager>>Analysis Providers,新建一个Analysis ProviderConnector类型为TW.AnalysisServices.AnalyticsServer.AnalyticsServerConnector
点击Analytics Builder>>Setting,设置Analytics Server

2步,创建分析数据。
首先要准备好CSV格式的数据文件和JSON格式的数据类型说明文件。
CSV文件的第一行是表头,应该和JSON文件保持一致。
JSON文件结构可参考:
---------------------------------------------------
[
       {
              "fieldName": "s2",
              "values": null,
              "range": null,
              "dataType": "DOUBLE",
              "opType": "CONTINUOUS",
              "timeSamplingInterval": null,
              "isStatic": false
       },
       {
              "fieldName": "s3",
              "values": null,
              "range": null,
              "dataType": "DOUBLE",
              "opType": "CONTINUOUS",
              "timeSamplingInterval": null,
              "isStatic": false
       }
]
---------------------------------------------------
CSV文件已包含以下信息:
1)     用于判定结果的字段(goalField)
2)     关键参数字段。
3)     用于过滤数据的字段,如建立一个字段record_purpose,部分数据值为training,部分数据值为scoring,前者用于训练模型,后者用于分析模型的准确性。
4)    如果是time series data,还要建立两个字段,分别表示训练次数和训练内周期。
按照原理来说,机器TTFtime series建模更为合适,但是由于Thingworx本身机制的原因(利用Value Stream存储time series data,但是无法保证事务性),本人实测在8.5试用版无法适用,因此本文不采用time series
本文采用了一个NASA的公开数据集进行训练,下载地址:
https://c3.nasa.gov/dashlink/resources/139/
数据准备好以后,点击Analytics Builder>>Data>>New..
选择CSV文件和JSON文件,然后在“Review uploaded metadata”,以便再次核对数据类型。
一般的参数字段类型为Continuous,结果字段是ContinuousBoolean,本例中为Continuous
用于筛选的字段,其类型为Informational
点击Create Dataset
创建成功后,新建Data会显示在Datasets列表中。
选择新建的Dataset>>View>>Filters>>New,可创建过滤器。

3步,创建机器学习模型。
点击Analytics Builder>>Models>>New
选择Dataset,然后选择结果字段和过滤器,此外还可以选择排除字段,以减少干扰提高效率:


点击Advanced Model Configuration,可配置高级参数:


在机器学习中,通常我们将数据按用途分成训练集、验证集、测试集3大部分,比例可设置为60%20%20%
在此步骤,我们可利用过滤器排除测试用数据,然后可用Validation Holdout %来定义验证数据比例,默认为20%
Learning Techniques包含了可用的机器学习算法,我们还可以手动添加算法及修改参数。
我的建议是用多种算法各训练一遍,然后用测试数据来分析各算法的匹配度。
同一种算法还可以利用不同的参数进行多次训练。
Ensemble Technique是多种算法的混合方式,也可以用多种方式进行尝试。
我的训练方法:


 其实机器学习工程师或者所谓数据科学家的工作,很大一部分就在于:选择算法、调整参数、分析结果。
点击Submit就可以创建模型。
通常小型的数据集,训练时间比较短,但是time series data训练时间会长得多,此外数据集数据量越大则训练时间越长。
成功后在Analytics Builder>>Models可以看到新建的模型。
选中模型后点击Publish,成功后可以在Analytics Manager>>Analytics Models看到此模型,并自动进入测试页面。

4步,模型初步测试。
模型在创建时会自动进入测试页面,我们也可以Analytics Manager>>Analysis Models选中模型后,点击View>>Test进入测试页面:


causalTechnique一般设为FULL_RANGE
goalField即用于判定结果的字段。
然后输入各参数的值,之后点击Add Row。如果是time series data,则要输入多个值。
选择第一行数据,点击Set Parent Row,然后点击Submit Job
系统会根据输入数据,结合算法模型,计算得到结果。
约数秒后,可得到结果。
在下方的Results Data Shape中,选择AnalyticsServerConnector.xxx,点击Refresh Job,可以看到结果。
此项计算的更多信息可以在Analysis Jobs中查看。

5步,设置模型自动计算。
模型建立以后,我们可能还会继续观察一段时间,用预测结果比较实际值,从而对模型的准确度有更深入的认识。
以本文的NASA数据集为例,我们可利用其部分数据进行比较,具体如下。
首先建立一个DataTable,把CSV中的数据导入。
然后建立一个Thing,把各参数值作为Property进行更新。
然后建立一个Timer,把测试数据定期读入数据,用这些值进行测试。
点击Analytics Manager>>Analysis Models,把新建的Model Enable
点击Analysis Events>>NewSource Type=ThingSource为新建的ThingEvent=DataChageProperty设置为触发字段。
保存后在Analysis Events中选择新建的Event,点击Map Data>>Inputs MappingSource Type=Thing,把模型的参数与Thing Property进行绑定。
Tips:模型的参数以_开头,此外还有causalTechniquegoalField,如果我们在Thing中定义了这些参数,则可以在此步骤中使用Map All,则系统会自动映射名称匹配的参数。
然后点击Results Mapping,把测试结果和Thing Property绑定。此处需注意,由系统算法计算得到的值会得到更新,但是不会记录到Value Stream中,所以我们必须另建一个Property,通过Service把结果同步过来。
配置好Event后,系统会自动监控触发条件,一旦符合则调用Analytics API自动计算得到结果,然后予以输出。
手动测试的结果和Event的结果都可以在Analysis Jobs中查看。

下图是我做TTF Demo Mashup界面:


下图是不同模型的分析对比:


下图罗列几个坑点和注意事项:
1)    由于time series data采用Value Stream记录历史值,而Value Stream无法保证多个Property同时更新时的事务性,因此不能利用Event来进行实时预测。
2)    由于Analytics采用同步执行,如果要进行多个模型的对比分析,在设置Event的触发条件时,务必要保证多个Event不能在同一个时间点发生,不然会有大量的WAITING JOB。我的办法是,复制得到多个触发字段,然后用PAUSE指令进行延时。
3)    如果原始数据有多个参数,可先建一个小模型,只选用2个字段,然后进行训练、测试,用此模型发现建模中的问题,优化Data TableThingTimer的逻辑,没有问题后再将模型扩展到更多字段,这样会顺利很多。
4)    慎用Timer,操作不慎会导致Value Stream数据大量增加,或者产生大量WAITING JOBWAITING JOB太多会堵塞分析和预测。可以通过Resource TW.AnalysisServices.JobManagementServicesAPI.DeleteJobs强制删除Jobs,可以通过Data Table TW.AnalysisServices.AnalysisDataTable.GetDataTableEntryCounts查看Job数量。



没有评论: