Prediction of Remaining Useful Life (RUL) of JET engine

Photo by Mario Jacome on Dribbble

The main goal of this post is to detail my development of a model for doing predictive maintenance on commercial turbofan engines. The predictive maintenance method utilized here is a data-driven method, which means that data from the operating jet engine is used to simulate predictive maintenance.
The project’s goal is to develop a prediction model for estimating a jet engine’s Remaining Useful Life ( RUL) based on run-to-failure data from a fleet of comparable jet engines.

Overview of the data set

The Prognostics and Health Management PHM08 Challenge Data Set was developed by NASA and is now available to the public. The data collection is used to forecast jet engine problems over time. The Prognostics CoE at NASA Ames contributed the data set.

https://ti.arc.nasa.gov/tech/dash/groups/pcoe/prognostic-data-repository/#turbofan

The data set for the jet engine comprises time-series measurements of different pressures, temperatures, and rotating equipment speeds. In a commercial contemporary turbofan engine, these metrics are routinely taken. Although all engines are of the same kind, each one begins with varying degrees of early wear and manufacturing process differences that are undisclosed to the user. Each machine has three alternative settings that may be utilised to alter its performance. Each engine contains 21 sensors that gather data about the engine’s status while it’s running.

Let’s make time series plots for two units, so we can get a sense of the data.

time series plots for unit1
time series plots for unit99

We can see that the different unit numbers have a different number of total cycles before they fail. Let’s look at this more closely:

https://gist.github.com/dheerajskylark/1689a3a9512d2105a30f7b159b8ff5c7

count    100.000000
mean 206.310000
std 46.342749
min 128.000000
25% 177.000000
50% 199.000000
75% 229.250000
max 362.000000
Name: time_in_cycles, dtype: float64

https://gist.github.com/dheerajskylark/fa09c664546bd66ef1ec119bd34fb88c

From this we can infer the the remaining useful life (RUL) of each unit in the training data is time_in_cycles.max() minus the current time in cycles, for any given cycle. Let\’s add that as our dependent variable. (For the testing data, the RUL is in a separate file.)

We can check to make sure the RUL looks like we would expect:

https://gist.github.com/dheerajskylark/b121390164406c210766baa59cb42f10

time in cycles

Model Construction & Training

https://gist.github.com/dheerajskylark/a9d6797d1a2ec6f767752ca519471d8b

Model: "sequential_3"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
normalization_3 (Normalizati (None, None, 14) 29
_________________________________________________________________
lstm_3 (LSTM) (None, 32) 6016
_________________________________________________________________
dense_3 (Dense) (None, 1) 33
_________________________________________________________________
lambda_3 (Lambda) (None, 1) 0
=================================================================
Total params: 6,078
Trainable params: 6,049
Non-trainable params: 29
Epoch 1/499
10/10 [==============================] - 0s 6ms/step - loss: 10796.3320 - root_mean_squared_error: 103.9054
Epoch 2/499
10/10 [==============================] - 0s 6ms/step - loss: 7954.4033 - root_mean_squared_error: 89.1875
Epoch 3/499
10/10 [==============================] - 0s 6ms/step - loss: 6400.0864 - root_mean_squared_error: 80.0005
Epoch 4/499
10/10 [==============================] - 0s 4ms/step - loss: 4885.1406 - root_mean_squared_error: 69.8938
Epoch 5/499
10/10 [==============================] - 0s 4ms/step - loss: 4010.2659 - root_mean_squared_error: 63.3267
Epoch 6/499
10/10 [==============================] - 0s 4ms/step - loss: 3276.9802 - root_mean_squared_error: 57.2449
Epoch 7/499
10/10 [==============================] - 0s 4ms/step - loss: 3066.4707 - root_mean_squared_error: 55.3757
Epoch 8/499
10/10 [==============================] - 0s 4ms/step - loss: 2769.1394 - root_mean_squared_error: 52.6226
Epoch 9/499
10/10 [==============================] - 0s 4ms/step - loss: 2351.2549 - root_mean_squared_error: 48.4897
Epoch 10/499
10/10 [==============================] - 0s 4ms/step - loss: 2101.9841 - root_mean_squared_error: 45.8474
Epoch 11/499
10/10 [==============================] - 0s 4ms/step - loss: 1967.6283 - root_mean_squared_error: 44.3580
Epoch 12/499
10/10 [==============================] - 0s 4ms/step - loss: 2045.3716 - root_mean_squared_error: 45.2258
Epoch 13/499
10/10 [==============================] - 0s 4ms/step - loss: 1932.9287 - root_mean_squared_error: 43.9651
Epoch 14/499
10/10 [==============================] - 0s 4ms/step - loss: 1792.9589 - root_mean_squared_error: 42.3433
.
.
.
.
Epoch 491/499
10/10 [==============================] - 0s 4ms/step - loss: 62.6952 - root_mean_squared_error: 7.9180
Epoch 492/499
10/10 [==============================] - 0s 4ms/step - loss: 58.7008 - root_mean_squared_error: 7.6616
Epoch 493/499
10/10 [==============================] - 0s 4ms/step - loss: 48.0873 - root_mean_squared_error: 6.9345
Epoch 494/499
10/10 [==============================] - 0s 4ms/step - loss: 78.2315 - root_mean_squared_error: 8.8449
Epoch 495/499
10/10 [==============================] - 0s 4ms/step - loss: 84.7828 - root_mean_squared_error: 9.2078
Epoch 496/499
10/10 [==============================] - 0s 4ms/step - loss: 64.7266 - root_mean_squared_error: 8.0453
Epoch 497/499
10/10 [==============================] - 0s 4ms/step - loss: 68.3690 - root_mean_squared_error: 8.2686
Epoch 498/499
10/10 [==============================] - 0s 4ms/step - loss: 61.5877 - root_mean_squared_error: 7.8478
Epoch 499/499
10/10 [==============================] - 0s 4ms/step - loss: 53.9489 - root_mean_squared_error: 7.3450

Evaluation

https://gist.github.com/dheerajskylark/2ffed75ca204e1ea8cb4512971f849af

https://gist.github.com/dheerajskylark/bf2c3a6951fd49520c682d6087e87f08

https://gist.github.com/dheerajskylark/b28e14c1ac8265d197608a92efa36a1f

Conclusion

The model created is able to predict RUL with RMSE ~7.

Platform : cAInvas

Code: Here

Written By: Dheeraj Perumandla