精华内容
下载资源
问答
  • 预测性维护是一个综合性的概念,它包括但不限于:故障预测,故障诊断(根因分析),故障探测,故障分类,故障发生前的缓解建议,故障发生后的维护行动。 预测性维护重点关注:预测长期运行的机...

    微软 Azure AI Gallery

    1. 简介

    预测性维护是一个综合性的概念,它包括但不限于:故障预测,故障诊断(根因分析),故障探测,故障分类,故障发生前的缓解建议,故障发生后的维护行动。

    预测性维护重点关注:预测长期运行的机器何时会发生故障的技术。这项技术通过学习大量与机器运行状态相关的先验知识,生成预测模型。该模型输入机器的实时运行状态数据,输出机器故障发生时间点或故障维护建议,从而实现设备故障时间的预判,并提前执行维护工作,降低维护成本。

    本预测性维护案例致力于解决三大类问题:

    1. 回归问题:预测剩余使用寿命(RUL, Remaining Useful Life),失效时间(TTF,Time to Failure);
    2. 二分类问题:预测在某一特定时间段内,设备是否会故障;
    3. 多分类问题:预测在多个不同时间段内,设备是否会发生故障

    注:上述问题的时间单位可以按工时,周期,里程碑,事物发展等具体业务场景来确定。

    本预测性维护模型基于虚拟飞机引擎的运行-故障事件记录构建。进行设备故障预测性维护前提:设备工作时满足渐进老化至故障的规律,该规律反映在设备的传感器测量中。 通过检查设备传感器的时序采样值,机器学习算法可以学习传感器采集值和变化值,及其相对于历史故障值之间的关系,来预测未来的故障。 具体过程设计以下三个步骤:

    1. 数据准备和特征工程

    2. 训练和评估下面三种模型

      • 回归模型
      • 二分类模型
      • 多分类模型
    3. 使用上述三种模型部署web服务器

    2. 数据准备与特征工程

    2.1 数据准备

    数据集

    • 训练数据:飞机引擎从正常运行到出故障的完整运行状态数据的时序记录;
    • 测试数据:飞机引擎还未发生故障的运行状态数据的时序记录;
    • 验证数据:测试数据的后半段运行数据(发生故障的时间点标识)。

    数据采集

    • 训练数据:按一定周期采集,确保第一个周期采集的数据为设备正常运行数据,最后一个周期采集的数据为设备异常运行数据(超过正常门限值),即训练数据集涵盖设备由正常到故障的整个过程。
    • 测试数据:和训练数据类似,但是最后一个周期采集的数据并不是异常运行数据点,此时设备运行正常,但是不知道到底要经过多少个周期,才能遇到故障点。
    • 验证数据:直接给出每个测试设备之后发生异常时的采集周期值。

    数据标签

    • 回归模型:目前这个正常运行的设备还需要多少个周期才会发生故障。
    • 二分类模型:设备是否会在未来某个时间点发生故障
    • 多分类模型:15天故障预警,30天故障预警,,,,即判断未来不同时间点是否会发生故障。
      数据标签

    2.2 特征工程

    特征数据的来源:

    • 原始特征:从原始的采集数据中挑选合适的特征,这个过程需要丰富的专业领域知识。
    • 聚合特征:总结历史数据集,经过算法运算处理,转换为新的特征。(一段时间内采集数据的平均值或方差,采集值变动的范围,采集值相对于初始值的差值,采集值变化的速率,超过安全阈值的特征点个数)

    经验提示:时变特征的提取,注意采集时间的粒度(例如某个故障每两个月发生一次,采样周期按天和周计比按秒计效果会更好,从另一方面改善了正常运行数据和故障数据的分布不平衡性问题)

    3. 模型训练与评估

    第一章节讲过预测性维护模型按使用场景划分,主要涉及三大类:回归模型,二分类模型,多分类模型。尽管三者的训练与评估方法各不相同(后文会依次展开),但是他们依然有一些共同之处,说明如下:

    • 享有共同的训练测试数据集和流程
    • 享有共同的特征工程来挑选特征

    3.1 回归模型

    3.2 二分类模型

    3.3 多分类模型

    展开全文
  • 学习预测性维护系统(PMS),监控未来的系统故障并提前安排维护时间表探讨如何构建机器学习模型进行系统的预测性维护了解机器学习的处理步骤,如选择模型以及用Auto-Encoder技术去除传感器噪声了解如何训练机器学习...

    本文要点:

    • 学习预测性维护系统(PMS),监控未来的系统故障并提前安排维护时间表
    • 探讨如何构建机器学习模型进行系统的预测性维护
    • 了解机器学习的处理步骤,如选择模型以及用Auto-Encoder技术去除传感器噪声
    • 了解如何训练机器学习模型,并在WSO2复杂事件处理器产品中运行模型
    • 应用例子,在NASA引擎故障数据集上用回归模型来预测剩余使用寿命(RUL)

    在日常生活中,我们依赖于很多系统和机器。我们要开车出门、乘坐电梯或者搭乘飞机。涡轮能产生电,医院里的机器能让我们活着。这些系统会发生故障。有些故障只是给人的生活带来不方便,而有些故障则生死攸关。

    当风险很高的时候,我们要对系统进行常规性维护。譬如,车每几个月保养一次,飞机每天保养一次。但是,如同我们在此文后面所讨论的那样,这些方法导致资源的浪费。

    预测性维护能预测故障,采取行动来维修、更换系统,甚至计划何时出现故障。它能极大地节省开销、带来高的可预测性和增强系统的可用性。

    预测性维护有两种形式来节省开销:

    • 避免或最小化故障停机时间。它会避免出现对故障停机不满意的客户,省钱,有时候还能挽救生命。
    • 优化周期性的维护操作。

    为了了解这些,我们来看看出租车公司。如果一辆出租车坏了,该公司需要安慰不满意的顾客并派出替换的车辆,而该出租车和司机在维修期间都将闲着。故障的代价要远高于表面上的代价。

    解决这个问题的一种方法是,做一个消极者,在出现故障之前就更换不可靠的组件。譬如,进行常规的维护操作,如更换机油或轮胎。尽管常规维护比出现故障好,但是我们会在系统真正需要维护之前就进行维护。因此,这不是一个最佳的解决办法。比如,每跑3000英里就换一次机油,不一定能有效地使用机油。如果我们能更准确地预测故障,那么该出租车可以跑几百英里而不用换油。

    预测性维护避免了两种极端,最大化地利用资源。它将检测异常和故障模式,早早地给出警报。这些警报能促使人们更有效地维护这些组件。

    在这篇文章中,我们将探讨如何构建一个用于预测性维护的机器学习模型。下一章节讨论机器学习技术,随后讨论例子中的NASA数据集。第四和第五章节讨论如何训练机器学习模型。“用WSO2 CEP运行模型”这一章节涵盖了如何将模型应用于实际数据流上。

    用于预测性维护的机器学习技术

    为了进行预测性维护,首先,我们向系统中加入了传感器,用于监控和收集系统运行的数据。预测性维护所需要的数据是时间序列数据。数据包括时间戳、在该时间戳所收集的传感器读数以及设备号。预测性维护的目的是,在时间“t”,使用截至到该时间的数据来预测设备在近期是否会发生故障。

    预测性维护可通过以下两种方法之一来实现:

    • 分类方法 – 预测在接下来的n步中是否有可能发生故障。
    • 回归方法 – 预测在下次故障发生之前的剩余时间。我们称之为剩余使用寿命(RUL)。

    前一种方法只能提供一个由布尔值表示的答案,但是能从很少的数据上获得很高的准确率。后一种方法可以提供关于故障发生时间的更多的信息,但也需要更多的数据。我们将在NASA引擎故障数据集上尝试这两种方法。

    Turbofan引擎退化数据集

    Turbofan引擎是一种现代的汽油涡轮引擎,NASA空间探索局用的就是这种引擎。NASA生成了下面的数据集来预测Turbofan引擎运行一段时间后的故障。可以从PCoE数据集获得该数据集。

    数据集包括每个引擎的时间序列。所有的引擎都是同一类型,但在制造过程中,每个引擎的初期的磨损程度和差异是不同的,这一点用户是不知道的。有三种可选的配置,可用于改变每个引擎的性能。每个引擎有21个传感器,当引擎运行时,传感器收集与引擎状态相关的测量数据。收集到的数据中有一些传感器噪声。

    逐渐地,每个引擎会有一些不足,这些可以从传感器读数中发现。时间序列在发生故障前的某个时间结束。数据包括引擎单元号、时间戳、三种配置以及21个传感器读取的数据。

    下面图1和图2显示了数据的子集。

    大数据

    图1:数据子集

    大数据

    图2:数据子集的前几列

    该实验的目的是预测下一次故障发生的时间。

    用回归来预测剩余使用寿命(RUL)

    预测RUL的目标是减小实际RUL值与预测RUL值之间的误差。我们用均方根误差作为衡量值,因为它会严厉地惩罚大的误差,迫使算法预测结果接近实际RUL。

    大数据

    第一阶段:下面的管道描述了预测过程。作为第一个阶段,我们运行管道中的几个突出的步骤,大致了解下可行性。我们没有运行特征工程,而是在原始数据上运行算法。

    第1阶段:选择模型

    下面的图3显示了预测性维护的模型选择管道。这里只用到了深颜色的管道步骤。

    大数据

    图3:用于模型选择的预测性维护管道

    我们用到了scikit learn和H2O中的很多回归算法。关于深度学习,我们用到了H2O中的深度学习算法,它既可以用于分类应用,也可以用于回归应用。该算法基于多层结构的前馈神经网络,用后向传播的随机梯度下降法来训练神经网络。

    下面图4显示了结果。模型可以产生25-35的均方根误差,也就是说,RUL将有约25-35时间步长的误差。

    大数据

    图4:模型选择的均方根误差

    下面的几个步骤,我们将集中在深度学习模型上。

    第2阶段:用Auto-Encoder去除传感器噪声

    下图5显示了带去噪功能的预测性维护管道。这里只用到了深颜色的管道步骤。

    大数据

    图5:用于模型选择的预测性维护管道

    一般而言,传感器读数含有噪声。软件中自带的ReadMe文件证实了这一点。因此,我们用autoencoder来去除噪声。Autoencoder是一种简单的神经网络,它用同一个数据集作为网络的输入和输出来训练模型,网络的参数个数少于数据集的维度。这与主成分分析(PCA)(http://setosa.io/ev/principal-component-analysis/)非常类似,在PCA中,数据被表示为它的几个主要维度。由于噪声的维度要远高于常规数据,该过程能降低噪声。

    我们用到了有三个隐藏层的H2O Auto-encoder和下面的标准来去除噪声。

    去除噪声后,均方根误差降低了2。

    大数据

    表1:去除噪声前后的均方根误差

    第3阶段:特征工程

    下面的图6显示了预测性维护的特征工程管道。这里只用到了深颜色的步骤。

    大数据

    图6:用于模型选择的预测性维护管道

    在这一步,我们尝试了很多特征,保留了最有预测能力的特征子集。我们用到的数据集是时间序列数据集,因此传感器读数是自相关的。因此,在时间“t”时的预测很有可能受到“t”之前的某些时间窗的影响。我们用到的大多数特征都是基于这些时间窗的。

    在第三章节中,我们讨论了数据集含有21个传感器的读数。更多的细节信息可参看与数据集一起提供的ReadMe文件。经过一些实验之后,我们只用到了传感器2、3、4、6、7、8、9、11、12、13、14、15、17、20和21。对于每一个被选中的传感器,我们通过运用以下方法来生成特征:滑动标准差(窗口大小是5)、滑动k-最近平均值(窗口大小是5)以及窗口内的概率分布(窗口大小是10)。

    我们试过其他某些特征但最终没有使用它们,包括:滑动平均值、自相关、直方图、滑动熵和滑动加权平均值。

    这些特征使得均方根误差降低了1。

    大数据

    表2:特征选择前后的均方根误差

    第4阶段:用网格搜索来优化超参数

    图7显示了带超参数优化的预测性维护管道。这里只用到了深颜色的管道步骤。

    大数据

    图7:用于模型选择的预测性维护管道

    超参数控制算法的行为特点。在最后一步,我们优化了如下的超参数:迭代次数、分布、激活函数以及隐藏层的个数。每个参数的详细描述可以参看H2O文档。我们用网格搜索找到最好的参数,结果如下表所示。

    大数据

    Table 3:不同超参数下的均方根误差

    如结果所描述的,超参数优化将均方根误差减小了3。在剩余误差直方图(图8)中,可以看见误差收敛到“0”。过早预测和过迟预测的频率都被最小化了。

    大数据

    图8:用于模型选择的预测性维护管道

    构建模型来预测后N步的故障

    在这个方法中,我们将预测某机器是否会在接下来的30次循环中发生故障,而不是预测它的剩余寿命长短。我们将有故障的状态看作正面的(P),没有故障的状态看作正常的(N)。我们运行一个深度学习分类模型,用到了同样的特征工程和去噪过程。图9给出了结果。

    混淆矩阵

    大数据

    图9:用于模型选择的预测性维护管道

    准确率(accuracy)描述了有多大比列的测试数据被正确地预测了。它给出了准确预测的测试案例的个数与测试案例总个数的比列。

    大数据

    如果类的分布不均衡,那么仅仅考虑准确率会误导人。在数据集中,当同一个类被过分表示时,就会出现不均衡的类分布。这种情况下,有些模型可能有很高的准确率但很差的预测性能。

    为了避免这个问题,我们用查准率(precision)和查全率(recall)作为衡量标准。查全率是被正确预测的正面类的个数与所有实际为正面类的数据的个数的比例。

    大数据

    查准率被定义为一个模型能预测正面类的能力。它是被正确预测的正面类的个数与所有被预测为正面类的数据的个数的比列。

    大数据

    F1分数用于衡量测试的准确率。查准率和查全率都被用于该分数的计算中。

    大数据

    关于准确率、查全率、查准率和F1分数,最好是值接近1,训练的模型才有很好的性能。

    用WSO2 CEP运行模型

    在处理存储在磁盘上的数据时,我们用批处理的形式来构建模型。然而,为了运用模型,我们需要在运行时向模型输入可用的数据。数据的处理被称为“流处理”。我们用流处理引擎WSO2 CEP来运用模型。

    我们用H2O来构建模型。H2O能将模型导出为两种格式中的一种:POJO(简单Java对象)或MOJO(优化的模型对象)。前者需要被编译而后者可以直接使用。我们用了CEP中的MOJO模型。

    为了评估模型,我们用到了WSO2 CEP中的一个扩展。WSO2使用一种类似于SQL的查询语言来处理数据流中的数据。

    如图10所示,一个复杂的事件处理系统接收事件流数据,并用一种类SQL查询来评估它们。比如,一个给定的查询可以计算一个一分钟滑动窗口的stockQuotes流,将其与一分钟窗口的Tweets流连接,并发送一个事件到PredictedStockQuotes流。

    大数据

    图10:用于模型选择的预测性维护管道

    用CEP评估模型的查询例子如下面所示。

    from data_input#h2opojo:predict('ccpp/DRF_model_python_1479702792496_1')
    
    select T, V, AP, RH, prediction
    
    insert into data_output

    下面的图11显示了整个管道,包括训练步骤和评估步骤。

    大数据

    图11:用于模型选择的预测性维护管道

    该查询取走送到“数据输入”流的事件,并运用机器学习模型。运用机器学习模型包括下面几个步骤:

    1. 用“第3阶段:特征工程”章节中所描述的预处理步骤对事件数据进行预处理,并生成特征集
    2. 用生成的特征集来评估机器学习模型。
    3. 返回结果

    结论

    预测性维护的主要目的是预测设备可能发生故障的时间。然后采取相关行动来预防这些故障。预测性维护系统(PMS)监控未来的故障并提前安排维护时间。

    这些能降低一些成本。

    • 减少维护频率。
    • 最小化花在某个被维护的设备上的时间,更充分地利用时间。
    • 最小化维护费用。

    本文探讨了预测性维护的不同方法,使用了不同的回归和分类算法。而且,本文一步步地展示了调整这些模型的技术。我们的最终解决方案在预测剩余使用寿命上的RMSE值是18.77,在预测后N(30)步内可能出现故障上的准确率是94%。

    转载请注明出处: 乐投网-机器学习中,什么是预测性维护,常见技术有哪些

    展开全文
  • 探索NASA的涡扇数据集 (Exploring NASA’s turbofan dataset) Although released over a decade ago, NASA’s turbofan engine degradation simulation dataset (CMAPSS) remains popular and relevant today. Over ...

    探索NASA的涡扇数据集 (Exploring NASA’s turbofan dataset)

    Although released over a decade ago, NASA’s turbofan engine degradation simulation dataset (CMAPSS) remains popular and relevant today. Over 90 new research papers have been published in 2020 so far [1]. These papers present and benchmark novel algorithms to predict Remaining Useful Life (RUL) on the turbofan datasets.

    尽管已经发布了十多年,但NASA的涡扇发动机退化模拟数据集(CMAPSS)仍然很受欢迎,并在今天具有重要意义。 截止到2020年,已有90多篇新研究论文发表[1]。 这些论文提出了新的算法并对其进行了基准测试,以预测涡轮风扇数据集上的剩余使用寿命(RUL)。

    When I first started learning about predictive maintenance, I stumbled upon a few blog posts using the turbofan degradation dataset. Each covered exploratory data analysis and a simple model to predict the RUL, but I felt two things were lacking:

    当我第一次开始学习预测性维护时,我偶然发现了一些使用涡轮风扇降级数据集的博客文章。 每个都包含探索性数据分析和一个简单的模型来预测RUL,但是我感到缺少两件事:

    1. I never got a complete overview of how to apply different suitable techniques to the same problem

      对于如何将不同的适用技术应用于同一问题,我从未获得完整的概述。
    2. The blog posts would only focus on the first dataset, leaving me guessing how the more complex challenges could be solved.

      博客文章仅关注第一个数据集,让我猜测如何解决更复杂的挑战。

    A few years later this seemed like a fun project for me to pick up. In a series of posts, I plan to showcase and explain multiple analysis techniques, while also offering a solution for the more complex datasets.

    几年后,这对我来说似乎是一个有趣的项目。 在一系列文章中,我计划展示和解释多种分析技术,同时还为更复杂的数据集提供解决方案。

    I’ve created an index below which I’ll update with links to new posts along the way:

    我创建了一个索引,在该索引下,我将通过以下方式更新指向新帖子的链接:

    1. FD001 — Exploratory data analysis and baseline model (this article) 2. FD001 — Updated assumption of RUL & Support Vector Regression 3. FD001 — Time series analysis: distributed lag models4. FD001 — Survival analysis for predictive maintenance5. FD003 — Random forest (I’ve changed the order, read the article to find out why) 6. FD002 — lagged MLP & reproducible results primer 7. FD004 — LSTM & wrap-up

    1. FD001-探索性数据分析和基线模型(本文)2. FD001-RUL和支持向量回归的更新假设3. FD001-时间序列分析:分布式滞后模型4。 FD001 —预测性维护的生存分析5。 FD003 —随机森林(我更改了顺序,阅读文章以找出原因)6. FD002 —落后的MLP和可再现的结果引物7. FD004 — LSTM和总结

    The turbofan dataset features four datasets of increasing complexity (see table I) [2, 3]. The engines operate normally in the beginning but develop a fault over time. For the training sets, the engines are run to failure, while in the test sets the time series end ‘sometime’ before failure. The goal is to predict the Remaining Useful Life (RUL) of each turbofan engine.

    涡轮风扇数据集具有四个复杂度不断提高的数据集(请参见表I)[2,3]。 发动机在一开始就正常运行,但随着时间的流逝会出现故障。 对于训练集,引擎将运行至故障,而在测试集中,时间序列将在故障发生之前的“某个时候”结束。 目的是预测每个涡轮风扇发动机的剩余使用寿命(RUL)。

    Image for post
    Table I: Overview of turbofan datasets
    表一:涡轮风扇数据集概述

    Datasets include simulations of multiple turbofan engines over time, each row contains the following information: 1. Engine unit number 2. Time, in cycles 3. Three operational settings 4. 21 sensor readings

    数据集包括随时间变化的多个涡轮风扇发动机的仿真,每一行包含以下信息:1.发动机单元编号2.周期时间3.三种运行设置4. 21个传感器读数

    What I find really cool about this dataset is that you can’t use any domain knowledge, as you don’t know what a sensor has been measuring. So, results are purely based on applying the correct techniques.

    我发现此数据集的真正酷点是您不能使用任何领域知识,因为您不知道传感器正在测量什么。 因此,结果完全基于应用正确的技术。

    In today’s post we’ll focus on exploring the first dataset (FD001) in which all engines develop the same fault and have only one operating condition. In addition, we’ll create a baseline linear regression model so we can compare our modeling efforts of future posts.

    在今天的帖子中,我们将重点研究第一个数据集(FD001),在该数据集中,所有引擎都出现相同的故障,并且只有一个工作状态。 另外,我们将创建一个基线线性回归模型,以便我们可以比较未来职位的建模工作。

    探索性数据分析 (Exploratory Data Analysis)

    Let’s get started by importing the required libraries, read the data and inspect the first few rows. Note that a few columns seem to have none to very little deviation in their values. We’ll explore these further down below.

    首先,导入所需的库,读取数据并检查前几行。 请注意,几列的值似乎没有或几乎没有偏差。 我们将在下面进一步探讨这些内容。

    %matplotlib inline
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    import seaborn as sns; sns.set()
    
    
    from sklearn.linear_model import LinearRegression
    from sklearn.metrics import mean_squared_error, r2_score
    # define filepath to read data
    dir_path = './CMAPSSData/'
    
    
    # define column names for easy indexing
    index_names = ['unit_nr', 'time_cycles']
    setting_names = ['setting_1', 'setting_2', 'setting_3']
    sensor_names = ['s_{}'.format(i) for i in range(1,22)] 
    col_names = index_names + setting_names + sensor_names
    
    
    # read data
    train = pd.read_csv((dir_path+'train_FD001.txt'), sep='\s+', header=None, names=col_names)
    test = pd.read_csv((dir_path+'test_FD001.txt'), sep='\s+', header=None, names=col_names)
    y_test = pd.read_csv((dir_path+'RUL_FD001.txt'), sep='\s+', header=None, names=['RUL'])
    
    
    # inspect first few rows
    train.head()
    Image for post
    Result of train.head()
    train.head()的结果

    Next, FD001 should contain data of one hundred engines, let’s inspect the unit number to verify this is the case. I chose to use pandas describe function so we can also get an understanding of the distribution. While we’re at it, let’s also inspect the time cycles to see what we can learn about the number of cycles the engines ran on average before breaking down.

    接下来,FD001应该包含一百个引擎的数据,让我们检查单元号以验证是否是这种情况。 我选择使用pandas describe函数,以便我们也可以了解其分布。 在此过程中,我们还要检查时间周期,以了解有关发动机在发生故障之前平均运行的周期数的信息。

    train[index_names].describe()
    train[index_names].groupby('unit_nr').max().describe()
    Image for post
    Dataset descriptive statistics of unit_nr and time_cycles
    unit_nr和time_cycles的数据集描述性统计

    When we inspect the descriptive statistics of unit_nr we can see the dataset has a total of 20631 rows, unit numbers start at 1 and end at 100 as expected. What’s interesting, is that the mean and quantiles don’t align neatly with the descriptive statistics of a vector from 1–100, this can be explained due to each unit having different max time_cycles and thus a different number of rows. When inspecting the max time_cycles you can see the engine which failed the earliest did so after 128 cycles, whereas the engine which operated the longest broke down after 362 cycles. The average engine breaks between 199 and 206 cycles, however the standard deviation of 46 cycles is rather big. We’ll visualize this further down below to get an even better understanding.

    当我们检查unit_nr的描述性统计信息时,我们可以看到数据集共有20631行,单元号按预期从1开始到100结束。 有趣的是,均值和分位数与从1到100的向量的描述统计数据不一致,这可以解释,因为每个单元具有不同的max time_cycles,因此行数不同。 检查最大time_cycles时,您可以看到最早失效的发动机是在128个循环后失效的,而运行时间最长的发动机则在362个循环后发生了故障。 平均发动机在199和206周期之间断裂,但是46周期的标准偏差相当大。 我们将在下面进一步可视化此内容,以更好地理解。

    The dataset description also indicates the turbofans run at a single operating condition. Let’s check the settings for verification.

    数据集描述还指示涡轮风扇在单个运行条件下运行。 让我们检查设置以进行验证。

    train[setting_names].describe()
    Image for post
    Descriptive statistics of engine settings
    引擎设置的描述性统计

    Looking at the standard deviations of settings 1 and 2, they aren’t completely stable. The fluctuations are so small however, that no other operating conditions can be identified.

    查看设置1和2的标准偏差,它们并不完全稳定。 但是,波动很小,无法确定其他运行条件。

    Finally, we’ll inspect the descriptive statistics of the sensor data, looking for indicators of signal fluctuation (or the absence thereof).

    最后,我们将检查传感器数据的描述性统计信息,寻找信号波动(或不存在)的指标。

    train[sensor_names].describe().transpose()
    Image for post
    Descriptive statistics of the sensor signals.
    传感器信号的描述性统计。

    By looking at the standard deviation it’s clear sensors 1, 10, 18 and 19 do not fluctuate at all, these can be safely discarded as they hold no useful information. Inspecting the quantiles indicates sensors 5, 6 and 16 have little fluctuation and require further inspection. Sensors 9 and 14 have the highest fluctuation, however this does not mean the other sensors can’t hold valuable information.

    通过查看标准偏差,可以清楚地看出传感器1、10、18和19根本没有波动,由于它们没有任何有用的信息,因此可以安全地丢弃它们。 检查分位数表明传感器5、6和16的波动很小,需要进一步检查。 传感器9和14的波动最大,但这并不意味着其他传感器无法保存有价值的信息。

    计算RUL (Computing RUL)

    Before we start plotting our data to continue our EDA, we’ll compute a target variable for Remaining Useful Life (RUL). The target variable will serve two purposes:

    在开始绘制数据以继续执行EDA之前,我们将计算“剩余使用寿命”(RUL)的目标变量。 目标变量将用于两个目的:

    1. It will serve as our X-axis while plotting sensor signals, allowing us to easily interpret changes in the sensor signals as the engines near breakdown.

      在绘制传感器信号时,它将用作我们的X轴,使我们可以轻松地解释当发动机接近故障时传感器信号的变化。
    2. It will serve as target variable for our supervised machine learning models.

      它将用作我们监督的机器学习模型的目标变量。

    Without further information about the RUL of engines in the training set, we’ll have to come up with estimates of our own. We’ll assume the RUL decreases linearly over time and have a value of 0 at the last time cycle of the engine. This assumption implies RUL would be 10 at 10 cycles before breakdown, 50 at 50 cycles before breakdown, etc.

    如果在培训集中没有关于引擎RUL的进一步信息,我们将不得不对自己的估计。 我们假设RUL随时间线性下降,并且在引擎的最后一个时间周期的值为0。 此假设意味着RUL在击穿前10个周期为10,在击穿前50个周期为50,依此类推。

    Mathematically we can use max_time_cycle — time_cycle to compute our desired RUL. Since we want to take the max_time_cycle of each engine into account, we’ll group the dataframe by unit_nr before computing max_time_cycle. The max_time_cycle is then merged back into the dataframe to allow easy calculation of RUL by subtracting the columns max_time_cycle — time_cycle. Afterwards we drop max_time_cycle as it’s no longer needed and inspect the first few rows to verify our RUL calculation.

    在数学上,我们可以使用max_time_cycle — time_cycle计算所需的RUL。 由于我们要考虑每个引擎的max_time_cycleunit_nr在计算max_time_cycle之前,将数据帧按unit_nr max_time_cycle 。 然后,将max_time_cycle合并回数据帧,以通过减去max_time_cycle — time_cycle列轻松地计算RUL。 然后,我们删除不再需要的max_time_cycle并检查前几行以验证我们的RUL计算。

    def add_remaining_useful_life(df):
        # Get the total number of cycles for each unit
        grouped_by_unit = df.groupby(by="unit_nr")
        max_cycle = grouped_by_unit["time_cycles"].max()
        
        # Merge the max cycle back into the original frame
        result_frame = df.merge(max_cycle.to_frame(name='max_cycle'), left_on='unit_nr', right_index=True)
        
        # Calculate remaining useful life for each row
        remaining_useful_life = result_frame["max_cycle"] - result_frame["time_cycles"]
        result_frame["RUL"] = remaining_useful_life
        
        # drop max_cycle as it's no longer needed
        result_frame = result_frame.drop("max_cycle", axis=1)
        return result_frame
      
    train = add_remaining_useful_life(train)
    train[index_names+['RUL']].head()
    Image for post

    绘图 (Plotting)

    Plotting is always a good idea to develop a better understanding of your dataset. Let’s start by plotting the histogram of max RUL to understand its distribution.

    绘图始终是一个更好的了解数据集的好主意。 让我们首先绘制最大RUL的直方图以了解其分布。

    df_max_rul = train[['unit_nr', 'RUL']].groupby('unit_nr').max().reset_index()
    df_max_rul['RUL'].hist(bins=15, figsize=(15,7))
    plt.xlabel('RUL')
    plt.ylabel('frequency')
    plt.show()
    Image for post

    The histogram reconfirms most engines break down around 200 cycles. Furthermore, the distribution is right skewed, with few engines lasting over 300 cycles.

    直方图可以确认大多数引擎在200个循环左右时就崩溃了。 此外,该分布是右偏的,几乎没有引擎能够持续300个循环。

    Below I’ll show the code used to plot signals of each sensor. Due to the large number of engines, it’s not feasible to plot every engine for every sensor. The graphs would no longer be interpret-able with so many lines in one plot. Therefore, I chose to plot each engine whose unit_nr is divisible by 10 with a remainder of 0. We revert the X-axis so RUL decreases along the axis, with a RUL of zero indicating engine failure. Due to the large number of sensors I’ll discuss a few graphs which are representative for the whole set. Remember, based on our descriptive statistics, we should definitely inspect the graphs of sensors 5, 6 and 16.

    下面,我将显示用于绘制每个传感器信号的代码。 由于引擎数量众多,因此无法为每个传感器绘制每个引擎。 一张图中的这么多线将无法解释这些图。 因此,我选择绘制每个unit_nr被10整除且余数为0的引擎的图。我们还原X轴,以使RUL沿该轴减小,RUL为零表示引擎故障。 由于传感器数量众多,我将讨论一些代表整个集合的图表。 请记住,基于我们的描述性统计数据,我们绝对应该检查传感器5、6和16的图形。

    def plot_sensor(sensor_name):
        plt.figure(figsize=(13,5))
        for i in train['unit_nr'].unique():
            if (i % 10 == 0):  # only plot every 10th unit_nr
                plt.plot('RUL', sensor_name, 
                         data=train[train['unit_nr']==i])
        plt.xlim(250, 0)  # reverse the x-axis so RUL counts down to zero
        plt.xticks(np.arange(0, 275, 25))
        plt.ylabel(sensor_name)
        plt.xlabel('Remaining Use fulLife')
        plt.show()
    for sensor_name in sensor_names:
        plot_sensor(sensor_name)
    Image for post
    Graph of s_1 vs declining RUL
    s_1与RUL下降的图表

    The graph of sensors 1, 10, 18 and 19 look similar, the flat line indicates the sensors hold no useful information, which reconfirms our conclusion from the descriptive statistics. Sensors 5 and 16 also show a flat line, these can be added to the list of sensors to exclude.

    传感器1、10、18和19的图形看起来相似,实线表示传感器没有任何有用的信息,这再次证实了我们从描述性统计中得出的结论。 传感器5和16也显示一条平线,可以将其添加到要排除的传感器列表中。

    Image for post
    Graph of s_2 vs declining RUL
    s_2与下降RUL的关系图

    Sensor 2 shows a rising trend, a similar pattern can be seen for sensors 3, 4, 8, 11, 13, 15 and 17.

    传感器2呈上升趋势,对于传感器3、4、8、11、13、15和17可以看到类似的模式。

    Image for post
    Graph of s_6 vs declining RUL
    s_6与RUL下降的图表

    Sensor readings of sensor 6 peak downwards at times but there doesn’t seem to be a clear relation to the decreasing RUL.

    传感器6的传感器读数有时会向下峰值,但似乎与RUL的下降没有明显关系。

    Image for post
    Graph of s_7 vs RUL
    s_7和RUL的图表

    Sensor 7 shows a declining trend, which can also be seen in sensors 12, 20 and 21.

    传感器7呈下降趋势,这在传感器12、20和21中也可以看到。

    Image for post
    Graph of s_9 vs RUL
    s_9和RUL的图表

    Sensor 9 has a similar pattern as sensor 14.

    传感器9具有与传感器14类似的样式。

    Based on our Exploratory Data Analysis we can determine sensors 1, 5, 6, 10, 16, 18 and 19 hold no information related to RUL as the sensor values remain constant throughout time. Let’s kick-off our model development with a baseline Linear Regression model. The model will use the remaining sensors as predictors.

    根据我们的探索性数据分析,我们可以确定传感器1、5、6、10、16、18和19没有保存与RUL相关的信息,因为传感器值在整个时间内保持恒定。 让我们从基线线性回归模型开始我们的模型开发。 该模型将使用其余的传感器作为预测变量。

    基线线性回归 (Baseline Linear Regression)

    First, we’ll define a small function to evaluate our models. I chose to include Root Mean Squared Error (RMSE) as it will give an indication how many time cycles the predictions are off on average, and Explained Variance (or R² score) to indicate what proportion of our dependent variable can be explained by the independent variables we use.

    首先,我们将定义一个小的函数来评估我们的模型。 我选择包括均方根误差(RMSE),因为它可以表明预测平均偏离了多少个时间周期,而解释方差(或R²得分)则表明我们独立变量可以解释我们的因变量的比例我们使用的变量。

    def evaluate(y_true, y_hat, label='test'):
        mse = mean_squared_error(y_true, y_hat)
        rmse = np.sqrt(mse)
        variance = r2_score(y_true, y_hat)
        print('{} set RMSE:{}, R2:{}'.format(label, rmse, variance))

    We’ll drop the unit_nr, time_cycle, settings and sensors which hold no information. The RUL column of the training set is stored in its own variable. For our test set we drop the same columns. In addition, we are only interested in the last time cycle of each engine in the test set as we only have True RUL values for those records.

    我们将删除不unit_nr, time_cycle, settings and sensors任何信息的unit_nr, time_cycle, settings and sensors 。 训练集的RUL列存储在其自己的变量中。 对于我们的测试集,我们删除相同的列。 此外,我们只对测试集中每个引擎的最后一个时间周期感兴趣,因为我们只有那些记录的True RUL值。

    drop_sensors = ['s_1','s_5','s_6','s_10','s_16','s_18','s_19']
    drop_labels = index_names+setting_names+drop_sensors
    
    
    X_train = train.drop(drop_labels, axis=1)
    y_train = X_train.pop('RUL')
    
    
    # Since the true RUL values for the test set are only provided for the last time cycle of each enginge, 
    # the test set is subsetted to represent the same
    X_test = test.groupby('unit_nr').last().reset_index().drop(drop_labels, axis=1)

    Setting up for linear regression is quite straightforward. We instantiate the model by simply calling the method and assigning it to the ‘lm’ variable. Next, we fit the model by passing our ‘X_train’ and ‘y_train’. Finally, we predict on both the train and test set to get the full picture of how our model is behaving with the data that was presented to it.

    设置线性回归非常简单。 我们通过简单地调用方法并将其分配给“ lm”变量来实例化模型。 接下来,我们通过传递“ X_train”和“ y_train”来拟合模型。 最后,我们在训练集和测试集上进行预测,以全面了解我们的模型如何利用提供给它的数据来表现。

    # create and fit model
    lm = LinearRegression()
    lm.fit(X_train, y_train)
    
    
    # predict and evaluate
    y_hat_train = lm.predict(X_train)
    evaluate(y_train, y_hat_train, 'train')
    
    
    y_hat_test = lm.predict(X_test)
    evaluate(y_test, y_hat_test)
    # returns
    # train set RMSE:44.66819159545453, R2:0.5794486527796716
    # test set RMSE:31.952633027741815, R2:0.40877368076574083

    Note, the RMSE is lower on the test set, which is counter-intuitive, as commonly a model performs better on the data it has seen during training.

    注意,RMSE在测试集上较低,这是违反直觉的,因为通常模型在训练过程中看到的数据表现更好。

    A possible explanation could be the computed RUL of the training set ranging well into the 300s. Looking at the trend of the graph below, the higher values of linearly computed RUL do not seem to correlate very well with the sensor signal. Since RUL predictions of the test set are closer to failure, and the correlation between the lower target RUL and sensor signal is clearer, it may be easier for the model to make accurate predictions on the test set. The large difference in train and test RMSE can be seen as a flaw of our assumption of RUL and is something we’ll try to improve in the future. For now, we have concluded our EDA and baseline model.

    一个可能的解释可能是训练集的计算RUL范围一直到300 s。 查看下图的趋势,线性计算的RUL的较高值似乎与传感器信号没有很好的相关性。 由于测试集的RUL预测更接近故障,并且较低的目标RUL和传感器信号之间的相关性更加清晰,因此模型可能更容易在测试集上做出准确的预测。 训练和测试RMSE的巨大差异可以看作是我们对RUL的假设的缺陷,并且是我们将来会尝试改进的东西。 目前,我们已经结束了我们的EDA和基线模型。

    Image for post
    Graph depicting linear declining RUL and s_12. This graph aims to showcase where the sensor signal and linearly declining RUL correlate strongly.
    该图描述了线性下降的RUL和s_12。 该图旨在展示传感器信号和线性下降的RUL强烈相关的地方。

    In today’s post we explored the first dataset of NASA’s turbofan degradation simulation dataset and created a baseline model with a test RMSE of 31.95. I would like to thank Maikel Grobbe and Wisse Smit for their inputs and reviewing my article. In the next post we’ll look at how to improve the computed RUL to make predictions more accurate. In addition, we’ll develop a Support Vector Regression to push performance even further.

    在今天的帖子中,我们探索了NASA涡扇退化模拟数据集的第一个数据集,并创建了测试RMSE为31.95的基线模型。 我要感谢Maikel Grobbe和Wisse Smit的投入并审阅了我的文章。 在下一篇文章中,我们将研究如何改进计算的RUL以使预测更加准确。 此外,我们将开发支持向量回归以进一步提高性能。

    If you have any questions or remarks, please leave them in the comments below. For the complete notebook you can check out my github page here.

    如果您有任何疑问或意见,请留在下面的评论中。 对于完整的笔记本,您可以在这里查看我的github页面。

    References:[1] Papers published on NASA’s CMAPSS data in 2020 so far: Google scholar search, accessed on 2020–08–08[2] A. Saxena, K. Goebel, D. Simon, and N. Eklund, “Damage Propagation Modeling for Aircraft Engine Run-to-Failure Simulation”, in the Proceedings of the Ist International Conference on Prognostics and Health Management (PHM08), Denver CO, Oct 2008.[3] NASA’s official data repository

    参考文献:[1]到目前为止,有关2020年NASA的CMAPSS数据的论文: Google学术搜索 ,于2020-08-08年访问[2] A. Saxena,K。Goebel,D.Simon和N. Eklund,“损害传播”飞机发动机失效仿真模型”,在第一届国际预测与健康管理会议(PHM08)上,美国丹佛市,2008年10月。[3] NASA的官方数据存储库

    翻译自: https://towardsdatascience.com/predictive-maintenance-of-turbofan-engines-ec54a083127

    展开全文
  • :由于通常很难获得,特别是很难发布真实的预测性维护数据集,因此我们会提供并提供一个综合数据集,以我们的专业知识来反映行业中遇到的真实的预测性维护。\ :此数据集描述了一个房间的尺寸,目的是预测房间是否...
  • 本帖最后由 zwlbeyond 于 2020-5-19 14:30 编辑数据集使用了PHM08挑战数据集,是涡轮风扇发动机退化模拟数据集。训练数据包含218个运行到故障模拟。这组测量被称为“集合”。每个集合成员都是一个包含26列的表。 ...

    本帖最后由 zwlbeyond 于 2020-5-19 14:30 编辑

    数据集使用了PHM08挑战数据集,是涡轮风扇发动机退化模拟数据集。

    训练数据包含218个运行到故障模拟。这组测量被称为“集合”。

    每个集合成员都是一个包含26列的表。 这些列包含有关机器ID,时间戳,3个操作条件和21个传感器测量值的数据。

    PHM-2008数据是NASA在2008年公开的飞机发动机全寿命性能仿真数据,仿真平台为大型飞机涡扇发动机仿真软件C-MAPSS,模拟的是一个90000磅推力级的发动机模型。

    MATLAB 进行预测性维护  2020.05.09-------夜莺与玫瑰1、案例描述(导入数据)

    %%Data import

    t = readtable('train.txt');

    t(:,end) = []; %Discard last column of loaded data as all are empty ''

    % Add variable names to the table

    VarNames = {...

    'id', 'time', 'op_setting_1', 'op_setting_2', 'op_setting_3', ...

    'sensor_1', 'sensor_2', 'sensor_3', 'sensor_4', 'sensor_5', ...

    'sensor_6', 'sensor_7', 'sensor_8', 'sensor_9', 'sensor_10', ...

    'sensor_11', 'sensor_12', 'sensor_13', 'sensor_14', 'sensor_15', ...

    'sensor_16', 'sensor_17', 'sensor_18', 'sensor_19', 'sensor_20', ...

    'sensor_21'};

    t.Properties.VariableNames = VarNames;

    IDs = t{:,1};   %提取出ID,第一列数据

    nID = unique(IDs); %不同编号,代表不同的发动机

    degradationData = cell(numel(nID),1);  %退化数据初始化

    %将每一组发动机下的数据提取出来

    for ct=1:numel(nID)

    idx = IDs == nID(ct);

    degradationData{ct} = t(idx,:);

    end

    degradationData(1:5)

    head(degradationData{2})   %返回表的前8行复制代码

    退化数据都被加载到了degradationData变量中,从图1中可以看出,每组退化数据都包含26列数据,再从图2中看出,26列数据中包括了机器ID,时间戳,3个操作条件和21个传感器测量值的数据。

    2、划分训练数据集和验证数据集通过查看工作区,发现退化数据degradationData总共有218组,通常我们需要将这些数据分为训练数据集和验证数据集。为了更充分地使用所有数据,我们将所有数据平分为k份,然后每一份都做一次验证数据集(其余数据做训练集),这样我们就一共有了k对训练-验证数据,这种方法叫做k折交叉验证。代码实现方法如下:

    rng('default')  % 生成随机数,使用"default"是为了使用特定的随机数,这样大家的运行结果就都一样了

    numEnsemble = length(degradationData);

    numFold = 5;   %交叉验证分区数,即k的值

    cv = cvpartition(numEnsemble, 'KFold', numFold);  %为数据创建交叉验证分区,K-折交叉验证

    trainData = degradationData(training(cv, 1));  %读取第1组训练数据集

    validationData = degradationData(test(cv, 1)); %读取第1组验证数据集

    nsample = 10;

    figure

    helperPlotEnsemble(trainData, timeVariable, ...                %专用函数,绘制conditionVariables(1:2)和dataVariables(1:2)的图像

    [conditionVariables(1:2) dataVariables(1:2)], nsample)     %即"op_setting_1","op_setting_2","sensor_1"和"sensor_2"复制代码

    3、工作状态聚类从上图中看不出数据的退化趋势,下面我们将对退化特征进行提取。

    trainDataUnwrap = vertcat(trainData{:});  %垂直串联数组,即将175数组退化数据拼接成1组

    opConditionUnwrap = trainDataUnwrap(:, cellstr(conditionVariables));  %提取串联后的大数组的"op_setting_1","op_setting_2","op_setting_3"这三个一位数组

    figure

    helperPlotClusters(opConditionUnwrap)  %绘制三维散点图,查看聚类情况复制代码

    上边这段代码是将训练数据(共175组)串联成了一个大数组,然后分别以"op_setting_1", "op_setting_2", "op_setting_3"为x,y,z坐标绘制散点图。结果如上图:串联后的数据有3万多组,但是图上只有6个点,这是因为聚在一起的点相距太近,没有聚在一起的数据又离得太远,最终视觉效果就变成了只有6个点。如果不断地放大某个位置的点,就能看到聚在一起的密密麻麻的点了。这么分明的聚类结果是十分理想的。这说明"op_setting_1", "op_setting_2", "op_setting_3"的组合大致只有六组,所以后边我们将这六种组合对应的传感器的值分开分析。

    下面使用k均值聚类的方法计算对聚类结果进行定量分析,并找到各自的聚类质心:

    opts = statset('Display', 'final');  %显示最终迭代结果
    [clusterIndex, centers] = kmeans(table2array(opConditionUnwrap), 6, ...  %调用kmeans函数进行k均值聚类
        'Distance', 'sqeuclidean', 'Replicates', 5, 'Options', opts);        %设置共分为6组,距离度量为欧氏距离,不同初始条件下重复计算5次
    figure
    helperPlotClusters(opConditionUnwrap, clusterIndex, centers)
    复制代码

    4、数据标准化①计算各聚类下各传感器的均值,得到大小为6*21的数组(6为聚类数,21为传感器数)。②计算各聚类下各传感器的标准差,得到大小为6*21的数组(6为聚类数,21为传感器数)。如果某组数据的标准差为0,则将该组数据统一设置为0,因为几乎恒定的传感器测量值对于剩余使用寿命估计没有用处。③分别计算该条目数据至6个聚类中心的距离,并找到最近的聚类中心。④对于每个传感器的测量值,减去“该聚类下该传感器”的平均值,再除以“该聚类下该传感器”的标准差。这种“减去均值再除以标准差”的方法叫做Z-score标准化,非常常用。经过这种处理后的数据均值为0,且符合正态分布。

    centerstats = struct('Mean', table(), 'SD', table()); %初始化结构体,用于存储各传感器的均值和标准差

    for v = dataVariables

    centerstats.Mean.(char(v)) = splitapply(@mean, trainDataUnwrap.(char(v)), clusterIndex); %将个sensor数据划分到其所在的聚类,并求该聚类组的该传感器均值

    centerstats.SD.(char(v))   = splitapply(@std,  trainDataUnwrap.(char(v)), clusterIndex); %将个sensor数据划分到其所在的聚类,并求该聚类组的该传感器标准差

    end

    centerstats.Mean

    centerstats.SD

    trainDataNormalized = cellfun(@(data) regimeNormalization(data, centers, centerstats), ... %进行数据规范化

    trainData, 'UniformOutput', false);

    figure

    helperPlotEnsemble(trainDataNormalized, timeVariable, dataVariables(1:4), nsample)  %规范化后的退化数据可视化复制代码

    为什么标准化处理后退化趋势就显现出来了呢?是因为之前6种运行状态下的传感器数据混杂在一起,互相干扰,或者说趋势性被不同运行状态引起的干扰淹没了;在我们将6种状态下的传感器区分开之后,分别进行标准化,就剔除掉了运行状态所造成的差异性,使得传感器数据在不同时间上可对比。

    5、趋势分析从上图中可以看到,某些传感器退化趋势明显,某些不太明显。这里我们选择最具趋势性的传感器测量值,构建健康指数进行预测。对每个传感器测量值构建线性退化模型,并对信号的斜率的绝对值进行排序。最终选出8组退化趋势的传感器,其中四组的数据如下:

    numSensors = length(dataVariables);

    signalSlope = zeros(numSensors, 1);

    warn = warning('off');

    for ct = 1:numSensors

    tmp = cellfun(@(tbl) tbl(:, cellstr(dataVariables(ct))), trainDataNormalized, 'UniformOutput', false);

    mdl = linearDegradationModel(); % create model

    fit(mdl, tmp); % train mode

    signalSlope(ct) = mdl.Theta;

    end

    warning(warn);

    [~, idx] = sort(abs(signalSlope), 'descend');

    sensorTrended = sort(idx(1:8))

    figure

    helperPlotEnsemble(trainDataNormalized, timeVariable, dataVariables(sensorTrended(3:6)), nsample)复制代码

    需要注意的是,有些传感器数据呈上升趋势,有些呈下降趋势,而我们是以斜率的绝对值为选取标准的。

    6、构建健康指标需要将选出的这些传感器数据融合到一个健康指标中,并通过该指标训练基于相似性的模型。假设所有的故障数据都是从健康状况开始的,开始时的健康状况设为1,失效时的健康状况为0。那么所有数据对应的健康状况都是从1下降至0。其中10组数据的健康指标的变化趋势如下:

    for j=1:numel(trainDataNormalized)

    data = trainDataNormalized{j};

    rul = max(data.time)-data.time;

    data.health_condition = rul / max(rul);

    trainDataNormalized{j} = data;

    end

    figure

    helperPlotEnsemble(trainDataNormalized, timeVariable, "health_condition", nsample)复制代码

    下面开始构建健康状况的线性回归模型:①我们之前选定了8个退化规律最明显的传感器,建立这8个传感器与健康状况的线性模型。②y=ax+b这种线性回归模型大家都知道吧,在这个例子里,y就是图8中的健康指标,x就是8个传感器的数值,而a和b则是我们要估计的回归参数。与平时常用的不同的是,这里a是个1*8的矩阵,x也是个8*n的矩阵(n为每个传感器采集到的数据长度)。需要估计的就是a1~a8和b这九个参数。可以通过下述代码实现:

    trainDataNormalizedUnwrap = vertcat(trainDataNormalized{:});  %将标准化后的数据垂直串联为一个大数组复制代码重构后的健康指标如上所示

    7、使用同样的方法处理验证集数据将验证数据集数据进行标准化,并同样带入上一节中得到的线性模型中。此时的健康指标为:

    validationDataNormalized = cellfun(@(data) regimeNormalization(data, centers, centerstats), ...

    validationData, 'UniformOutput', false);

    validationDataFused = cellfun(@(data) degradationSensorFusion(data, sensorToFuse, weights), ...

    validationDataNormalized, 'UniformOutput', false);

    figure

    helperPlotEnsemble(validationDataFused, [], 1, nsample)

    xlabel('Time')

    ylabel('Health Indicator')

    title('Validation Data')复制代码

    8、建立相似性RUL模型使用训练数据建立一个基于残差的相似性RUL模型。在此设置中,模型试用二次多项式拟合每个融合数据。数据与数据之间的距离通过残差的1范数计算其中机器的健康指标是使用机器中识别的二阶多项式模型估算的机器的健康指标。相似度分数通过以下公式计算给定验证数据集中的几个集合成员,模型将找到训练数据集中最近的50个集合成员,拟合基于50个集合成员的概率分布,并使用分布中的中值作为RUL的估计。

    mdl = residualSimilarityModel(...

    'Method', 'poly2',...      %使用poly2方法

    'Distance', 'absolute',... %绝对值距离

    'NumNearestNeighbors', 50,...  %集合成员为50

    'Standardize', 1);

    fit(mdl, trainDataFused);    %拟合模型复制代码

    9、性能评估为了评估相似性rul模型,使用50%、70%和90%的样本验证数据来预测其RUL。

    breakpoint = [0.5, 0.7, 0.9];

    validationDataTmp = validationDataFused{3}; % use one validation data for illustration

    bpidx = 1;   %使用50%的区间

    validationDataTmp50 = validationDataTmp(1:ceil(end*breakpoint(bpidx)),:);  % 50%区间内的健康指标

    trueRUL = length(validationDataTmp) - length(validationDataTmp50);         % 真实剩余寿命

    [estRUL, ciRUL, pdfRUL] = predictRUL(mdl, validationDataTmp50);            % 得到估计的剩余寿命、置信区间和RUL概率密度的估计值复制代码

    (1)50%截段的数据验证随便选择一组验证数据,并截取其前50%的数据,绘制下图:红线为该组被截断50%的数据,蓝线为验证数据集其他组数据的退化曲线。选定的截断数据与其周围数据,将估计的RUL、真实RUL和估计RUL的概率分布进行比较。

    figure

    compare(mdl, validationDataTmp50);

    figure

    helperPlotRULDistribution(trueRUL, estRUL, pdfRUL, ciRUL)复制代码(2)70%截段的数据验证

    bpidx = 2;

    validationDataTmp70 = validationDataTmp(1:ceil(end*breakpoint(bpidx)), :);

    trueRUL = length(validationDataTmp) - length(validationDataTmp70);

    [estRUL,ciRUL,pdfRUL] = predictRUL(mdl, validationDataTmp70);

    figure

    compare(mdl, validationDataTmp70);

    figure

    helperPlotRULDistribution(trueRUL, estRUL, pdfRUL, ciRUL)复制代码

    (3)90%截段的数据验证

    bpidx = 3;

    validationDataTmp90 = validationDataTmp(1:ceil(end*breakpoint(bpidx)), :);

    trueRUL = length(validationDataTmp) - length(validationDataTmp90);

    [estRUL,ciRUL,pdfRUL] = predictRUL(mdl, validationDataTmp90);

    figure

    compare(mdl, validationDataTmp90);

    figure

    helperPlotRULDistribution(trueRUL, estRUL, pdfRUL, ciRUL)复制代码

    通过50%、70%、90%估计寿命的结果对比,发现随着验证数据比例的增加,寿命的估计值也会更准确(当然了)。

    10、整体评价第9步中是对某一组退化数据进行的预测,现在对整个验证数据集重复相同的评估程序,并计算每个断点的估计RUL和真实RUL之间的误差。

    numValidation = length(validationDataFused);复制代码

    (1)绘制每个断点的误差直方图及其分布:随着观测的数据越来越多(从50%~90%),误差越来越集中于0附近。

    figure

    ax(1) = subplot(3,1,1);

    hold on

    histogram(error(:, 1), 'BinWidth', 5, 'Normalization', 'pdf')

    plot(x50, pdf50)

    hold off

    xlabel('Prediction Error')

    title('RUL Prediction Error using first 50% of each validation ensemble member')

    ax(2) = subplot(3,1,2);

    hold on

    histogram(error(:, 2), 'BinWidth', 5, 'Normalization', 'pdf')

    plot(x70, pdf70)

    hold off

    xlabel('Prediction Error')

    title('RUL Prediction Error using first 70% of each validation ensemble member')

    ax(3) = subplot(3,1,3);

    hold on

    histogram(error(:, 3), 'BinWidth', 5, 'Normalization', 'pdf')

    plot(x90, pdf90)

    hold off

    xlabel('Prediction Error')

    title('RUL Prediction Error using first 90% of each validation ensemble member')

    linkaxes(ax)复制代码

    (2)绘制箱型图箱型图是一种用作显示一组数据分散情况资料的统计图。它主要用于反映原始数据分布的特征,还可以进行多组数据分布特征的比较。

    figure复制代码

    (3)绘制误差棒图误差棒是数据可变性的图形表示,并用于图表以指示所报告的测量中的误差或不确定性。如下图中每个竖线代表了预测的平均误差以及一个标准差的范围。可以看出,随着观测的数据越来越多,预测误差均值越来越小,误差范围也越来越小。

    errorMean = mean(error)复制代码

    总结

    总的来说,通过50%、70%、90%估计寿命的结果对比,发现随着验证数据比例的增加,寿命的估计值也会更准确。这个方法的关键之处在于,需要有比较大量的失效数据,经过数据聚类→数据标准化→选取退化趋势最明显的传感器→构建线性退化模型→建立相似性RUL模型→进行预测 这些步骤可以实现预测。这个大量失效数据的条件在某些产品中是不容易得到的,但是如果有这些数据,预测结果还是比较可靠的。

    展开全文
  • Turbofan POC:使用联合学习对Turbofan发动机进行预测性维护 该存储库显示了一种概念证明(POC),该概念证明了使用联合学习来不断改善对飞机燃气涡轮发动机剩余寿命的预测,从而防止了机器故障。 对于引擎仿真,...
  • NASA数据集

    千次阅读 2019-02-09 11:09:26
    最近在做预测性维护方面的工作,数据集用的是NASA 2008PHM竞赛的数据集,在youtube上有些相关该数据集的教程,但还是觉得不够。真巧看到了matlab主页上关于预测性维护技术工具箱的文档,发现它正是使用了我要使用的...
  • 预见性维护(PdM)应用程序旨在将机器学习应用于工业物联网数据集,以减少职业危害、机器停机时间,以及其他成本。了解机器学习行业从业者所面临的数据准备的挑战,以及与预测维护相关的数据摄取和特征工程的解决方案...
  • 简介:数据可用的提高正在帮助行业有效地安排维护活动。 硬件和基于云的解决方案的功能不断增强,机器学习方法在这一领域正变得越来越有效。 有效的维护活动管理有助于减少停机成本并最大程度地延长设备使用寿命。...
  • 数据集整理了越来越多的关键指标,用于评估,监视和预测全球COVID-19情况。 数据集由国际数据服务咨询公司维护。 实时数据,易于使用 已经发布了一系列数据集,这些数据集对于监视和理解COVID-19的传播非常有用。...
  • 作为组织,我们代表 SBB 客运公司订购、维护、现代化和驾驶机车车辆。...基于条件的维护,甚至基于数据采集和分析的预测性维护正变得越来越重要。 Condition of pantograph slide plates_datasets.txt
  • 本帖最后由 zwlbeyond 于 2020-5-19 14:30 编辑数据集使用了PHM08挑战数据集,是涡轮风扇发动机退化模拟数据集。训练数据包含218个运行到故障模拟。这组测量被称为“集合”。每个集合成员都是一个包含26列的表。 ...
  • 数据丢失的风险: 如果使用适当的步骤来维护日志文件,会大大降低数据丢失的风险 恢复所需的时间: 数据库恢复需要时间,应用日志文件将增加恢复时间 6. 高级存储备份 我们在高可用下的高级存储选项部分中讨论...
  • ENAS-PdM ENAS-PdM是一种定制的进化算法,专门设计用于优化...evolutionary_algorithm.py:在预测性维护的背景下进化神经网络的进化算法的实现 跑 拉请求是受欢迎的。 对于重大更改,请先打开一个问题以讨论您要更改的
  • 在这种情况下,我们正在实现聚类机制,在这里我们应用购物中心客户的数据集(这是一个公共数据集)并创建与客户购买相关的聚类。 我们实施机器学习模型来预测拜访客户是否会购买任何产品。 对于此类作品,我们需要...
  • 汉诺威莱布尼兹大学2020人工智能实验室 ...要导入数据集并随后运行分析脚本,需要或更高版本。 使用的包和库在Pipfile中定义。 建议使用或更高版本的便携式安装(zip软件包),但是任何类型的安装都可以使
  • MS-Capstone-Project-Detecting住户占用率(通过电力消耗数据) 占空检测在各种各样的应用中有许多有用的用途,从HVAC和照明... ECO(电力消耗和占用)数据集是一个全面的开源(Creative Commons License CC BY 4.0
  • 对于本项目,我将使用一个预测性维护模型,并使用一个示例案例,其目的是预测由于某些系统组件而导致的故障。 分析包括该预测模型的特征工程,特征选择,标记,训练和评估。 预测模型是使用Python软件包构建的。 ...
  • 其应用的有形示例包括欺诈检测,图像识别,预测性维护和列车延迟预测系统。在日常机器学习(ML)和寻求部署所获得的知识的过程中,我们通常会遇到这三个主要问题(但不是唯一的问题)。数据质量- 来自多个时间范围内...
  • 3)飞机的预测性维护 回购结构: ├── conf ├── generators ├── data ├── README.md └── resources conf:打Kongconf目录 生成器:数据集生成器 数据:仪表板使用的一些强制性数据(例如:世界地图)...
  • Python-sklearn入门

    千次阅读 2016-12-01 22:20:47
    Python-SKLearn入门本文主要来自Sklearn官网中的文档说明,详细文档请访问该网址...安全和可维护局限 规则 类型转换 refitting和更新参数 多分类 加载样本数据集 S
  • 根据国际机器人技术联合会(International Federation of Robotics)的预测,在未来两年中,预计将有近200万台新的工业机器人装置安装在世界各地的工厂中。这是创纪录的速度,引起公众的不同反应...机器人在预测性维护
  • 关于AutoML系统的思考

    2019-10-11 14:35:13
    不说NAS,一个AutoML系统真的很难真正Auto,我自己感觉有下面几点的问题。 看了一些比赛的数据集,发现...比如在预测性维护中,可能是对一个时间序列做分类。时间序列和非时间序列处理起来是差很多的,需要分成两...
  • 供热信息服务可视化平台基于GIS技术,整合实时监测数据、地理空间数据和业务数据,并建设二、三维一体化平台,热力数据展示、关阀分析、运营调度和数据维护等功能于一体。保证热力管网运行的安全和高效,提高...
  • ImmClassifier-源码

    2021-02-13 05:32:26
    ImmClassifer无缝集成了免疫细胞分化生物学,异构参考数据集的强度和最新的机器学习模型。 ImmClassifier级联机器学习模块和深度学习模块。 安装 我们提供了一个包含ImmClassifier及其所有依赖项的Docker容器。 要...
  • 帮助亚马逊评论者撰写更有帮助的文章 作者:Elliot Macy 概述 像Amazon这样的在线零售商会向用户征求产品评论,并根据有用对评论进行排名。...数据集包括评论文本以及元数据(星级,产品ID,评论日期,
  • WhoseFace-源码

    2021-03-09 20:00:45
    尽管用于识别新面Kong的数据集很少,但是可以获得体面的分类。 该应用程序的工作正在改写Esteban Uri的现有工作。 谁的面KongAlpha(V 1.0.0 1001) 关于BadCode。 BadCode只是我为应用程序研究命名的开发人员...

空空如也

空空如也

1 2 3
收藏数 50
精华内容 20
关键字:

预测性维护数据集