In [1]:
#libraries
import pandas as pd
import numpy as np
import datetime
from datetime import datetime  
import csv
import os
from os import listdir
import json
import csv
import sys
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
import tensorflow as tf
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.layers import RNN
#from keras.utils.np_utils import to_categorical
import keras.backend as K
from keras import regularizers,optimizers
from keras.models import load_model
from sklearn.metrics import accuracy_score
from sklearn.metrics import confusion_matrix
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import RepeatedKFold 
from sklearn.metrics import mean_squared_error
from sklearn.metrics import mean_absolute_error
from sklearn.metrics import r2_score
from sklearn import tree
#from sklearn.externals.six import StringIO  
#import six
from six import StringIO
from IPython.display import Image  
from sklearn.tree import export_graphviz
import pydotplus
np.random.seed(2018)
2023-08-21 08:13:42.732112: I tensorflow/tsl/cuda/cudart_stub.cc:28] Could not find cuda drivers on your machine, GPU will not be used.
2023-08-21 08:13:42.872680: I tensorflow/tsl/cuda/cudart_stub.cc:28] Could not find cuda drivers on your machine, GPU will not be used.
2023-08-21 08:13:42.875091: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.
To enable the following instructions: AVX2 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.
2023-08-21 08:13:45.095519: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT
In [2]:
import pymysql

#establish the connection to the mysql database
host = "192.168.88.187"
port = "3306"
user = "backblaze"
password = "Testing.2023"
database = "backblaze_ml_full"

conn = pymysql.connect(
    host=host,
    port=int(3306),
    user=user,
    passwd=password,
    db=database,
    charset='utf8mb4')
In [3]:
sqldf = pd.read_sql_query("select date, serial_number, model, capacity_bytes, days_to_failure, failure, smart_1_normalized, smart_3_normalized, smart_5_normalized, smart_7_normalized, smart_9_normalized, smart_187_normalized, smart_189_normalized, smart_194_normalized, smart_197_normalized from drive_stats where date >= '2014-03-01' and serial_number in (select distinct(serial_number) from drive_stats where failure=1 and date >= '2014-03-01')", conn)
sqldf
/tmp/ipykernel_2178234/1261091465.py:1: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy.
  sqldf = pd.read_sql_query("select date, serial_number, model, capacity_bytes, days_to_failure, failure, smart_1_normalized, smart_3_normalized, smart_5_normalized, smart_7_normalized, smart_9_normalized, smart_187_normalized, smart_189_normalized, smart_194_normalized, smart_197_normalized from drive_stats where date >= '2014-03-01' and serial_number in (select distinct(serial_number) from drive_stats where failure=1 and date >= '2014-03-01')", conn)
Out[3]:
date serial_number model capacity_bytes days_to_failure failure smart_1_normalized smart_3_normalized smart_5_normalized smart_7_normalized smart_9_normalized smart_187_normalized smart_189_normalized smart_194_normalized smart_197_normalized
0 2014-03-01 MJ1311YNG36USA Hitachi HDS5C3030ALA630 3000592982016 991 0 100.0 138.0 100.0 100.0 98.0 NaN NaN 253.0 100.0
1 2014-03-01 MJ1311YNG733NA Hitachi HDS5C3030ALA630 3000592982016 840 0 100.0 100.0 100.0 100.0 98.0 NaN NaN 250.0 100.0
2 2014-03-01 W3009AX6 ST4000DM000 4000787030016 54 0 119.0 91.0 100.0 87.0 93.0 100.0 99.0 26.0 100.0
3 2014-03-01 WD-WCAV5M690585 WDC WD10EADS 1000204886016 409 0 200.0 191.0 200.0 100.0 68.0 NaN NaN 127.0 200.0
4 2014-03-01 S1F0CSW2 ST3000DM001 3000592982016 229 0 114.0 92.0 100.0 89.0 84.0 100.0 100.0 23.0 100.0
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
14769522 2023-03-31 7LZ01G30 Seagate BarraCuda SSD ZA250CM10002 250059350016 0 0 100.0 NaN NaN NaN 100.0 NaN NaN 83.0 NaN
14769523 2023-03-31 9JG4657T WDC WUH721414ALE6L4 14000519643136 0 0 100.0 85.0 100.0 100.0 98.0 NaN NaN 55.0 100.0
14769524 2023-03-31 6090A00RFVKG TOSHIBA MG08ACA16TA 16000900661248 0 0 100.0 100.0 100.0 100.0 87.0 NaN NaN 100.0 100.0
14769525 2023-03-31 51R0A2Q8FVGG TOSHIBA MG08ACA16TE 16000900661248 0 0 100.0 100.0 100.0 100.0 70.0 NaN NaN 100.0 100.0
14769526 2023-03-31 7QT032NR Seagate BarraCuda 120 SSD ZA250CM10003 250059350016 0 0 100.0 NaN NaN NaN 100.0 NaN NaN 96.0 NaN

14769527 rows × 15 columns

Functions¶

In [4]:
def computeDay(group):
  group = group.sort_values('date')    #ordino in base ai giorni... dal più recente al meno
  group['DayToFailure'] = list(range(group.shape[0]-1, -1,-1 ))
  return group

#override the series_to_supervised method to work without classes
def series_to_supervised(data, n_in=1, n_out=1, dropnan=True):
  n_vars = data.shape[1]
  cols, names = list(), list()
  dataclass = data[data.columns[-1:]]
  data = data.drop(columns= ['serial_number', 'DayToFailure'], axis = 1)
  columns = data.columns
  # input sequence (t-n, ... t-1)  #non arrivo all'osservazione corrente
  for i in range(n_in-1, 0, -1):
    cols.append(data.shift(i))
    names += [(element + '(t-%d)' % (i)) for element in columns]
    
  for i in range(0, n_out):
    cols.append(data.shift(-i))
    if i == 0:
      names += [(element+'(t)') for element in columns]
    else:
      names += [(element +'(t+%d)' % (i)) for element in columns]
  
  cols.append(dataclass)   #appendo le ultime cinque colonne
  names += ['DayToFailure']
    
  agg = pd.concat(cols, axis=1)
  agg.columns = names
  if dropnan:
    agg.dropna(inplace=True)
  
  return agg
In [5]:
#Preprocessing

df = sqldf.copy()
df = df.drop('model', axis=1)
df = df.drop('capacity_bytes', axis=1)

df.date = pd.to_datetime(df.date, format='%Y-%m-%d').dt.date

scaler = MinMaxScaler(feature_range = (-1,1))
df[['smart_1_normalized', 'smart_3_normalized', 'smart_5_normalized', 'smart_7_normalized',
    'smart_9_normalized', 'smart_187_normalized', 'smart_189_normalized', 'smart_194_normalized',
    'smart_197_normalized']] = scaler.fit_transform(df[['smart_1_normalized', 'smart_3_normalized', 
    'smart_5_normalized', 'smart_7_normalized', 'smart_9_normalized', 'smart_187_normalized', 
    'smart_189_normalized', 'smart_194_normalized', 'smart_197_normalized']])

df
Out[5]:
date serial_number days_to_failure failure smart_1_normalized smart_3_normalized smart_5_normalized smart_7_normalized smart_9_normalized smart_187_normalized smart_189_normalized smart_194_normalized smart_197_normalized
0 2014-03-01 MJ1311YNG36USA 991 0 -0.005025 -0.256831 -0.211155 -0.211155 -0.227092 NaN NaN 1.000000 -0.211155
1 2014-03-01 MJ1311YNG733NA 840 0 -0.005025 -0.672131 -0.211155 -0.211155 -0.227092 NaN NaN 0.975104 -0.211155
2 2014-03-01 W3009AX6 54 0 0.185930 -0.770492 -0.211155 -0.314741 -0.266932 1.0 0.979798 -0.883817 -0.211155
3 2014-03-01 WD-WCAV5M690585 409 0 1.000000 0.322404 0.585657 -0.211155 -0.466135 NaN NaN -0.045643 0.585657
4 2014-03-01 S1F0CSW2 229 0 0.135678 -0.759563 -0.211155 -0.298805 -0.338645 1.0 1.000000 -0.908714 -0.211155
... ... ... ... ... ... ... ... ... ... ... ... ... ...
14769522 2023-03-31 7LZ01G30 0 0 -0.005025 NaN NaN NaN -0.211155 NaN NaN -0.410788 NaN
14769523 2023-03-31 9JG4657T 0 0 -0.005025 -0.836066 -0.211155 -0.211155 -0.227092 NaN NaN -0.643154 -0.211155
14769524 2023-03-31 6090A00RFVKG 0 0 -0.005025 -0.672131 -0.211155 -0.211155 -0.314741 NaN NaN -0.269710 -0.211155
14769525 2023-03-31 51R0A2Q8FVGG 0 0 -0.005025 -0.672131 -0.211155 -0.211155 -0.450199 NaN NaN -0.269710 -0.211155
14769526 2023-03-31 7QT032NR 0 0 -0.005025 NaN NaN NaN -0.211155 NaN NaN -0.302905 NaN

14769527 rows × 13 columns

In [6]:
#cleanup garbage entries -> apparently there are entries which have a failure reported on a date
#and then they still report measurements after that date -> these need to be cleared

test=df.copy();
#test
test2 = pd.DataFrame({'serial_number':test.loc[test['failure'] == 1]['serial_number'], 'failure_date':test.loc[test['failure'] == 1]['date']})

#test2

test3 = test.join(test2.set_index('serial_number'), on='serial_number')
#test3
clean = test3.drop(test3[test3['date'] > test3['failure_date']].index)
clean = clean.drop('failure_date', axis=1)
clean
Out[6]:
date serial_number days_to_failure failure smart_1_normalized smart_3_normalized smart_5_normalized smart_7_normalized smart_9_normalized smart_187_normalized smart_189_normalized smart_194_normalized smart_197_normalized
0 2014-03-01 MJ1311YNG36USA 991 0 -0.005025 -0.256831 -0.211155 -0.211155 -0.227092 NaN NaN 1.000000 -0.211155
1 2014-03-01 MJ1311YNG733NA 840 0 -0.005025 -0.672131 -0.211155 -0.211155 -0.227092 NaN NaN 0.975104 -0.211155
2 2014-03-01 W3009AX6 54 0 0.185930 -0.770492 -0.211155 -0.314741 -0.266932 1.000000 0.979798 -0.883817 -0.211155
3 2014-03-01 WD-WCAV5M690585 409 0 1.000000 0.322404 0.585657 -0.211155 -0.466135 NaN NaN -0.045643 0.585657
4 2014-03-01 S1F0CSW2 229 0 0.135678 -0.759563 -0.211155 -0.298805 -0.338645 1.000000 1.000000 -0.908714 -0.211155
... ... ... ... ... ... ... ... ... ... ... ... ... ...
14769333 2023-03-30 2AGMNB7Y 0 1 -0.005025 -0.672131 -0.211155 -0.211155 -0.243028 NaN NaN 0.078838 -0.211155
14769335 2023-03-30 8HH0KRGH 0 1 -0.246231 -0.672131 -0.211155 -0.211155 -0.235060 NaN NaN 0.278008 -0.211155
14769341 2023-03-30 ZLW16KEQ 0 1 -0.226131 -0.781421 -0.211155 -0.362550 -0.402390 0.979798 NaN -0.809129 -0.211155
14769343 2023-03-30 X0GE5KSC 0 1 -0.005025 -0.737705 -0.211155 -0.211155 -0.235060 NaN NaN -0.551867 -0.211155
14769346 2023-03-30 61B0A03NF97G 0 1 -0.005025 -0.672131 -0.211155 -0.211155 -0.498008 NaN NaN -0.269710 -0.211155

14442321 rows × 13 columns

In [7]:
df=clean.copy()
df = df.drop(columns= ['days_to_failure'], axis = 1)
df
Out[7]:
date serial_number failure smart_1_normalized smart_3_normalized smart_5_normalized smart_7_normalized smart_9_normalized smart_187_normalized smart_189_normalized smart_194_normalized smart_197_normalized
0 2014-03-01 MJ1311YNG36USA 0 -0.005025 -0.256831 -0.211155 -0.211155 -0.227092 NaN NaN 1.000000 -0.211155
1 2014-03-01 MJ1311YNG733NA 0 -0.005025 -0.672131 -0.211155 -0.211155 -0.227092 NaN NaN 0.975104 -0.211155
2 2014-03-01 W3009AX6 0 0.185930 -0.770492 -0.211155 -0.314741 -0.266932 1.000000 0.979798 -0.883817 -0.211155
3 2014-03-01 WD-WCAV5M690585 0 1.000000 0.322404 0.585657 -0.211155 -0.466135 NaN NaN -0.045643 0.585657
4 2014-03-01 S1F0CSW2 0 0.135678 -0.759563 -0.211155 -0.298805 -0.338645 1.000000 1.000000 -0.908714 -0.211155
... ... ... ... ... ... ... ... ... ... ... ... ...
14769333 2023-03-30 2AGMNB7Y 1 -0.005025 -0.672131 -0.211155 -0.211155 -0.243028 NaN NaN 0.078838 -0.211155
14769335 2023-03-30 8HH0KRGH 1 -0.246231 -0.672131 -0.211155 -0.211155 -0.235060 NaN NaN 0.278008 -0.211155
14769341 2023-03-30 ZLW16KEQ 1 -0.226131 -0.781421 -0.211155 -0.362550 -0.402390 0.979798 NaN -0.809129 -0.211155
14769343 2023-03-30 X0GE5KSC 1 -0.005025 -0.737705 -0.211155 -0.211155 -0.235060 NaN NaN -0.551867 -0.211155
14769346 2023-03-30 61B0A03NF97G 1 -0.005025 -0.672131 -0.211155 -0.211155 -0.498008 NaN NaN -0.269710 -0.211155

14442321 rows × 12 columns

In [8]:
dfHour = df.groupby(['serial_number']).apply(computeDay)
dfHour = dfHour[dfHour.DayToFailure <= 45]
dfHour = dfHour.drop(columns = ['date'])
dfHour= dfHour.drop(columns= ['failure','serial_number'], axis=1)
dfHour=dfHour.reset_index()
dfHour= dfHour.drop(columns= ['level_1'], axis=1)

window=15

print('Creating the sequence')

dfHourSequence =  dfHour.groupby(['serial_number']).apply(series_to_supervised, n_in=window, n_out=1, dropnan=True)
dfHourSequence
Creating the sequence
Out[8]:
smart_1_normalized(t-14) smart_3_normalized(t-14) smart_5_normalized(t-14) smart_7_normalized(t-14) smart_9_normalized(t-14) smart_187_normalized(t-14) smart_189_normalized(t-14) smart_194_normalized(t-14) smart_197_normalized(t-14) smart_1_normalized(t-13) ... smart_1_normalized(t) smart_3_normalized(t) smart_5_normalized(t) smart_7_normalized(t) smart_9_normalized(t) smart_187_normalized(t) smart_189_normalized(t) smart_194_normalized(t) smart_197_normalized(t) DayToFailure
serial_number
5VML01P0 42815 0.195980 -0.704918 -0.211155 -0.314741 -0.593625 1.0 1.0 -0.875519 -0.211155 0.165829 ... 0.165829 -0.704918 -0.211155 -0.314741 -0.601594 1.000000 1.0 -0.875519 -0.211155 31
42816 0.165829 -0.704918 -0.211155 -0.314741 -0.593625 1.0 1.0 -0.875519 -0.211155 0.015075 ... 0.105528 -0.704918 -0.211155 -0.314741 -0.601594 1.000000 1.0 -0.875519 -0.211155 30
42817 0.015075 -0.704918 -0.211155 -0.314741 -0.593625 1.0 1.0 -0.883817 -0.211155 0.165829 ... 0.175879 -0.704918 -0.211155 -0.314741 -0.601594 1.000000 1.0 -0.875519 -0.211155 29
42818 0.165829 -0.704918 -0.211155 -0.314741 -0.593625 1.0 1.0 -0.875519 -0.211155 0.095477 ... 0.135678 -0.704918 -0.211155 -0.314741 -0.601594 1.000000 1.0 -0.875519 -0.211155 28
42819 0.095477 -0.704918 -0.211155 -0.314741 -0.593625 1.0 1.0 -0.875519 -0.211155 0.165829 ... 0.175879 -0.704918 -0.211155 -0.314741 -0.601594 1.000000 1.0 -0.875519 -0.211155 27
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
ZTT3STWF 785169 -0.226131 -0.693989 -0.211155 -0.330677 -0.274900 1.0 1.0 -0.941909 -0.211155 -0.175879 ... -0.507538 -0.693989 -0.211155 -0.330677 -0.274900 0.414141 1.0 -0.950207 -0.211155 4
785170 -0.175879 -0.693989 -0.211155 -0.330677 -0.274900 1.0 1.0 -0.941909 -0.211155 -0.185930 ... -0.507538 -0.693989 -0.211155 -0.330677 -0.274900 0.414141 1.0 -0.950207 -0.211155 3
785171 -0.185930 -0.693989 -0.211155 -0.330677 -0.274900 1.0 1.0 -0.941909 -0.211155 -0.195980 ... -0.507538 -0.693989 -0.211155 -0.330677 -0.274900 0.414141 1.0 -0.950207 -0.211155 2
785172 -0.195980 -0.693989 -0.211155 -0.330677 -0.274900 1.0 1.0 -0.941909 -0.211155 -0.195980 ... -0.507538 -0.693989 -0.211155 -0.330677 -0.274900 0.414141 1.0 -0.950207 -0.211155 1
785173 -0.195980 -0.693989 -0.211155 -0.330677 -0.274900 1.0 1.0 -0.941909 -0.211155 -0.185930 ... -0.507538 -0.693989 -0.211155 -0.330677 -0.274900 0.414141 1.0 -0.950207 -0.211155 0

297652 rows × 136 columns

In [9]:
print('Dividing into train test')

X_train, X_rim, y_train, y_rim = train_test_split(dfHourSequence[dfHourSequence.columns[:-1]], 
                                                  dfHourSequence[dfHourSequence.columns[-1:]] ,
                                                  stratify=dfHourSequence[dfHourSequence.columns[-1:]], 
                                                  test_size=0.30)
Dividing into train test
In [10]:
print(y_train)
print(y_train.columns)
                      DayToFailure
serial_number                     
W300R8E5      276228             0
S300Z7TB      208856             2
Z303XYVL      423370             7
ZA11TPF5      517945             6
ZA13YP2L      543729             2
...                            ...
Z305D68J      486279             8
ZA180ZZE      587034             2
9XW04MBA      94294              8
ZA13KB6X      538436            14
Z303WPCM      422614            18

[208356 rows x 1 columns]
Index(['DayToFailure'], dtype='object')
In [11]:
X_val, X_test, y_val, y_test = train_test_split(X_rim, y_rim ,stratify=y_rim, test_size=0.50)
In [12]:
X_train = pd.concat([X_train, pd.DataFrame(columns = ['DayToFailure'])], sort = True)
X_val = pd.concat([X_val,  pd.DataFrame(columns = ['DayToFailure'])], sort = True)
X_test = pd.concat([X_test, pd.DataFrame(columns = ['DayToFailure'])], sort = True)

X_train[['DayToFailure']] = y_train.values
X_val[['DayToFailure']] = y_val.values
X_test[['DayToFailure']] = y_test.values
In [13]:
X_train
#X_val
#X_test
Out[13]:
DayToFailure smart_187_normalized(t) smart_187_normalized(t-1) smart_187_normalized(t-10) smart_187_normalized(t-11) smart_187_normalized(t-12) smart_187_normalized(t-13) smart_187_normalized(t-14) smart_187_normalized(t-2) smart_187_normalized(t-3) ... smart_9_normalized(t-13) smart_9_normalized(t-14) smart_9_normalized(t-2) smart_9_normalized(t-3) smart_9_normalized(t-4) smart_9_normalized(t-5) smart_9_normalized(t-6) smart_9_normalized(t-7) smart_9_normalized(t-8) smart_9_normalized(t-9)
W300R8E5 276228 0 0.939394 0.959596 0.959596 0.959596 0.959596 0.959596 0.959596 0.959596 0.959596 ... -0.338645 -0.338645 -0.338645 -0.338645 -0.338645 -0.338645 -0.338645 -0.338645 -0.338645 -0.338645
S300Z7TB 208856 2 0.919192 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 ... -0.386454 -0.386454 -0.386454 -0.386454 -0.386454 -0.386454 -0.386454 -0.386454 -0.386454 -0.386454
Z303XYVL 423370 7 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 ... -0.537849 -0.537849 -0.537849 -0.537849 -0.537849 -0.537849 -0.537849 -0.537849 -0.537849 -0.537849
ZA11TPF5 517945 6 0.959596 0.979798 1.000000 1.000000 1.000000 1.000000 1.000000 0.979798 1.000000 ... -0.482072 -0.482072 -0.482072 -0.482072 -0.482072 -0.482072 -0.482072 -0.482072 -0.482072 -0.482072
ZA13YP2L 543729 2 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 ... -0.617530 -0.617530 -0.617530 -0.617530 -0.617530 -0.617530 -0.617530 -0.617530 -0.617530 -0.617530
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
Z305D68J 486279 8 0.393939 0.393939 0.393939 0.393939 0.393939 0.393939 0.393939 0.393939 0.393939 ... -0.322709 -0.322709 -0.322709 -0.322709 -0.322709 -0.322709 -0.322709 -0.322709 -0.322709 -0.322709
ZA180ZZE 587034 2 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 ... -0.513944 -0.513944 -0.521912 -0.521912 -0.521912 -0.521912 -0.521912 -0.521912 -0.521912 -0.521912
9XW04MBA 94294 8 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 ... -0.442231 -0.442231 -0.442231 -0.442231 -0.442231 -0.442231 -0.442231 -0.442231 -0.442231 -0.442231
ZA13KB6X 538436 14 0.939394 0.939394 0.939394 0.939394 0.939394 0.939394 0.939394 0.939394 0.939394 ... -0.553785 -0.553785 -0.553785 -0.553785 -0.553785 -0.553785 -0.553785 -0.553785 -0.553785 -0.553785
Z303WPCM 422614 18 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 ... -0.211155 -0.211155 -0.211155 -0.211155 -0.211155 -0.211155 -0.211155 -0.211155 -0.211155 -0.211155

208356 rows × 136 columns

In [14]:
X_train.shape
Out[14]:
(208356, 136)
In [15]:
X_val.shape
Out[15]:
(44648, 136)
In [16]:
Xtrain = X_train.copy()
Xtrain = Xtrain.drop(columns=['DayToFailure'], axis=1 )
Xtrain.shape
#Xtrain
Out[16]:
(208356, 135)
In [17]:
Xval = X_val.copy()
Xval = Xval.drop(columns=['DayToFailure'], axis=1 )
Xval.shape
Out[17]:
(44648, 135)
In [18]:
yTest = X_test[['DayToFailure']].values
#yTest
In [19]:
Xtest = X_test.drop(columns=['DayToFailure'], axis=1 )
#Xtest
In [20]:
#reshape with window
Xtrain = Xtrain.values.reshape(Xtrain.shape[0], window, int(Xtrain.shape[1]/window))
Xval = Xval.values.reshape(Xval.shape[0], window, int(Xval.shape[1]/window))
Xtest= Xtest.values.reshape(Xtest.shape[0], window, int(Xtest.shape[1]/window))
In [21]:
ytrain = X_train[['DayToFailure']].values
yVal = X_val[['DayToFailure']].values
In [22]:
print(Xtrain.shape)
print(Xval.shape)
print(Xtest.shape)

print(ytrain.shape)
print(yVal.shape)
print(yTest.shape)
(208356, 15, 9)
(44648, 15, 9)
(44648, 15, 9)
(208356, 1)
(44648, 1)
(44648, 1)

Model¶

In [23]:
from tensorflow.keras.layers import Bidirectional
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import Dropout
import keras

#same as experiment6 - BiLSTM
def build_model():
  dp_lvl = 0.1
  model = Sequential()
  model.add(Bidirectional(LSTM(128, input_shape=(window, 9), return_sequences =  True, activation = "tanh" )))
  model.add(Bidirectional(LSTM(64, return_sequences =  True, activation = "tanh" )))
  model.add(Bidirectional(LSTM(32, activation="tanh")))
  model.add(Dense(96, activation='relu'))
  model.add(Dense(128, activation='relu'))
  model.add(Dense(1))
  return model

Training¶

In [24]:
#same as experiment6 - LSTM
epoch = 150
historyvet =[]
model = build_model()    
best_acc= 0.0

#adam = optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0,amsgrad=False)
adam = tf.keras.optimizers.legacy.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0,amsgrad=False)
#adam=tf.keras.optimizers.Adam(learning_rate=0.001)
model.compile(loss='mse', optimizer=adam)

for epoch in range(0,epoch):
  print('Epoch {%d}' %(epoch))
  #model.fit(Xtrain, ytrain, epochs=1, batch_size=500, validation_data= (Xval,yVal), shuffle=True)
  history = model.fit(Xtrain, ytrain, epochs=1, batch_size=500, validation_data= (Xval,yVal))
  historyvet.append(history.history)
    
model.save('bilstm_predict_rul_experiment8_extended_full_take1.h5')
model.summary()
/usr/local/lib/python3.10/dist-packages/keras/src/optimizers/legacy/adam.py:118: UserWarning: The `lr` argument is deprecated, use `learning_rate` instead.
  super().__init__(name, **kwargs)
Epoch {0}
417/417 [==============================] - 77s 152ms/step - loss: 92.7738 - val_loss: 85.0679
Epoch {1}
417/417 [==============================] - 59s 142ms/step - loss: 84.9058 - val_loss: 84.3463
Epoch {2}
417/417 [==============================] - 60s 144ms/step - loss: 84.4310 - val_loss: 84.2781
Epoch {3}
417/417 [==============================] - 59s 142ms/step - loss: 84.3702 - val_loss: 84.1577
Epoch {4}
417/417 [==============================] - 60s 144ms/step - loss: 84.2015 - val_loss: 83.9575
Epoch {5}
417/417 [==============================] - 60s 144ms/step - loss: 84.0918 - val_loss: 84.2412
Epoch {6}
417/417 [==============================] - 60s 143ms/step - loss: 84.1157 - val_loss: 83.4742
Epoch {7}
417/417 [==============================] - 60s 144ms/step - loss: 83.7835 - val_loss: 83.4925
Epoch {8}
417/417 [==============================] - 60s 143ms/step - loss: 83.8147 - val_loss: 84.3453
Epoch {9}
417/417 [==============================] - 61s 145ms/step - loss: 84.3719 - val_loss: 83.6851
Epoch {10}
417/417 [==============================] - 60s 144ms/step - loss: 83.7955 - val_loss: 83.4136
Epoch {11}
417/417 [==============================] - 60s 144ms/step - loss: 83.6265 - val_loss: 83.2850
Epoch {12}
417/417 [==============================] - 60s 143ms/step - loss: 83.6535 - val_loss: 83.3932
Epoch {13}
417/417 [==============================] - 60s 143ms/step - loss: 83.4743 - val_loss: 83.1930
Epoch {14}
417/417 [==============================] - 60s 145ms/step - loss: 83.4758 - val_loss: 83.2547
Epoch {15}
417/417 [==============================] - 60s 144ms/step - loss: 83.3398 - val_loss: 83.1598
Epoch {16}
417/417 [==============================] - 59s 141ms/step - loss: 83.3910 - val_loss: 83.4111
Epoch {17}
417/417 [==============================] - 60s 143ms/step - loss: 83.3572 - val_loss: 83.0150
Epoch {18}
417/417 [==============================] - 60s 144ms/step - loss: 83.3223 - val_loss: 82.9693
Epoch {19}
417/417 [==============================] - 60s 143ms/step - loss: 83.3011 - val_loss: 83.3447
Epoch {20}
417/417 [==============================] - 60s 144ms/step - loss: 83.2284 - val_loss: 82.9084
Epoch {21}
417/417 [==============================] - 60s 144ms/step - loss: 83.2942 - val_loss: 82.9613
Epoch {22}
417/417 [==============================] - 59s 142ms/step - loss: 83.3120 - val_loss: 83.1172
Epoch {23}
417/417 [==============================] - 60s 143ms/step - loss: 83.1626 - val_loss: 82.9673
Epoch {24}
417/417 [==============================] - 60s 143ms/step - loss: 83.1042 - val_loss: 82.8575
Epoch {25}
417/417 [==============================] - 60s 143ms/step - loss: 83.1136 - val_loss: 82.8171
Epoch {26}
417/417 [==============================] - 59s 143ms/step - loss: 83.1160 - val_loss: 82.7070
Epoch {27}
417/417 [==============================] - 59s 142ms/step - loss: 83.2719 - val_loss: 83.0980
Epoch {28}
417/417 [==============================] - 59s 142ms/step - loss: 83.1043 - val_loss: 82.8322
Epoch {29}
417/417 [==============================] - 60s 144ms/step - loss: 83.3038 - val_loss: 83.2858
Epoch {30}
417/417 [==============================] - 60s 144ms/step - loss: 83.2308 - val_loss: 83.0850
Epoch {31}
417/417 [==============================] - 60s 144ms/step - loss: 83.2239 - val_loss: 83.0807
Epoch {32}
417/417 [==============================] - 60s 144ms/step - loss: 83.0301 - val_loss: 83.3579
Epoch {33}
417/417 [==============================] - 68s 162ms/step - loss: 82.9915 - val_loss: 82.8932
Epoch {34}
417/417 [==============================] - 67s 160ms/step - loss: 83.0412 - val_loss: 82.8101
Epoch {35}
417/417 [==============================] - 67s 161ms/step - loss: 82.9429 - val_loss: 82.7489
Epoch {36}
417/417 [==============================] - 62s 149ms/step - loss: 82.9136 - val_loss: 82.7018
Epoch {37}
417/417 [==============================] - 60s 143ms/step - loss: 83.0506 - val_loss: 83.3598
Epoch {38}
417/417 [==============================] - 61s 145ms/step - loss: 83.2241 - val_loss: 83.1517
Epoch {39}
417/417 [==============================] - 60s 144ms/step - loss: 83.0897 - val_loss: 83.0866
Epoch {40}
417/417 [==============================] - 60s 144ms/step - loss: 82.9377 - val_loss: 82.7396
Epoch {41}
417/417 [==============================] - 60s 143ms/step - loss: 83.1042 - val_loss: 82.9703
Epoch {42}
417/417 [==============================] - 60s 144ms/step - loss: 82.9680 - val_loss: 82.7980
Epoch {43}
417/417 [==============================] - 60s 143ms/step - loss: 82.9955 - val_loss: 82.9725
Epoch {44}
417/417 [==============================] - 60s 143ms/step - loss: 83.0009 - val_loss: 83.3855
Epoch {45}
417/417 [==============================] - 60s 143ms/step - loss: 82.9845 - val_loss: 82.7954
Epoch {46}
417/417 [==============================] - 60s 145ms/step - loss: 82.9332 - val_loss: 82.8449
Epoch {47}
417/417 [==============================] - 59s 143ms/step - loss: 83.0175 - val_loss: 82.7920
Epoch {48}
417/417 [==============================] - 60s 144ms/step - loss: 82.8879 - val_loss: 82.6756
Epoch {49}
417/417 [==============================] - 60s 143ms/step - loss: 82.7670 - val_loss: 82.8262
Epoch {50}
417/417 [==============================] - 60s 144ms/step - loss: 82.9561 - val_loss: 82.7425
Epoch {51}
417/417 [==============================] - 60s 143ms/step - loss: 82.6846 - val_loss: 82.7412
Epoch {52}
417/417 [==============================] - 60s 144ms/step - loss: 83.0076 - val_loss: 82.7753
Epoch {53}
417/417 [==============================] - 60s 143ms/step - loss: 82.9550 - val_loss: 82.7250
Epoch {54}
417/417 [==============================] - 60s 144ms/step - loss: 82.7550 - val_loss: 82.9107
Epoch {55}
417/417 [==============================] - 60s 143ms/step - loss: 82.7874 - val_loss: 82.6132
Epoch {56}
417/417 [==============================] - 60s 143ms/step - loss: 82.8413 - val_loss: 82.9596
Epoch {57}
417/417 [==============================] - 60s 144ms/step - loss: 82.7112 - val_loss: 82.4896
Epoch {58}
417/417 [==============================] - 60s 143ms/step - loss: 82.6846 - val_loss: 82.7633
Epoch {59}
417/417 [==============================] - 59s 142ms/step - loss: 82.7705 - val_loss: 82.7061
Epoch {60}
417/417 [==============================] - 60s 143ms/step - loss: 82.7399 - val_loss: 82.5875
Epoch {61}
417/417 [==============================] - 60s 143ms/step - loss: 82.5609 - val_loss: 83.1517
Epoch {62}
417/417 [==============================] - 60s 143ms/step - loss: 82.5973 - val_loss: 82.6425
Epoch {63}
417/417 [==============================] - 59s 142ms/step - loss: 82.6945 - val_loss: 83.0288
Epoch {64}
417/417 [==============================] - 60s 143ms/step - loss: 82.6523 - val_loss: 82.2977
Epoch {65}
417/417 [==============================] - 59s 142ms/step - loss: 82.5379 - val_loss: 82.6018
Epoch {66}
417/417 [==============================] - 60s 143ms/step - loss: 82.4387 - val_loss: 82.2681
Epoch {67}
417/417 [==============================] - 61s 145ms/step - loss: 82.3575 - val_loss: 82.5561
Epoch {68}
417/417 [==============================] - 60s 144ms/step - loss: 82.2778 - val_loss: 82.8662
Epoch {69}
417/417 [==============================] - 60s 143ms/step - loss: 82.2054 - val_loss: 82.4280
Epoch {70}
417/417 [==============================] - 59s 143ms/step - loss: 82.6933 - val_loss: 82.2867
Epoch {71}
417/417 [==============================] - 60s 143ms/step - loss: 82.3694 - val_loss: 82.4201
Epoch {72}
417/417 [==============================] - 59s 142ms/step - loss: 82.3686 - val_loss: 82.2500
Epoch {73}
417/417 [==============================] - 59s 142ms/step - loss: 82.2466 - val_loss: 82.2042
Epoch {74}
417/417 [==============================] - 59s 142ms/step - loss: 82.1715 - val_loss: 82.2676
Epoch {75}
417/417 [==============================] - 60s 144ms/step - loss: 82.1705 - val_loss: 82.3283
Epoch {76}
417/417 [==============================] - 60s 145ms/step - loss: 82.0941 - val_loss: 82.1778
Epoch {77}
417/417 [==============================] - 60s 144ms/step - loss: 82.0360 - val_loss: 81.9762
Epoch {78}
417/417 [==============================] - 60s 144ms/step - loss: 81.9613 - val_loss: 82.0638
Epoch {79}
417/417 [==============================] - 60s 144ms/step - loss: 81.9519 - val_loss: 82.3367
Epoch {80}
417/417 [==============================] - 60s 143ms/step - loss: 81.8773 - val_loss: 81.8730
Epoch {81}
417/417 [==============================] - 60s 144ms/step - loss: 81.8347 - val_loss: 81.9873
Epoch {82}
417/417 [==============================] - 61s 146ms/step - loss: 81.8329 - val_loss: 82.0599
Epoch {83}
417/417 [==============================] - 60s 143ms/step - loss: 82.1322 - val_loss: 82.4606
Epoch {84}
417/417 [==============================] - 60s 143ms/step - loss: 81.8003 - val_loss: 82.0190
Epoch {85}
417/417 [==============================] - 60s 144ms/step - loss: 81.6991 - val_loss: 82.1629
Epoch {86}
417/417 [==============================] - 60s 144ms/step - loss: 81.6070 - val_loss: 82.0994
Epoch {87}
417/417 [==============================] - 60s 143ms/step - loss: 81.6543 - val_loss: 81.8484
Epoch {88}
417/417 [==============================] - 60s 144ms/step - loss: 81.5761 - val_loss: 82.1926
Epoch {89}
417/417 [==============================] - 60s 144ms/step - loss: 81.4459 - val_loss: 81.8696
Epoch {90}
417/417 [==============================] - 60s 144ms/step - loss: 81.4564 - val_loss: 81.8460
Epoch {91}
417/417 [==============================] - 60s 143ms/step - loss: 81.4737 - val_loss: 81.7963
Epoch {92}
417/417 [==============================] - 60s 143ms/step - loss: 81.2941 - val_loss: 81.6649
Epoch {93}
417/417 [==============================] - 60s 144ms/step - loss: 81.2785 - val_loss: 81.5960
Epoch {94}
417/417 [==============================] - 60s 144ms/step - loss: 81.1828 - val_loss: 82.0513
Epoch {95}
417/417 [==============================] - 60s 143ms/step - loss: 81.2188 - val_loss: 81.5714
Epoch {96}
417/417 [==============================] - 60s 144ms/step - loss: 81.0063 - val_loss: 81.7776
Epoch {97}
417/417 [==============================] - 60s 144ms/step - loss: 81.1066 - val_loss: 81.6546
Epoch {98}
417/417 [==============================] - 60s 144ms/step - loss: 81.0081 - val_loss: 81.8404
Epoch {99}
417/417 [==============================] - 60s 144ms/step - loss: 80.9043 - val_loss: 81.5661
Epoch {100}
417/417 [==============================] - 60s 144ms/step - loss: 80.8069 - val_loss: 81.6684
Epoch {101}
417/417 [==============================] - 60s 144ms/step - loss: 80.7730 - val_loss: 81.4647
Epoch {102}
417/417 [==============================] - 60s 143ms/step - loss: 80.7942 - val_loss: 81.3516
Epoch {103}
417/417 [==============================] - 60s 143ms/step - loss: 80.6219 - val_loss: 81.4007
Epoch {104}
417/417 [==============================] - 60s 145ms/step - loss: 80.6730 - val_loss: 81.1922
Epoch {105}
417/417 [==============================] - 60s 144ms/step - loss: 80.5911 - val_loss: 81.7024
Epoch {106}
417/417 [==============================] - 61s 145ms/step - loss: 80.3592 - val_loss: 81.4523
Epoch {107}
417/417 [==============================] - 60s 143ms/step - loss: 80.4429 - val_loss: 81.2451
Epoch {108}
417/417 [==============================] - 61s 145ms/step - loss: 80.3824 - val_loss: 81.1829
Epoch {109}
417/417 [==============================] - 60s 145ms/step - loss: 80.1471 - val_loss: 80.9849
Epoch {110}
417/417 [==============================] - 60s 143ms/step - loss: 80.1414 - val_loss: 81.2149
Epoch {111}
417/417 [==============================] - 60s 143ms/step - loss: 80.1953 - val_loss: 81.3142
Epoch {112}
417/417 [==============================] - 60s 144ms/step - loss: 80.1653 - val_loss: 81.0187
Epoch {113}
417/417 [==============================] - 60s 144ms/step - loss: 79.9270 - val_loss: 81.2120
Epoch {114}
417/417 [==============================] - 60s 143ms/step - loss: 79.9288 - val_loss: 80.8188
Epoch {115}
417/417 [==============================] - 60s 143ms/step - loss: 79.8722 - val_loss: 80.9501
Epoch {116}
417/417 [==============================] - 60s 144ms/step - loss: 80.4031 - val_loss: 81.3811
Epoch {117}
417/417 [==============================] - 60s 144ms/step - loss: 80.6908 - val_loss: 81.3616
Epoch {118}
417/417 [==============================] - 60s 143ms/step - loss: 80.5685 - val_loss: 81.4340
Epoch {119}
417/417 [==============================] - 60s 144ms/step - loss: 80.4992 - val_loss: 81.5162
Epoch {120}
417/417 [==============================] - 60s 144ms/step - loss: 80.4437 - val_loss: 81.0435
Epoch {121}
417/417 [==============================] - 60s 143ms/step - loss: 80.2866 - val_loss: 81.2691
Epoch {122}
417/417 [==============================] - 60s 144ms/step - loss: 79.9083 - val_loss: 80.6481
Epoch {123}
417/417 [==============================] - 60s 143ms/step - loss: 80.0511 - val_loss: 80.9611
Epoch {124}
417/417 [==============================] - 59s 143ms/step - loss: 80.0038 - val_loss: 81.0384
Epoch {125}
417/417 [==============================] - 60s 144ms/step - loss: 79.9394 - val_loss: 80.7872
Epoch {126}
417/417 [==============================] - 61s 146ms/step - loss: 79.8411 - val_loss: 81.2248
Epoch {127}
417/417 [==============================] - 60s 145ms/step - loss: 79.7553 - val_loss: 80.7922
Epoch {128}
417/417 [==============================] - 60s 144ms/step - loss: 79.7102 - val_loss: 80.8904
Epoch {129}
417/417 [==============================] - 60s 143ms/step - loss: 79.5692 - val_loss: 81.0686
Epoch {130}
417/417 [==============================] - 60s 143ms/step - loss: 79.4772 - val_loss: 80.6181
Epoch {131}
417/417 [==============================] - 60s 143ms/step - loss: 79.3856 - val_loss: 80.7893
Epoch {132}
417/417 [==============================] - 60s 143ms/step - loss: 79.2643 - val_loss: 80.4530
Epoch {133}
417/417 [==============================] - 60s 143ms/step - loss: 79.4939 - val_loss: 80.5922
Epoch {134}
417/417 [==============================] - 60s 143ms/step - loss: 79.1094 - val_loss: 80.3704
Epoch {135}
417/417 [==============================] - 60s 144ms/step - loss: 78.8106 - val_loss: 80.4387
Epoch {136}
417/417 [==============================] - 60s 144ms/step - loss: 78.7017 - val_loss: 80.3484
Epoch {137}
417/417 [==============================] - 60s 143ms/step - loss: 78.4793 - val_loss: 79.9072
Epoch {138}
417/417 [==============================] - 60s 143ms/step - loss: 78.3490 - val_loss: 80.2861
Epoch {139}
417/417 [==============================] - 60s 144ms/step - loss: 78.1343 - val_loss: 80.2407
Epoch {140}
417/417 [==============================] - 60s 143ms/step - loss: 78.3711 - val_loss: 80.1231
Epoch {141}
417/417 [==============================] - 60s 143ms/step - loss: 77.9826 - val_loss: 79.8767
Epoch {142}
417/417 [==============================] - 60s 143ms/step - loss: 77.9521 - val_loss: 79.5399
Epoch {143}
417/417 [==============================] - 60s 144ms/step - loss: 77.7578 - val_loss: 79.9468
Epoch {144}
417/417 [==============================] - 60s 145ms/step - loss: 77.5250 - val_loss: 79.7818
Epoch {145}
417/417 [==============================] - 61s 145ms/step - loss: 77.3209 - val_loss: 79.3396
Epoch {146}
417/417 [==============================] - 60s 144ms/step - loss: 77.3386 - val_loss: 79.3631
Epoch {147}
417/417 [==============================] - 60s 145ms/step - loss: 77.2172 - val_loss: 79.6813
Epoch {148}
417/417 [==============================] - 60s 145ms/step - loss: 77.1266 - val_loss: 79.0510
Epoch {149}
417/417 [==============================] - 60s 145ms/step - loss: 77.0287 - val_loss: 79.3780
Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 bidirectional (Bidirection  (None, 15, 256)           141312    
 al)                                                             
                                                                 
 bidirectional_1 (Bidirecti  (None, 15, 128)           164352    
 onal)                                                           
                                                                 
 bidirectional_2 (Bidirecti  (None, 64)                41216     
 onal)                                                           
                                                                 
 dense (Dense)               (None, 96)                6240      
                                                                 
 dense_1 (Dense)             (None, 128)               12416     
                                                                 
 dense_2 (Dense)             (None, 1)                 129       
                                                                 
=================================================================
Total params: 365665 (1.39 MB)
Trainable params: 365665 (1.39 MB)
Non-trainable params: 0 (0.00 Byte)
_________________________________________________________________
/usr/local/lib/python3.10/dist-packages/keras/src/engine/training.py:3000: UserWarning: You are saving your model as an HDF5 file via `model.save()`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')`.
  saving_api.save_model(
In [25]:
lossTrain=[]
lossval=[]

for element in historyvet:
   lossTrain.append(element['loss'][0])
   lossval.append(element['val_loss'][0])

plt.plot(lossTrain, color='g')
plt.plot(lossval, color='r')
plt.title('model loss')
plt.xlabel('epoch')
plt.ylabel('Loss')
plt.legend(['train', 'validation'], loc='upper right')
plt.show()
In [26]:
#skip this cell if the above one finished and you are continuing the work , otherwise if say you disconnected the notebook and want to resume run this one to load the model it generated overnight
model = load_model( 'bilstm_predict_rul_experiment8_extended_full_take1.h5')
print(model.evaluate(Xtest,yTest))
1396/1396 [==============================] - 33s 22ms/step - loss: 79.4987
79.49868774414062
In [27]:
pred = model.predict(Xtest)
1396/1396 [==============================] - 33s 22ms/step
In [28]:
y = yTest.copy()
yhat = pred.copy()

# calculate manually
d = y - yhat
mse_f = np.mean(d**2)
mae_f = np.mean(abs(d))
rmse_f = np.sqrt(mse_f)
r2_f = 1-(sum(d**2)/sum((y-np.mean(y))**2))

print("Results by manual calculation:")
print("MAE:",mae_f) #mean absolute error - difference between the original and predicted extracted by avg the abs diff over dataset
print("MSE:", mse_f) #mean squared error - diff btw orig and pred extracted by squared the avg diff over the dataset
print("RMSE:", rmse_f) #root mean squared error - is the error rate by the square root of MSE
print("R-Squared:", r2_f) #coefficient of determination - the higher the better 
Results by manual calculation:
MAE: 7.590267282593418
MSE: 79.49876356975359
RMSE: 8.916207914228648
R-Squared: [0.06755997]

More training as it looks like it wants to get somewhere interesting

In [29]:
#another 150 epochs to train
historyvet =[]
model = load_model( 'bilstm_predict_rul_experiment8_extended_full_take1.h5')
epoch = 150

for epoch in range(0,epoch):
  print('Epoch {%d}' %(epoch))
  history = model.fit(Xtrain, ytrain, epochs=1, batch_size=500, validation_data= (Xval,yVal), shuffle=True)
  historyvet.append(history.history)

model.save('bilstm_predict_rul_experiment8_extended_full_take1_part2.h5')
model.summary()
Epoch {0}
417/417 [==============================] - 70s 152ms/step - loss: 76.8524 - val_loss: 79.0652
Epoch {1}
417/417 [==============================] - 61s 147ms/step - loss: 76.6676 - val_loss: 79.3731
Epoch {2}
417/417 [==============================] - 61s 146ms/step - loss: 76.6653 - val_loss: 78.7874
Epoch {3}
417/417 [==============================] - 61s 146ms/step - loss: 76.4369 - val_loss: 78.9934
Epoch {4}
417/417 [==============================] - 61s 145ms/step - loss: 76.4751 - val_loss: 78.8808
Epoch {5}
417/417 [==============================] - 61s 145ms/step - loss: 76.4544 - val_loss: 78.9301
Epoch {6}
417/417 [==============================] - 61s 146ms/step - loss: 76.3133 - val_loss: 78.7373
Epoch {7}
417/417 [==============================] - 60s 145ms/step - loss: 76.0597 - val_loss: 78.6485
Epoch {8}
417/417 [==============================] - 61s 145ms/step - loss: 75.9886 - val_loss: 78.5359
Epoch {9}
417/417 [==============================] - 61s 146ms/step - loss: 75.8782 - val_loss: 78.7132
Epoch {10}
417/417 [==============================] - 61s 147ms/step - loss: 76.1895 - val_loss: 78.6017
Epoch {11}
417/417 [==============================] - 62s 148ms/step - loss: 75.8478 - val_loss: 78.5068
Epoch {12}
417/417 [==============================] - 61s 145ms/step - loss: 75.6287 - val_loss: 78.6277
Epoch {13}
417/417 [==============================] - 61s 145ms/step - loss: 75.5390 - val_loss: 78.1562
Epoch {14}
417/417 [==============================] - 60s 144ms/step - loss: 75.3792 - val_loss: 77.9676
Epoch {15}
417/417 [==============================] - 60s 144ms/step - loss: 75.6322 - val_loss: 77.9345
Epoch {16}
417/417 [==============================] - 60s 145ms/step - loss: 75.2440 - val_loss: 78.0260
Epoch {17}
417/417 [==============================] - 60s 145ms/step - loss: 75.2111 - val_loss: 78.2623
Epoch {18}
417/417 [==============================] - 61s 146ms/step - loss: 75.0694 - val_loss: 78.1301
Epoch {19}
417/417 [==============================] - 61s 147ms/step - loss: 75.0635 - val_loss: 78.2043
Epoch {20}
417/417 [==============================] - 61s 147ms/step - loss: 75.0756 - val_loss: 81.3052
Epoch {21}
417/417 [==============================] - 61s 147ms/step - loss: 77.9672 - val_loss: 80.5546
Epoch {22}
417/417 [==============================] - 61s 146ms/step - loss: 78.9624 - val_loss: 80.1643
Epoch {23}
417/417 [==============================] - 60s 145ms/step - loss: 78.4155 - val_loss: 79.7000
Epoch {24}
417/417 [==============================] - 61s 146ms/step - loss: 78.1290 - val_loss: 79.6455
Epoch {25}
417/417 [==============================] - 60s 145ms/step - loss: 77.7739 - val_loss: 79.7304
Epoch {26}
417/417 [==============================] - 60s 145ms/step - loss: 77.5086 - val_loss: 79.0950
Epoch {27}
417/417 [==============================] - 61s 146ms/step - loss: 77.2861 - val_loss: 79.7094
Epoch {28}
417/417 [==============================] - 60s 145ms/step - loss: 77.2039 - val_loss: 78.9357
Epoch {29}
417/417 [==============================] - 61s 146ms/step - loss: 76.8295 - val_loss: 79.1521
Epoch {30}
417/417 [==============================] - 61s 146ms/step - loss: 76.5209 - val_loss: 78.5403
Epoch {31}
417/417 [==============================] - 60s 145ms/step - loss: 76.3899 - val_loss: 79.1579
Epoch {32}
417/417 [==============================] - 60s 145ms/step - loss: 76.1270 - val_loss: 78.5326
Epoch {33}
417/417 [==============================] - 61s 147ms/step - loss: 76.0684 - val_loss: 78.1595
Epoch {34}
417/417 [==============================] - 61s 146ms/step - loss: 75.7395 - val_loss: 78.4831
Epoch {35}
417/417 [==============================] - 61s 146ms/step - loss: 75.5531 - val_loss: 77.7511
Epoch {36}
417/417 [==============================] - 61s 146ms/step - loss: 75.5603 - val_loss: 78.5110
Epoch {37}
417/417 [==============================] - 61s 145ms/step - loss: 75.0463 - val_loss: 78.0663
Epoch {38}
417/417 [==============================] - 61s 147ms/step - loss: 74.7893 - val_loss: 77.6177
Epoch {39}
417/417 [==============================] - 61s 145ms/step - loss: 74.6087 - val_loss: 77.2369
Epoch {40}
417/417 [==============================] - 61s 147ms/step - loss: 74.4060 - val_loss: 77.1111
Epoch {41}
417/417 [==============================] - 61s 146ms/step - loss: 74.1644 - val_loss: 77.0091
Epoch {42}
417/417 [==============================] - 60s 145ms/step - loss: 74.1009 - val_loss: 77.3582
Epoch {43}
417/417 [==============================] - 61s 146ms/step - loss: 73.8434 - val_loss: 77.2329
Epoch {44}
417/417 [==============================] - 60s 144ms/step - loss: 73.4787 - val_loss: 76.2893
Epoch {45}
417/417 [==============================] - 61s 145ms/step - loss: 73.2203 - val_loss: 76.7871
Epoch {46}
417/417 [==============================] - 61s 145ms/step - loss: 73.0619 - val_loss: 76.7218
Epoch {47}
417/417 [==============================] - 60s 145ms/step - loss: 72.9442 - val_loss: 75.7803
Epoch {48}
417/417 [==============================] - 61s 145ms/step - loss: 72.5032 - val_loss: 75.5949
Epoch {49}
417/417 [==============================] - 61s 147ms/step - loss: 72.3193 - val_loss: 76.1428
Epoch {50}
417/417 [==============================] - 61s 146ms/step - loss: 72.0082 - val_loss: 75.9672
Epoch {51}
417/417 [==============================] - 61s 146ms/step - loss: 71.8284 - val_loss: 75.6700
Epoch {52}
417/417 [==============================] - 61s 146ms/step - loss: 71.5138 - val_loss: 75.5191
Epoch {53}
417/417 [==============================] - 61s 146ms/step - loss: 71.3870 - val_loss: 75.3812
Epoch {54}
417/417 [==============================] - 61s 145ms/step - loss: 71.0655 - val_loss: 74.7498
Epoch {55}
417/417 [==============================] - 60s 145ms/step - loss: 70.5846 - val_loss: 74.7026
Epoch {56}
417/417 [==============================] - 61s 145ms/step - loss: 70.5416 - val_loss: 74.3217
Epoch {57}
417/417 [==============================] - 61s 145ms/step - loss: 70.4242 - val_loss: 74.5481
Epoch {58}
417/417 [==============================] - 60s 145ms/step - loss: 70.0230 - val_loss: 75.3904
Epoch {59}
417/417 [==============================] - 61s 146ms/step - loss: 69.9979 - val_loss: 74.8138
Epoch {60}
417/417 [==============================] - 60s 145ms/step - loss: 69.4330 - val_loss: 73.5628
Epoch {61}
417/417 [==============================] - 61s 146ms/step - loss: 69.2424 - val_loss: 73.5522
Epoch {62}
417/417 [==============================] - 61s 145ms/step - loss: 69.0664 - val_loss: 74.0378
Epoch {63}
417/417 [==============================] - 61s 146ms/step - loss: 68.9708 - val_loss: 73.6028
Epoch {64}
417/417 [==============================] - 61s 146ms/step - loss: 68.4555 - val_loss: 73.4172
Epoch {65}
417/417 [==============================] - 61s 145ms/step - loss: 68.2882 - val_loss: 73.4511
Epoch {66}
417/417 [==============================] - 61s 147ms/step - loss: 68.0406 - val_loss: 72.6864
Epoch {67}
417/417 [==============================] - 61s 145ms/step - loss: 67.6467 - val_loss: 72.5826
Epoch {68}
417/417 [==============================] - 61s 146ms/step - loss: 67.4436 - val_loss: 71.9456
Epoch {69}
417/417 [==============================] - 61s 146ms/step - loss: 67.3635 - val_loss: 71.7553
Epoch {70}
417/417 [==============================] - 61s 146ms/step - loss: 66.9852 - val_loss: 72.4882
Epoch {71}
417/417 [==============================] - 61s 145ms/step - loss: 66.5985 - val_loss: 72.5721
Epoch {72}
417/417 [==============================] - 61s 147ms/step - loss: 66.6123 - val_loss: 72.1087
Epoch {73}
417/417 [==============================] - 60s 145ms/step - loss: 66.0231 - val_loss: 70.8719
Epoch {74}
417/417 [==============================] - 60s 144ms/step - loss: 65.6880 - val_loss: 71.5633
Epoch {75}
417/417 [==============================] - 60s 144ms/step - loss: 65.3219 - val_loss: 71.7068
Epoch {76}
417/417 [==============================] - 61s 146ms/step - loss: 65.3403 - val_loss: 70.5510
Epoch {77}
417/417 [==============================] - 61s 145ms/step - loss: 65.0687 - val_loss: 70.4706
Epoch {78}
417/417 [==============================] - 61s 146ms/step - loss: 64.4711 - val_loss: 70.3213
Epoch {79}
417/417 [==============================] - 61s 145ms/step - loss: 64.4282 - val_loss: 70.0780
Epoch {80}
417/417 [==============================] - 61s 146ms/step - loss: 64.0798 - val_loss: 70.9438
Epoch {81}
417/417 [==============================] - 61s 146ms/step - loss: 63.9875 - val_loss: 69.1577
Epoch {82}
417/417 [==============================] - 61s 146ms/step - loss: 63.4604 - val_loss: 69.1071
Epoch {83}
417/417 [==============================] - 61s 146ms/step - loss: 63.1592 - val_loss: 69.6169
Epoch {84}
417/417 [==============================] - 61s 146ms/step - loss: 62.8506 - val_loss: 69.2852
Epoch {85}
417/417 [==============================] - 61s 146ms/step - loss: 62.6432 - val_loss: 69.3647
Epoch {86}
417/417 [==============================] - 61s 145ms/step - loss: 62.5509 - val_loss: 69.4552
Epoch {87}
417/417 [==============================] - 61s 146ms/step - loss: 62.1506 - val_loss: 67.3090
Epoch {88}
417/417 [==============================] - 61s 146ms/step - loss: 61.7585 - val_loss: 68.1062
Epoch {89}
417/417 [==============================] - 61s 145ms/step - loss: 61.6289 - val_loss: 68.1266
Epoch {90}
417/417 [==============================] - 61s 146ms/step - loss: 61.1388 - val_loss: 68.1729
Epoch {91}
417/417 [==============================] - 60s 145ms/step - loss: 60.9458 - val_loss: 69.2790
Epoch {92}
417/417 [==============================] - 61s 146ms/step - loss: 60.4420 - val_loss: 67.0683
Epoch {93}
417/417 [==============================] - 61s 146ms/step - loss: 60.4977 - val_loss: 68.9159
Epoch {94}
417/417 [==============================] - 61s 146ms/step - loss: 60.0593 - val_loss: 66.7631
Epoch {95}
417/417 [==============================] - 61s 146ms/step - loss: 59.4461 - val_loss: 66.1072
Epoch {96}
417/417 [==============================] - 61s 146ms/step - loss: 59.5383 - val_loss: 65.5297
Epoch {97}
417/417 [==============================] - 62s 148ms/step - loss: 59.3304 - val_loss: 65.8784
Epoch {98}
417/417 [==============================] - 61s 145ms/step - loss: 58.7632 - val_loss: 66.3943
Epoch {99}
417/417 [==============================] - 61s 145ms/step - loss: 58.6838 - val_loss: 65.6789
Epoch {100}
417/417 [==============================] - 61s 146ms/step - loss: 58.2051 - val_loss: 63.8101
Epoch {101}
417/417 [==============================] - 63s 150ms/step - loss: 57.9286 - val_loss: 64.1653
Epoch {102}
417/417 [==============================] - 61s 146ms/step - loss: 57.6891 - val_loss: 65.1961
Epoch {103}
417/417 [==============================] - 61s 147ms/step - loss: 57.4829 - val_loss: 65.2296
Epoch {104}
397/417 [===========================>..] - ETA: 2s - loss: 57.6770
IOPub message rate exceeded.
The notebook server will temporarily stop sending output
to the client in order to avoid crashing it.
To change this limit, set the config variable
`--NotebookApp.iopub_msg_rate_limit`.

Current values:
NotebookApp.iopub_msg_rate_limit=1000.0 (msgs/sec)
NotebookApp.rate_limit_window=3.0 (secs)

In [30]:
lossTrain=[]
lossval=[]

for element in historyvet:
   lossTrain.append(element['loss'][0])
   lossval.append(element['val_loss'][0])

plt.plot(lossTrain, color='g')
plt.plot(lossval, color='r')
plt.title('model loss')
plt.xlabel('epoch')
plt.ylabel('Loss')
plt.legend(['train', 'validation'], loc='upper right')
plt.show()
In [31]:
pred = model.predict(Xtest)
1396/1396 [==============================] - 34s 22ms/step
In [32]:
print(model.evaluate(Xtest,yTest))
1396/1396 [==============================] - 32s 23ms/step - loss: 55.5761
55.5760612487793
In [33]:
y = yTest.copy()
yhat = pred.copy()

# calculate manually
d = y - yhat
mse_f = np.mean(d**2)
mae_f = np.mean(abs(d))
rmse_f = np.sqrt(mse_f)
r2_f = 1-(sum(d**2)/sum((y-np.mean(y))**2))

print("Results by manual calculation:")
print("MAE:",mae_f) #mean absolute error - difference between the original and predicted extracted by avg the abs diff over dataset
print("MSE:", mse_f) #mean squared error - diff btw orig and pred extracted by squared the avg diff over the dataset
print("RMSE:", rmse_f) #root mean squared error - is the error rate by the square root of MSE
print("R-Squared:", r2_f) #coefficient of determination - the higher the better 
Results by manual calculation:
MAE: 5.874125252771022
MSE: 55.57604066454788
RMSE: 7.454933981233361
R-Squared: [0.3481493]

Performance evaluation¶

In [34]:
# Plot true and predicted RUL values
plt.plot(yTest, label = "True RUL", color = "red")
plt.plot(pred, label = "Pred RUL", color = "blue")
plt.legend()
plt.show()
In [35]:
x = list(range(len(yTest)))
plt.scatter(x, yTest, color="blue", label="original")
plt.plot(x, pred, color="red", label="predicted")
plt.legend()
plt.show() 
In [36]:
y = yTest.copy()
yhat = pred.copy()
In [37]:
# calculate manually
d = y - yhat
mse_f = np.mean(d**2)
mae_f = np.mean(abs(d))
rmse_f = np.sqrt(mse_f)
r2_f = 1-(sum(d**2)/sum((y-np.mean(y))**2))

print("Results by manual calculation:")
print("MAE:",mae_f) #mean absolute error - difference between the original and predicted extracted by avg the abs diff over dataset
print("MSE:", mse_f) #mean squared error - diff btw orig and pred extracted by squared the avg diff over the dataset
print("RMSE:", rmse_f) #root mean squared error - is the error rate by the square root of MSE
print("R-Squared:", r2_f) #coefficient of determination - the higher the better 
Results by manual calculation:
MAE: 5.874125252771022
MSE: 55.57604066454788
RMSE: 7.454933981233361
R-Squared: [0.3481493]
In [38]:
#another 150 epochs to train
historyvet =[]
model = load_model( 'bilstm_predict_rul_experiment8_extended_full_take1_part2.h5')
epoch = 150

for epoch in range(0,epoch):
  print('Epoch {%d}' %(epoch))
  history = model.fit(Xtrain, ytrain, epochs=1, batch_size=500, validation_data= (Xval,yVal), shuffle=True)
  historyvet.append(history.history)

model.save('bilstm_predict_rul_experiment8_extended_full_take1_part3.h5')
model.summary()
Epoch {0}
417/417 [==============================] - 71s 155ms/step - loss: 45.5250 - val_loss: 53.3802
Epoch {1}
417/417 [==============================] - 61s 146ms/step - loss: 45.6368 - val_loss: 55.3708
Epoch {2}
417/417 [==============================] - 61s 145ms/step - loss: 45.1592 - val_loss: 54.4436
Epoch {3}
417/417 [==============================] - 61s 146ms/step - loss: 44.9672 - val_loss: 56.5786
Epoch {4}
417/417 [==============================] - 61s 146ms/step - loss: 44.2424 - val_loss: 52.7278
Epoch {5}
417/417 [==============================] - 61s 145ms/step - loss: 43.7204 - val_loss: 52.6551
Epoch {6}
417/417 [==============================] - 61s 146ms/step - loss: 44.3015 - val_loss: 53.5841
Epoch {7}
417/417 [==============================] - 61s 146ms/step - loss: 44.0761 - val_loss: 54.4101
Epoch {8}
417/417 [==============================] - 61s 147ms/step - loss: 43.9815 - val_loss: 53.0452
Epoch {9}
417/417 [==============================] - 61s 147ms/step - loss: 43.6852 - val_loss: 54.2320
Epoch {10}
417/417 [==============================] - 61s 146ms/step - loss: 43.3530 - val_loss: 53.7329
Epoch {11}
417/417 [==============================] - 61s 146ms/step - loss: 43.1921 - val_loss: 51.7534
Epoch {12}
417/417 [==============================] - 61s 146ms/step - loss: 43.0560 - val_loss: 52.0054
Epoch {13}
417/417 [==============================] - 61s 147ms/step - loss: 43.0121 - val_loss: 54.0206
Epoch {14}
417/417 [==============================] - 62s 147ms/step - loss: 42.4245 - val_loss: 52.7469
Epoch {15}
417/417 [==============================] - 61s 147ms/step - loss: 42.1506 - val_loss: 52.3071
Epoch {16}
417/417 [==============================] - 61s 146ms/step - loss: 41.5827 - val_loss: 51.9885
Epoch {17}
417/417 [==============================] - 61s 146ms/step - loss: 41.8255 - val_loss: 52.4439
Epoch {18}
417/417 [==============================] - 62s 148ms/step - loss: 41.8204 - val_loss: 50.7387
Epoch {19}
417/417 [==============================] - 61s 146ms/step - loss: 41.2537 - val_loss: 50.5455
Epoch {20}
417/417 [==============================] - 61s 146ms/step - loss: 41.2996 - val_loss: 49.9487
Epoch {21}
417/417 [==============================] - 61s 146ms/step - loss: 41.1346 - val_loss: 52.1963
Epoch {22}
417/417 [==============================] - 61s 146ms/step - loss: 40.9720 - val_loss: 51.8983
Epoch {23}
417/417 [==============================] - 61s 147ms/step - loss: 40.7686 - val_loss: 51.2925
Epoch {24}
417/417 [==============================] - 61s 146ms/step - loss: 40.8481 - val_loss: 50.4244
Epoch {25}
417/417 [==============================] - 61s 146ms/step - loss: 39.8292 - val_loss: 50.0283
Epoch {26}
417/417 [==============================] - 61s 146ms/step - loss: 40.2289 - val_loss: 49.4388
Epoch {27}
417/417 [==============================] - 61s 147ms/step - loss: 40.2658 - val_loss: 49.0737
Epoch {28}
417/417 [==============================] - 62s 148ms/step - loss: 39.7491 - val_loss: 49.0944
Epoch {29}
417/417 [==============================] - 61s 147ms/step - loss: 39.3759 - val_loss: 50.7819
Epoch {30}
417/417 [==============================] - 61s 146ms/step - loss: 39.3474 - val_loss: 50.4122
Epoch {31}
417/417 [==============================] - 61s 146ms/step - loss: 39.4613 - val_loss: 48.2995
Epoch {32}
417/417 [==============================] - 61s 146ms/step - loss: 39.6364 - val_loss: 50.2065
Epoch {33}
417/417 [==============================] - 61s 145ms/step - loss: 38.9421 - val_loss: 49.0659
Epoch {34}
417/417 [==============================] - 61s 146ms/step - loss: 38.8538 - val_loss: 49.8195
Epoch {35}
417/417 [==============================] - 61s 145ms/step - loss: 38.2287 - val_loss: 49.4068
Epoch {36}
417/417 [==============================] - 61s 147ms/step - loss: 38.5873 - val_loss: 48.4423
Epoch {37}
417/417 [==============================] - 61s 146ms/step - loss: 38.8376 - val_loss: 48.5653
Epoch {38}
417/417 [==============================] - 62s 148ms/step - loss: 37.9459 - val_loss: 48.3308
Epoch {39}
417/417 [==============================] - 62s 149ms/step - loss: 37.5998 - val_loss: 48.6029
Epoch {40}
417/417 [==============================] - 61s 147ms/step - loss: 37.9216 - val_loss: 46.2315
Epoch {41}
417/417 [==============================] - 61s 146ms/step - loss: 37.0706 - val_loss: 46.4404
Epoch {42}
417/417 [==============================] - 61s 146ms/step - loss: 37.0765 - val_loss: 46.6861
Epoch {43}
417/417 [==============================] - 61s 147ms/step - loss: 37.0415 - val_loss: 48.0763
Epoch {44}
417/417 [==============================] - 61s 145ms/step - loss: 37.2636 - val_loss: 50.8576
Epoch {45}
417/417 [==============================] - 61s 147ms/step - loss: 36.4690 - val_loss: 50.9807
Epoch {46}
417/417 [==============================] - 61s 146ms/step - loss: 36.4517 - val_loss: 46.7504
Epoch {47}
417/417 [==============================] - 62s 148ms/step - loss: 36.5174 - val_loss: 45.8858
Epoch {48}
417/417 [==============================] - 61s 147ms/step - loss: 36.5007 - val_loss: 47.8323
Epoch {49}
417/417 [==============================] - 62s 148ms/step - loss: 36.6711 - val_loss: 46.1649
Epoch {50}
417/417 [==============================] - 61s 147ms/step - loss: 36.0533 - val_loss: 47.4047
Epoch {51}
417/417 [==============================] - 62s 147ms/step - loss: 36.3330 - val_loss: 46.2508
Epoch {52}
417/417 [==============================] - 61s 147ms/step - loss: 35.6203 - val_loss: 47.4236
Epoch {53}
417/417 [==============================] - 61s 147ms/step - loss: 35.4039 - val_loss: 47.4886
Epoch {54}
417/417 [==============================] - 61s 147ms/step - loss: 35.0336 - val_loss: 46.4134
Epoch {55}
417/417 [==============================] - 61s 146ms/step - loss: 34.9839 - val_loss: 47.6815
Epoch {56}
417/417 [==============================] - 62s 148ms/step - loss: 35.3112 - val_loss: 45.7324
Epoch {57}
417/417 [==============================] - 61s 147ms/step - loss: 35.1060 - val_loss: 44.1062
Epoch {58}
417/417 [==============================] - 61s 146ms/step - loss: 34.7574 - val_loss: 45.1731
Epoch {59}
417/417 [==============================] - 61s 146ms/step - loss: 34.7237 - val_loss: 48.1134
Epoch {60}
417/417 [==============================] - 61s 146ms/step - loss: 34.9102 - val_loss: 44.0434
Epoch {61}
417/417 [==============================] - 62s 148ms/step - loss: 34.1893 - val_loss: 44.0282
Epoch {62}
417/417 [==============================] - 61s 146ms/step - loss: 34.0553 - val_loss: 46.1338
Epoch {63}
417/417 [==============================] - 61s 147ms/step - loss: 34.3231 - val_loss: 45.2917
Epoch {64}
417/417 [==============================] - 61s 146ms/step - loss: 33.8258 - val_loss: 46.5582
Epoch {65}
417/417 [==============================] - 61s 147ms/step - loss: 33.7300 - val_loss: 45.1520
Epoch {66}
417/417 [==============================] - 61s 147ms/step - loss: 33.4922 - val_loss: 44.2255
Epoch {67}
417/417 [==============================] - 62s 148ms/step - loss: 33.3909 - val_loss: 43.1825
Epoch {68}
417/417 [==============================] - 61s 146ms/step - loss: 32.8899 - val_loss: 47.6143
Epoch {69}
417/417 [==============================] - 61s 146ms/step - loss: 33.4277 - val_loss: 44.6777
Epoch {70}
417/417 [==============================] - 61s 146ms/step - loss: 33.4755 - val_loss: 46.3491
Epoch {71}
417/417 [==============================] - 61s 146ms/step - loss: 32.4337 - val_loss: 43.6354
Epoch {72}
417/417 [==============================] - 61s 147ms/step - loss: 32.6218 - val_loss: 42.8437
Epoch {73}
417/417 [==============================] - 61s 146ms/step - loss: 32.5901 - val_loss: 42.8820
Epoch {74}
417/417 [==============================] - 61s 146ms/step - loss: 32.0884 - val_loss: 43.3284
Epoch {75}
417/417 [==============================] - 61s 146ms/step - loss: 32.3688 - val_loss: 42.8652
Epoch {76}
417/417 [==============================] - 61s 146ms/step - loss: 32.0142 - val_loss: 43.4955
Epoch {77}
417/417 [==============================] - 61s 147ms/step - loss: 31.8559 - val_loss: 43.5572
Epoch {78}
417/417 [==============================] - 61s 146ms/step - loss: 31.9166 - val_loss: 43.9381
Epoch {79}
417/417 [==============================] - 61s 146ms/step - loss: 31.7775 - val_loss: 43.5294
Epoch {80}
417/417 [==============================] - 61s 146ms/step - loss: 32.1087 - val_loss: 43.6702
Epoch {81}
351/417 [========================>.....] - ETA: 8s - loss: 32.1710
IOPub message rate exceeded.
The notebook server will temporarily stop sending output
to the client in order to avoid crashing it.
To change this limit, set the config variable
`--NotebookApp.iopub_msg_rate_limit`.

Current values:
NotebookApp.iopub_msg_rate_limit=1000.0 (msgs/sec)
NotebookApp.rate_limit_window=3.0 (secs)

417/417 [==============================] - 61s 146ms/step - loss: 30.5227 - val_loss: 43.1171
Epoch {91}
417/417 [==============================] - 61s 146ms/step - loss: 30.6037 - val_loss: 42.4693
Epoch {92}
417/417 [==============================] - 62s 148ms/step - loss: 29.8825 - val_loss: 40.8402
Epoch {93}
417/417 [==============================] - 61s 147ms/step - loss: 30.2688 - val_loss: 41.3155
Epoch {94}
417/417 [==============================] - 61s 146ms/step - loss: 30.0060 - val_loss: 41.6294
Epoch {95}
417/417 [==============================] - 62s 148ms/step - loss: 29.8832 - val_loss: 40.0331
Epoch {96}
417/417 [==============================] - 61s 147ms/step - loss: 30.0769 - val_loss: 41.0643
Epoch {97}
417/417 [==============================] - 61s 146ms/step - loss: 29.3467 - val_loss: 42.3000
Epoch {98}
417/417 [==============================] - 61s 145ms/step - loss: 29.8377 - val_loss: 40.9519
Epoch {99}
417/417 [==============================] - 61s 147ms/step - loss: 29.3055 - val_loss: 40.1252
Epoch {100}
417/417 [==============================] - 61s 146ms/step - loss: 29.3843 - val_loss: 40.4204
Epoch {101}
417/417 [==============================] - 61s 146ms/step - loss: 29.0416 - val_loss: 41.2022
Epoch {102}
417/417 [==============================] - 61s 147ms/step - loss: 29.0256 - val_loss: 40.6255
Epoch {103}
417/417 [==============================] - 61s 146ms/step - loss: 29.3905 - val_loss: 43.4271
Epoch {104}
417/417 [==============================] - 62s 147ms/step - loss: 29.1191 - val_loss: 41.1378
Epoch {105}
417/417 [==============================] - 61s 147ms/step - loss: 29.0808 - val_loss: 41.0207
Epoch {106}
417/417 [==============================] - 61s 147ms/step - loss: 29.0921 - val_loss: 41.3110
Epoch {107}
417/417 [==============================] - 61s 146ms/step - loss: 28.6196 - val_loss: 42.1662
Epoch {108}
417/417 [==============================] - 61s 146ms/step - loss: 28.5513 - val_loss: 41.1686
Epoch {109}
417/417 [==============================] - 61s 146ms/step - loss: 28.5181 - val_loss: 39.6974
Epoch {110}
417/417 [==============================] - 61s 146ms/step - loss: 28.2563 - val_loss: 40.0436
Epoch {111}
417/417 [==============================] - 61s 146ms/step - loss: 27.8426 - val_loss: 40.1664
Epoch {112}
417/417 [==============================] - 61s 147ms/step - loss: 28.4504 - val_loss: 40.1721
Epoch {113}
417/417 [==============================] - 61s 147ms/step - loss: 28.0390 - val_loss: 40.7384
Epoch {114}
417/417 [==============================] - 61s 145ms/step - loss: 27.7399 - val_loss: 39.6192
Epoch {115}
417/417 [==============================] - 61s 146ms/step - loss: 27.8444 - val_loss: 41.9367
Epoch {116}
417/417 [==============================] - 62s 148ms/step - loss: 27.9179 - val_loss: 40.0600
Epoch {117}
417/417 [==============================] - 62s 149ms/step - loss: 27.7171 - val_loss: 40.5370
Epoch {118}
417/417 [==============================] - 61s 147ms/step - loss: 27.5094 - val_loss: 40.6384
Epoch {119}
417/417 [==============================] - 61s 147ms/step - loss: 27.2844 - val_loss: 40.5253
Epoch {120}
417/417 [==============================] - 61s 146ms/step - loss: 26.7987 - val_loss: 39.5466
Epoch {121}
417/417 [==============================] - 61s 147ms/step - loss: 26.9844 - val_loss: 39.1831
Epoch {122}
417/417 [==============================] - 61s 146ms/step - loss: 26.7891 - val_loss: 39.4603
Epoch {123}
417/417 [==============================] - 61s 146ms/step - loss: 27.5965 - val_loss: 39.7798
Epoch {124}
417/417 [==============================] - 61s 146ms/step - loss: 27.0529 - val_loss: 41.9647
Epoch {125}
417/417 [==============================] - 61s 147ms/step - loss: 27.4248 - val_loss: 40.5191
Epoch {126}
417/417 [==============================] - 61s 146ms/step - loss: 26.5790 - val_loss: 39.9434
Epoch {127}
417/417 [==============================] - 61s 146ms/step - loss: 27.0167 - val_loss: 39.3032
Epoch {128}
417/417 [==============================] - 61s 146ms/step - loss: 26.8346 - val_loss: 39.5987
Epoch {129}
417/417 [==============================] - 61s 147ms/step - loss: 27.3096 - val_loss: 39.2208
Epoch {130}
417/417 [==============================] - 62s 148ms/step - loss: 26.5937 - val_loss: 39.0004
Epoch {131}
417/417 [==============================] - 61s 146ms/step - loss: 26.1301 - val_loss: 38.9951
Epoch {132}
417/417 [==============================] - 62s 148ms/step - loss: 25.8666 - val_loss: 38.8354
Epoch {133}
417/417 [==============================] - 61s 147ms/step - loss: 25.9765 - val_loss: 37.6574
Epoch {134}
417/417 [==============================] - 61s 147ms/step - loss: 25.9306 - val_loss: 40.0184
Epoch {135}
417/417 [==============================] - 61s 147ms/step - loss: 26.2593 - val_loss: 39.9682
Epoch {136}
417/417 [==============================] - 61s 147ms/step - loss: 26.0259 - val_loss: 37.9807
Epoch {137}
417/417 [==============================] - 61s 146ms/step - loss: 26.0186 - val_loss: 36.7190
Epoch {138}
417/417 [==============================] - 61s 147ms/step - loss: 25.3824 - val_loss: 38.0696
Epoch {139}
417/417 [==============================] - 61s 145ms/step - loss: 25.8383 - val_loss: 36.5017
Epoch {140}
417/417 [==============================] - 61s 147ms/step - loss: 25.5499 - val_loss: 36.8519
Epoch {141}
417/417 [==============================] - 61s 147ms/step - loss: 25.3177 - val_loss: 37.7443
Epoch {142}
417/417 [==============================] - 62s 148ms/step - loss: 25.9615 - val_loss: 37.5349
Epoch {143}
417/417 [==============================] - 61s 146ms/step - loss: 25.1721 - val_loss: 38.0082
Epoch {144}
417/417 [==============================] - 61s 147ms/step - loss: 25.3101 - val_loss: 36.8890
Epoch {145}
417/417 [==============================] - 61s 146ms/step - loss: 24.8942 - val_loss: 39.2903
Epoch {146}
417/417 [==============================] - 61s 146ms/step - loss: 25.2470 - val_loss: 36.0209
Epoch {147}
417/417 [==============================] - 61s 146ms/step - loss: 24.7789 - val_loss: 36.8653
Epoch {148}
417/417 [==============================] - 61s 146ms/step - loss: 25.0389 - val_loss: 38.1532
Epoch {149}
417/417 [==============================] - 61s 146ms/step - loss: 25.2372 - val_loss: 38.3573
Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 bidirectional (Bidirection  (None, 15, 256)           141312    
 al)                                                             
                                                                 
 bidirectional_1 (Bidirecti  (None, 15, 128)           164352    
 onal)                                                           
                                                                 
 bidirectional_2 (Bidirecti  (None, 64)                41216     
 onal)                                                           
                                                                 
 dense (Dense)               (None, 96)                6240      
                                                                 
 dense_1 (Dense)             (None, 128)               12416     
                                                                 
 dense_2 (Dense)             (None, 1)                 129       
                                                                 
=================================================================
Total params: 365665 (1.39 MB)
Trainable params: 365665 (1.39 MB)
Non-trainable params: 0 (0.00 Byte)
_________________________________________________________________
In [40]:
lossTrain=[]
lossval=[]

for element in historyvet:
   lossTrain.append(element['loss'][0])
   lossval.append(element['val_loss'][0])

plt.plot(lossTrain, color='g')
plt.plot(lossval, color='r')
plt.title('model loss')
plt.xlabel('epoch')
plt.ylabel('Loss')
plt.legend(['train', 'validation'], loc='upper right')
plt.show()
In [41]:
pred = model.predict(Xtest)
1396/1396 [==============================] - 34s 22ms/step
In [42]:
print(model.evaluate(Xtest,yTest))
1396/1396 [==============================] - 31s 23ms/step - loss: 38.4965
38.49654769897461
In [43]:
y = yTest.copy()
yhat = pred.copy()

# calculate manually
d = y - yhat
mse_f = np.mean(d**2)
mae_f = np.mean(abs(d))
rmse_f = np.sqrt(mse_f)
r2_f = 1-(sum(d**2)/sum((y-np.mean(y))**2))

print("Results by manual calculation:")
print("MAE:",mae_f) #mean absolute error - difference between the original and predicted extracted by avg the abs diff over dataset
print("MSE:", mse_f) #mean squared error - diff btw orig and pred extracted by squared the avg diff over the dataset
print("RMSE:", rmse_f) #root mean squared error - is the error rate by the square root of MSE
print("R-Squared:", r2_f) #coefficient of determination - the higher the better 
Results by manual calculation:
MAE: 4.6139056233222275
MSE: 38.49655581822394
RMSE: 6.204559276711275
R-Squared: [0.54847437]
In [44]:
# Plot true and predicted RUL values
plt.plot(yTest, label = "True RUL", color = "red")
plt.plot(pred, label = "Pred RUL", color = "blue")
plt.legend()
plt.show()
In [45]:
x = list(range(len(yTest)))
plt.scatter(x, yTest, color="blue", label="original")
plt.plot(x, pred, color="red", label="predicted")
plt.legend()
plt.show() 
In [ ]:
#another 150 epochs to train
historyvet =[]
model = load_model( 'bilstm_predict_rul_experiment8_extended_full_take1_part3.h5')
epoch = 150

for epoch in range(0,epoch):
  print('Epoch {%d}' %(epoch))
  history = model.fit(Xtrain, ytrain, epochs=1, batch_size=500, validation_data= (Xval,yVal), shuffle=True)
  historyvet.append(history.history)

model.save('bilstm_predict_rul_experiment8_extended_full_take1_part4.h5')
model.summary()
Epoch {0}
417/417 [==============================] - 72s 156ms/step - loss: 25.2065 - val_loss: 36.6388
Epoch {1}
417/417 [==============================] - 62s 148ms/step - loss: 24.8557 - val_loss: 35.4476
Epoch {2}
417/417 [==============================] - 62s 148ms/step - loss: 24.3274 - val_loss: 37.2842
Epoch {3}
417/417 [==============================] - 62s 147ms/step - loss: 24.4278 - val_loss: 37.4299
Epoch {4}
417/417 [==============================] - 62s 149ms/step - loss: 24.3842 - val_loss: 37.5519
Epoch {5}
417/417 [==============================] - 62s 147ms/step - loss: 24.4239 - val_loss: 37.9402
Epoch {6}
417/417 [==============================] - 62s 149ms/step - loss: 24.9670 - val_loss: 37.0719
Epoch {7}
417/417 [==============================] - 62s 149ms/step - loss: 23.8002 - val_loss: 36.0193
Epoch {8}
417/417 [==============================] - 62s 148ms/step - loss: 23.5360 - val_loss: 35.7242
Epoch {9}
417/417 [==============================] - 61s 147ms/step - loss: 23.8291 - val_loss: 36.4133
Epoch {10}
417/417 [==============================] - 61s 147ms/step - loss: 23.9111 - val_loss: 36.7556
Epoch {11}
417/417 [==============================] - 62s 148ms/step - loss: 24.3146 - val_loss: 37.7184
Epoch {12}
417/417 [==============================] - 61s 147ms/step - loss: 23.4790 - val_loss: 35.7914
Epoch {13}
417/417 [==============================] - 61s 147ms/step - loss: 23.9065 - val_loss: 35.7152
Epoch {14}
417/417 [==============================] - 62s 148ms/step - loss: 23.4426 - val_loss: 38.0939
Epoch {15}
417/417 [==============================] - 66s 157ms/step - loss: 23.3824 - val_loss: 38.8431
Epoch {16}
417/417 [==============================] - 62s 149ms/step - loss: 23.6668 - val_loss: 37.0771
Epoch {17}
283/417 [===================>..........] - ETA: 17s - loss: 23.7568
IOPub message rate exceeded.
The notebook server will temporarily stop sending output
to the client in order to avoid crashing it.
To change this limit, set the config variable
`--NotebookApp.iopub_msg_rate_limit`.

Current values:
NotebookApp.iopub_msg_rate_limit=1000.0 (msgs/sec)
NotebookApp.rate_limit_window=3.0 (secs)

417/417 [==============================] - 61s 147ms/step - loss: 23.0798 - val_loss: 36.1934
Epoch {21}
417/417 [==============================] - 61s 146ms/step - loss: 22.9668 - val_loss: 35.9325
Epoch {22}
417/417 [==============================] - 61s 147ms/step - loss: 22.9929 - val_loss: 35.0717
Epoch {23}
417/417 [==============================] - 61s 147ms/step - loss: 22.8793 - val_loss: 34.3491
Epoch {24}
417/417 [==============================] - 62s 147ms/step - loss: 22.7364 - val_loss: 36.1029
Epoch {25}
417/417 [==============================] - 62s 150ms/step - loss: 23.2038 - val_loss: 34.3044
Epoch {26}
417/417 [==============================] - 62s 148ms/step - loss: 22.9945 - val_loss: 37.2682
Epoch {27}
175/417 [===========>..................] - ETA: 32s - loss: 21.9081
IOPub message rate exceeded.
The notebook server will temporarily stop sending output
to the client in order to avoid crashing it.
To change this limit, set the config variable
`--NotebookApp.iopub_msg_rate_limit`.

Current values:
NotebookApp.iopub_msg_rate_limit=1000.0 (msgs/sec)
NotebookApp.rate_limit_window=3.0 (secs)

417/417 [==============================] - 61s 147ms/step - loss: 22.3582 - val_loss: 36.2649
Epoch {31}
417/417 [==============================] - 61s 147ms/step - loss: 22.7639 - val_loss: 33.4122
Epoch {32}
417/417 [==============================] - 62s 148ms/step - loss: 22.8160 - val_loss: 36.9609
Epoch {33}
417/417 [==============================] - 62s 148ms/step - loss: 22.3251 - val_loss: 35.1993
Epoch {34}
417/417 [==============================] - 62s 148ms/step - loss: 22.3566 - val_loss: 34.6793
Epoch {35}
417/417 [==============================] - 62s 149ms/step - loss: 22.0315 - val_loss: 34.7027
Epoch {36}
417/417 [==============================] - 61s 147ms/step - loss: 21.9698 - val_loss: 34.1477
Epoch {37}
417/417 [==============================] - 62s 148ms/step - loss: 22.5656 - val_loss: 34.4885
Epoch {38}
235/417 [===============>..............] - ETA: 24s - loss: 21.2834
IOPub message rate exceeded.
The notebook server will temporarily stop sending output
to the client in order to avoid crashing it.
To change this limit, set the config variable
`--NotebookApp.iopub_msg_rate_limit`.

Current values:
NotebookApp.iopub_msg_rate_limit=1000.0 (msgs/sec)
NotebookApp.rate_limit_window=3.0 (secs)

417/417 [==============================] - 61s 147ms/step - loss: 21.0600 - val_loss: 35.1760
Epoch {43}
417/417 [==============================] - 61s 146ms/step - loss: 22.1203 - val_loss: 36.4063
Epoch {44}
417/417 [==============================] - 61s 147ms/step - loss: 22.2604 - val_loss: 34.6257
Epoch {45}
417/417 [==============================] - 61s 147ms/step - loss: 21.3753 - val_loss: 32.8848
Epoch {46}
417/417 [==============================] - 62s 149ms/step - loss: 21.2788 - val_loss: 33.9894
Epoch {47}
417/417 [==============================] - 61s 147ms/step - loss: 21.6419 - val_loss: 33.2308
Epoch {48}
417/417 [==============================] - 62s 148ms/step - loss: 21.5391 - val_loss: 36.6366
Epoch {49}
417/417 [==============================] - 61s 146ms/step - loss: 21.4260 - val_loss: 34.0745
Epoch {50}
417/417 [==============================] - 61s 147ms/step - loss: 21.3438 - val_loss: 33.1494
Epoch {51}
417/417 [==============================] - 61s 147ms/step - loss: 20.9282 - val_loss: 34.3457
Epoch {52}
257/417 [=================>............] - ETA: 21s - loss: 21.8262
In [47]:
lossTrain=[]
lossval=[]

for element in historyvet:
   lossTrain.append(element['loss'][0])
   lossval.append(element['val_loss'][0])

plt.plot(lossTrain, color='g')
plt.plot(lossval, color='r')
plt.title('model loss')
plt.xlabel('epoch')
plt.ylabel('Loss')
plt.legend(['train', 'validation'], loc='upper right')
plt.show()
In [48]:
pred = model.predict(Xtest)
1396/1396 [==============================] - 34s 22ms/step
In [49]:
print(model.evaluate(Xtest,yTest))
1396/1396 [==============================] - 31s 22ms/step - loss: 28.4646
28.464616775512695
In [50]:
y = yTest.copy()
yhat = pred.copy()

# calculate manually
d = y - yhat
mse_f = np.mean(d**2)
mae_f = np.mean(abs(d))
rmse_f = np.sqrt(mse_f)
r2_f = 1-(sum(d**2)/sum((y-np.mean(y))**2))

print("Results by manual calculation:")
print("MAE:",mae_f) #mean absolute error - difference between the original and predicted extracted by avg the abs diff over dataset
print("MSE:", mse_f) #mean squared error - diff btw orig and pred extracted by squared the avg diff over the dataset
print("RMSE:", rmse_f) #root mean squared error - is the error rate by the square root of MSE
print("R-Squared:", r2_f) #coefficient of determination - the higher the better 
Results by manual calculation:
MAE: 3.8619044785419687
MSE: 28.464647783454012
RMSE: 5.335227060159109
R-Squared: [0.66613849]
In [51]:
# Plot true and predicted RUL values
plt.plot(yTest, label = "True RUL", color = "red")
plt.plot(pred, label = "Pred RUL", color = "blue")
plt.legend()
plt.show()
In [52]:
x = list(range(len(yTest)))
plt.scatter(x, yTest, color="blue", label="original")
plt.plot(x, pred, color="red", label="predicted")
plt.legend()
plt.show() 
In [ ]:
#another 150 epochs to train
historyvet =[]
model = load_model( 'bilstm_predict_rul_experiment8_extended_full_take1_part4.h5')
epoch = 150

for epoch in range(0,epoch):
  print('Epoch {%d}' %(epoch))
  history = model.fit(Xtrain, ytrain, epochs=1, batch_size=500, validation_data= (Xval,yVal), shuffle=True)
  historyvet.append(history.history)

model.save('bilstm_predict_rul_experiment8_extended_full_take1_part5.h5')
model.summary()
Epoch {0}
417/417 [==============================] - 74s 156ms/step - loss: 17.0762 - val_loss: 29.1492
Epoch {1}
417/417 [==============================] - 63s 150ms/step - loss: 16.6404 - val_loss: 31.5541
Epoch {2}
417/417 [==============================] - 62s 148ms/step - loss: 17.2493 - val_loss: 27.6492
Epoch {3}
417/417 [==============================] - 62s 149ms/step - loss: 16.9610 - val_loss: 30.7429
Epoch {4}
 68/417 [===>..........................] - ETA: 47s - loss: 16.7998
In [54]:
lossTrain=[]
lossval=[]

for element in historyvet:
   lossTrain.append(element['loss'][0])
   lossval.append(element['val_loss'][0])

plt.plot(lossTrain, color='g')
plt.plot(lossval, color='r')
plt.title('model loss')
plt.xlabel('epoch')
plt.ylabel('Loss')
plt.legend(['train', 'validation'], loc='upper right')
plt.show()
In [55]:
pred = model.predict(Xtest)
1396/1396 [==============================] - 33s 22ms/step
In [56]:
print(model.evaluate(Xtest,yTest))
1396/1396 [==============================] - 30s 21ms/step - loss: 26.0985
26.098464965820312
In [57]:
y = yTest.copy()
yhat = pred.copy()

# calculate manually
d = y - yhat
mse_f = np.mean(d**2)
mae_f = np.mean(abs(d))
rmse_f = np.sqrt(mse_f)
r2_f = 1-(sum(d**2)/sum((y-np.mean(y))**2))

print("Results by manual calculation:")
print("MAE:",mae_f) #mean absolute error - difference between the original and predicted extracted by avg the abs diff over dataset
print("MSE:", mse_f) #mean squared error - diff btw orig and pred extracted by squared the avg diff over the dataset
print("RMSE:", rmse_f) #root mean squared error - is the error rate by the square root of MSE
print("R-Squared:", r2_f) #coefficient of determination - the higher the better 
Results by manual calculation:
MAE: 3.6417208252572455
MSE: 26.098465565188167
RMSE: 5.10866573237946
R-Squared: [0.69389142]
In [58]:
# Plot true and predicted RUL values
plt.plot(yTest, label = "True RUL", color = "red")
plt.plot(pred, label = "Pred RUL", color = "blue")
plt.legend()
plt.show()
In [59]:
x = list(range(len(yTest)))
plt.scatter(x, yTest, color="blue", label="original")
plt.plot(x, pred, color="red", label="predicted")
plt.legend()
plt.show() 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 

Fine tune

In [60]:
newModel = load_model( 'bilstm_predict_rul_experiment8_extended_full_take1_part5.h5')
#adam = optimizers.Adam(lr=0.00001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False)
adam=tf.keras.optimizers.Adam(learning_rate=0.001)
newModel.compile(loss='mse', optimizer=adam)
newModel.summary()
epochs = 25

newModel.fit(Xval,yVal, epochs=epochs, batch_size=500)
newModel.save('bilstm_predict_rul_experiment8_extended_full_take1_part5_best.h5')
newModel.summary()
Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 bidirectional (Bidirection  (None, 15, 256)           141312    
 al)                                                             
                                                                 
 bidirectional_1 (Bidirecti  (None, 15, 128)           164352    
 onal)                                                           
                                                                 
 bidirectional_2 (Bidirecti  (None, 64)                41216     
 onal)                                                           
                                                                 
 dense (Dense)               (None, 96)                6240      
                                                                 
 dense_1 (Dense)             (None, 128)               12416     
                                                                 
 dense_2 (Dense)             (None, 1)                 129       
                                                                 
=================================================================
Total params: 365665 (1.39 MB)
Trainable params: 365665 (1.39 MB)
Non-trainable params: 0 (0.00 Byte)
_________________________________________________________________
Epoch 1/25
90/90 [==============================] - 25s 136ms/step - loss: 30.0208
Epoch 2/25
90/90 [==============================] - 12s 137ms/step - loss: 25.0686
Epoch 3/25
90/90 [==============================] - 12s 134ms/step - loss: 22.9721
Epoch 4/25
90/90 [==============================] - 12s 135ms/step - loss: 22.2551
Epoch 5/25
90/90 [==============================] - 12s 135ms/step - loss: 20.0813
Epoch 6/25
90/90 [==============================] - 12s 133ms/step - loss: 20.3510
Epoch 7/25
90/90 [==============================] - 12s 133ms/step - loss: 18.9501
Epoch 8/25
90/90 [==============================] - 12s 133ms/step - loss: 17.6036
Epoch 9/25
90/90 [==============================] - 12s 133ms/step - loss: 17.7045
Epoch 10/25
90/90 [==============================] - 12s 134ms/step - loss: 17.3402
Epoch 11/25
90/90 [==============================] - 12s 135ms/step - loss: 17.1489
Epoch 12/25
90/90 [==============================] - 12s 133ms/step - loss: 16.4222
Epoch 13/25
90/90 [==============================] - 12s 133ms/step - loss: 16.9329
Epoch 14/25
90/90 [==============================] - 12s 133ms/step - loss: 16.0967
Epoch 15/25
90/90 [==============================] - 12s 134ms/step - loss: 15.1926
Epoch 16/25
90/90 [==============================] - 12s 133ms/step - loss: 14.8439
Epoch 17/25
90/90 [==============================] - 12s 133ms/step - loss: 14.8258
Epoch 18/25
90/90 [==============================] - 12s 132ms/step - loss: 13.3039
Epoch 19/25
90/90 [==============================] - 12s 133ms/step - loss: 16.0017
Epoch 20/25
90/90 [==============================] - 12s 133ms/step - loss: 14.8606
Epoch 21/25
90/90 [==============================] - 12s 133ms/step - loss: 14.4499
Epoch 22/25
90/90 [==============================] - 12s 135ms/step - loss: 13.5199
Epoch 23/25
90/90 [==============================] - 12s 133ms/step - loss: 13.1400
Epoch 24/25
90/90 [==============================] - 12s 134ms/step - loss: 12.8299
Epoch 25/25
90/90 [==============================] - 12s 135ms/step - loss: 12.4812
Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 bidirectional (Bidirection  (None, 15, 256)           141312    
 al)                                                             
                                                                 
 bidirectional_1 (Bidirecti  (None, 15, 128)           164352    
 onal)                                                           
                                                                 
 bidirectional_2 (Bidirecti  (None, 64)                41216     
 onal)                                                           
                                                                 
 dense (Dense)               (None, 96)                6240      
                                                                 
 dense_1 (Dense)             (None, 128)               12416     
                                                                 
 dense_2 (Dense)             (None, 1)                 129       
                                                                 
=================================================================
Total params: 365665 (1.39 MB)
Trainable params: 365665 (1.39 MB)
Non-trainable params: 0 (0.00 Byte)
_________________________________________________________________

Performance evaluation¶

In [61]:
print(newModel.evaluate(Xtest,yTest))
1396/1396 [==============================] - 34s 23ms/step - loss: 29.3947
29.394678115844727
In [62]:
pred = newModel.predict(Xtest)
1396/1396 [==============================] - 33s 22ms/step
In [63]:
# Plot true and predicted RUL values
plt.plot(yTest, label = "True RUL", color = "red")
plt.plot(pred, label = "Pred RUL", color = "blue")
plt.legend()
plt.show()
In [64]:
x = list(range(len(yTest)))
plt.scatter(x, yTest, color="blue", label="original")
plt.plot(x, pred, color="red", label="predicted")
plt.legend()
plt.show() 
In [65]:
y = yTest.copy()
yhat = pred.copy()
In [66]:
# calculate manually
d = y - yhat
mse_f = np.mean(d**2)
mae_f = np.mean(abs(d))
rmse_f = np.sqrt(mse_f)
r2_f = 1-(sum(d**2)/sum((y-np.mean(y))**2))

print("Results by manual calculation:")
print("MAE:",mae_f) #mean absolute error - difference between the original and predicted extracted by avg the abs diff over dataset
print("MSE:", mse_f) #mean squared error - diff btw orig and pred extracted by squared the avg diff over the dataset
print("RMSE:", rmse_f) #root mean squared error - is the error rate by the square root of MSE
print("R-Squared:", r2_f) #coefficient of determination - the higher the better - in my case >85% after training on the val dataset
Results by manual calculation:
MAE: 3.9411885885822477
MSE: 29.394694086310825
RMSE: 5.421687383675937
R-Squared: [0.65522999]
In [67]:
results = pd.DataFrame({'Predicted':pred.flatten()})
results['Actual'] = yTest.flatten()
results
Out[67]:
Predicted Actual
0 6.908440 18
1 24.287235 30
2 19.718840 18
3 23.154980 21
4 13.894153 17
... ... ...
44643 18.152962 28
44644 26.346445 30
44645 15.683774 30
44646 6.748013 9
44647 14.507665 26

44648 rows × 2 columns