2020年4月29日

Thingworx Analytics介绍之三:Time Series Data建模预测



PTC的专家说,在TTF预测方面,Time Series Data模型要比标准的模型要好。
我在做Demo的过程中,也曾尝试建立Time Series Data模型,但是碰到很多坑,因此在前两篇文章中只介绍标准模型。
后来我有了PTC服务帐号,用此帐号看到了一些新的文档,才走通了这条路。

首先介绍一下什么是Time Series Data模型。
就机器学习的概念来说,训练模型的过程就是找到最合适的匹配参数,利用这些参数和变量相结合,从而计算得到输出结果。
标准的模型在训练和计算的时候,各变量的当前值和历史值没有相关性。
而对于Time Series Data模型,计算时不仅要看变量的当前值,还要看若干个历史值,而这些值是时间相关的。
Thingworx Analytics中,有两个重要的概念:look back sizedata sampling frequency
Look back size就是采样步长,data sampling frequency就是采样频率,两者乘积就是采样区间。
比如look back size=4, data sampling frequency=1 minute,那总采样区间就是4分钟。
Thingworx利用Value Stream记录time series data,我们可以利用QueryProperyHistory得到变量在采样区间的历史值:


此外,在建模的时候,还有几个参数要注意:
-       useRedundancyFilter=true
-       useGoalHistory=false
-       lookahead=1
训练时间会比标准模型长很多。

模型发布之后,测试时不仅要输入各变量的当前值,还要输入若干个历史值,然后点击Add Row
在创建Analyisi Events时,注意Inputs Mapping各参数对应的Thing Property必须Logged,因为只有Logged记录才能通过Value Stream查询历史值。
此外,Results Mapping如果绑定结果到Thing Property,即使此Property已经设置Logged,结果被Analytics更新时也不会记录到Value Stream。解决办法是另建一个Property,把它绑定到Results Mapping,然后通过ServiceSubscription把值同步给最终的Property,并将值记录在Value Stream。经过此处理后,预测值的所有历史记录就可以通过timeserieschart展示了。

下图是采用Time Series Data建模的预测结果和实际结果的对比:


我们可以看出,预测更加精确,并且更快地拟合。

下表是各模型的建模参数:


此外,关于Value Stream写入时事务性的保证,我也找到了解决办法:使用UpdatePropertyValues函数。
下面是参考代码:
----------------------------------------------------------------------
// Use UpdatePropertyValues to make sure to update all attribute in the same moment

var params = {
    infoTableName : "InfoTable",
    dataShapeName : "NamedVTQ"
};

// CreateInfoTableFromDataShape(infoTableName:STRING("InfoTable"), dataShapeName:STRING):INFOTABLE(VSTestDataShape)
var tempDable = Resources["InfoTableFunctions"].CreateInfoTableFromDataShape(params);

var time = new Date();
tempDable.AddRow({
       time: time,
    name: "F1",
    quality: "GOOD",
    value: 71
});

tempDable.AddRow({
       time: time,
    name: "F2",
    quality: "GOOD",
    value: 72
});

tempDable.AddRow({
       time: time,
    name: "F3",
    quality: "GOOD",
    value: 73
});

tempDable.AddRow({
       time: time,
    name: "F4",
    quality: "GOOD",
    value: 74
});

tempDable.AddRow({
       time: time,
    name: "F5",
    quality: "GOOD",
    value: 75
});

me.UpdatePropertyValues({
       values: tempDable /* INFOTABLE */
});

var result = tempDable;
----------------------------------------------------------------------



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数量。



2020年4月16日

Thingworx Analytics介绍之一:Analytics功能及模块


最近花了不少时间学习Thingworx Analytics,踩了很多坑,也积累了一些心得,特撰文记录。
本文是第一篇,介绍Analytics的功能和模块。
第二篇文章将以实例说明怎样通过Analytics预测机器失效时间(Time to Failure)
2015年,PTC收购了机器学习公司ColdLight,将其产品整合进Thingworx,并命名为Thingworx Analytics

首先我们看看此产品有哪些功能。
PTC Thingworx Analytics帮助文档列出了这些功能:
• Explanatory Analytics: 解释型分析,比如甄别信号(Signal)是否有价值。
• Descriptive Analytics:描述型分析,如平均值、中值、标准偏差等的计算。
• Model Generation:预测型模型的建模和学习,包含了几个流行的机器学习算法。
• Predictive Scoring:预测计分,根据学习好的模型和新的参数值,以预测结果。
• Prescriptive Scoring:权重计分,调整模型参数的权重以修改分值。
• Confidence Models:信心模型,将预测值转换成定义区间的概率。
• Anomaly Detection:异常检测,比较信号的上下界,以过滤出异常信号。
• Time Series Predictions:时间序列模型的预测。有些信号是与其时间序列相关的,每次在预测时,除了检查当前值,还会分析之前的若干时间序列的参数值。但是我发现8.5版本此功能有BUG,因为Analytics是根据参数在ValueStream中记录的值来进行分析的,但是如果一个模型有多个参数且记录在同一个ValueStream的话,数据在更新时,ValueStream无法保证这些值在同一条记录中被更新。
• Learners and Ensemble Techniques:机器学习算法及混合方法。

Analytics内置了以下机器学习算法:
• Linear Regression
• Logistic Regression
• Decision Tree
• Neural Network
• Random Forest
• Gradient Boost

下面我们再来看一下Analytics组成模块。
Analytics3个安装模块:Analytics ServerAnalytics PlatformAnalytics Client(extension)
Analytics Server是独立与Thingworx Plantform的模块,但是有部分组件也会安装进Thingworx
Analytics Server安装完成以后,会在操作系统中增加以下Service
twas-analytics-worker-1
twas-analytics-worker-2
twas-analytics-worker-3
twas-async-ms
twas-sync-ms
twas-twx-adapter
twas-zookeeper
并且在Thingworx中增加以下对象:
StatisticalCalculationMicroserver,提供了多个SPC计算的Service
StatisticalMonitoringMicroserver,提供了多个SPC数据分布分析的Service
多个名称包含AnalyticsServerThing,可以在Monitoring >> Remote Things看到,提供了Thingworx Server API
前缀为TW.AnalysisServices的多个DataTable,是配置Analytics的数据库。
前缀为TW.AnalysisServices的多个Resource,对应于Analytics Builder的一些功能,如TW.AnalysisServices.AnalysisHelperFunctions可用于Job的统计、删除等。

Analytics Platform是一个独立模块,不安装也不影响学习及预测,我估计是用于分布式运算、异步运算等。
Analytics Client可以单独作为extension安装,安装以后在Thingworx中会增加一个Analytics图标,提供了一个Analytics模块的前台界面。
Analytics模块的菜单分为BuilderManager两个,其中Builder主要用于建模,Manager用于后台自动处理。
具体操作我会在第二篇中说明。