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-25 14:24:23.181330: I tensorflow/tsl/cuda/cudart_stub.cc:28] Could not find cuda drivers on your machine, GPU will not be used.
2023-08-25 14:24:23.993797: I tensorflow/tsl/cuda/cudart_stub.cc:28] Could not find cuda drivers on your machine, GPU will not be used.
2023-08-25 14:24:23.996921: 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-25 14:24:26.313545: 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]:
#take a look at the data
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_2246767/2029811870.py:2: 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 <= 90]
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=60

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-59) smart_3_normalized(t-59) smart_5_normalized(t-59) smart_7_normalized(t-59) smart_9_normalized(t-59) smart_187_normalized(t-59) smart_189_normalized(t-59) smart_194_normalized(t-59) smart_197_normalized(t-59) smart_1_normalized(t-58) ... 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 82116 0.145729 -0.704918 -0.211155 -0.314741 -0.585657 1.0 1.0 -0.892116 -0.211155 0.185930 ... 0.165829 -0.704918 -0.211155 -0.314741 -0.601594 1.000000 1.0 -0.875519 -0.211155 31
82117 0.185930 -0.704918 -0.211155 -0.314741 -0.585657 1.0 1.0 -0.883817 -0.211155 0.155779 ... 0.105528 -0.704918 -0.211155 -0.314741 -0.601594 1.000000 1.0 -0.875519 -0.211155 30
82118 0.155779 -0.704918 -0.211155 -0.314741 -0.585657 1.0 1.0 -0.883817 -0.211155 0.195980 ... 0.175879 -0.704918 -0.211155 -0.314741 -0.601594 1.000000 1.0 -0.875519 -0.211155 29
82119 0.195980 -0.704918 -0.211155 -0.314741 -0.585657 1.0 1.0 -0.883817 -0.211155 0.165829 ... 0.135678 -0.704918 -0.211155 -0.314741 -0.601594 1.000000 1.0 -0.875519 -0.211155 28
82120 0.165829 -0.704918 -0.211155 -0.314741 -0.585657 1.0 1.0 -0.883817 -0.211155 0.075377 ... 0.175879 -0.704918 -0.211155 -0.314741 -0.601594 1.000000 1.0 -0.875519 -0.211155 27
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
ZTT3STWF 1517209 -0.236181 -0.693989 -0.211155 -0.330677 -0.266932 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 4
1517210 -0.195980 -0.693989 -0.211155 -0.330677 -0.266932 1.0 1.0 -0.933610 -0.211155 -0.175879 ... -0.507538 -0.693989 -0.211155 -0.330677 -0.274900 0.414141 1.0 -0.950207 -0.211155 3
1517211 -0.175879 -0.693989 -0.211155 -0.330677 -0.266932 1.0 1.0 -0.941909 -0.211155 -0.246231 ... -0.507538 -0.693989 -0.211155 -0.330677 -0.274900 0.414141 1.0 -0.950207 -0.211155 2
1517212 -0.246231 -0.693989 -0.211155 -0.330677 -0.266932 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
1517213 -0.195980 -0.693989 -0.211155 -0.330677 -0.266932 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 0

286197 rows × 541 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                      
Z3058TJ2      908160             25
ZA180XHR      1122139             1
ZA1814TR      1139953             7
S301GPHT      418150              3
Z300GYR9      628417             29
...                             ...
Z305KX1Q      958472             24
Z304JML2      855408             31
Z302B0CV      765410             24
S1F04TRW      319102             30
ZA142RBW      1058414            21

[200337 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-15) smart_187_normalized(t-16) ... smart_9_normalized(t-54) smart_9_normalized(t-55) smart_9_normalized(t-56) smart_9_normalized(t-57) smart_9_normalized(t-58) smart_9_normalized(t-59) smart_9_normalized(t-6) smart_9_normalized(t-7) smart_9_normalized(t-8) smart_9_normalized(t-9)
Z3058TJ2 908160 25 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 ... -0.553785 -0.553785 -0.553785 -0.553785 -0.553785 -0.553785 -0.561753 -0.561753 -0.561753 -0.561753
ZA180XHR 1122139 1 0.070707 0.070707 0.131313 0.131313 0.131313 0.131313 0.131313 0.131313 0.131313 ... -0.561753 -0.561753 -0.561753 -0.561753 -0.561753 -0.561753 -0.569721 -0.569721 -0.569721 -0.569721
ZA1814TR 1139953 7 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 ... -0.537849 -0.537849 -0.529880 -0.529880 -0.529880 -0.529880 -0.545817 -0.545817 -0.545817 -0.545817
S301GPHT 418150 3 0.272727 0.272727 0.272727 0.272727 0.272727 0.272727 0.272727 0.272727 0.272727 ... -0.426295 -0.426295 -0.426295 -0.426295 -0.426295 -0.426295 -0.434263 -0.434263 -0.434263 -0.434263
Z300GYR9 628417 29 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 ... -0.513944 -0.513944 -0.513944 -0.513944 -0.513944 -0.513944 -0.521912 -0.521912 -0.521912 -0.521912
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
Z305KX1Q 958472 24 0.575758 0.575758 0.575758 0.575758 0.575758 0.575758 0.575758 0.575758 0.575758 ... -0.410359 -0.410359 -0.410359 -0.410359 -0.410359 -0.410359 -0.426295 -0.426295 -0.426295 -0.426295
Z304JML2 855408 31 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 ... -0.593625 -0.593625 -0.593625 -0.593625 -0.585657 -0.585657 -0.601594 -0.601594 -0.601594 -0.601594
Z302B0CV 765410 24 0.555556 0.555556 0.555556 0.555556 0.555556 0.555556 0.555556 0.555556 0.555556 ... -0.768924 -0.768924 -0.768924 -0.768924 -0.768924 -0.768924 -0.776892 -0.776892 -0.776892 -0.776892
S1F04TRW 319102 30 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 ... -0.362550 -0.362550 -0.362550 -0.362550 -0.362550 -0.362550 -0.370518 -0.370518 -0.370518 -0.370518
ZA142RBW 1058414 21 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 ... -0.609562 -0.609562 -0.609562 -0.609562 -0.609562 -0.609562 -0.617530 -0.617530 -0.617530 -0.617530

200337 rows × 541 columns

In [14]:
X_train.shape
Out[14]:
(200337, 541)
In [15]:
X_val.shape
Out[15]:
(42930, 541)
In [16]:
Xtrain = X_train.copy()
Xtrain = Xtrain.drop(columns=['DayToFailure'], axis=1 )
Xtrain.shape
#Xtrain
Out[16]:
(200337, 540)
In [17]:
Xval = X_val.copy()
Xval = Xval.drop(columns=['DayToFailure'], axis=1 )
Xval.shape
Out[17]:
(42930, 540)
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)
(200337, 60, 9)
(42930, 60, 9)
(42930, 60, 9)
(200337, 1)
(42930, 1)
(42930, 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 [ ]:
#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_take2.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}
401/401 [==============================] - 235s 553ms/step - loss: 92.8122 - val_loss: 84.9287
Epoch {1}
401/401 [==============================] - 219s 547ms/step - loss: 84.9428 - val_loss: 85.0210
Epoch {2}
401/401 [==============================] - 219s 547ms/step - loss: 84.5911 - val_loss: 83.9458
Epoch {3}
401/401 [==============================] - 219s 547ms/step - loss: 84.0719 - val_loss: 83.7372
Epoch {4}
401/401 [==============================] - 219s 545ms/step - loss: 83.8401 - val_loss: 83.5717
Epoch {5}
401/401 [==============================] - 218s 544ms/step - loss: 83.8545 - val_loss: 84.8215
Epoch {6}
401/401 [==============================] - 217s 541ms/step - loss: 83.6767 - val_loss: 85.2346
Epoch {7}
401/401 [==============================] - 217s 541ms/step - loss: 83.7512 - val_loss: 83.6641
Epoch {8}
401/401 [==============================] - 216s 538ms/step - loss: 83.5393 - val_loss: 83.6520
Epoch {9}
401/401 [==============================] - 216s 539ms/step - loss: 83.5237 - val_loss: 83.2680
Epoch {10}
401/401 [==============================] - 218s 543ms/step - loss: 83.5050 - val_loss: 83.2555
Epoch {11}
401/401 [==============================] - 216s 540ms/step - loss: 83.4263 - val_loss: 83.4342
Epoch {12}
401/401 [==============================] - 216s 538ms/step - loss: 83.5989 - val_loss: 83.2175
Epoch {13}
401/401 [==============================] - 217s 540ms/step - loss: 83.3163 - val_loss: 83.8450
Epoch {14}
401/401 [==============================] - 215s 536ms/step - loss: 83.2621 - val_loss: 83.1280
Epoch {15}
401/401 [==============================] - 216s 538ms/step - loss: 83.1384 - val_loss: 83.3414
Epoch {16}
401/401 [==============================] - 216s 540ms/step - loss: 83.2048 - val_loss: 82.8992
Epoch {17}
401/401 [==============================] - 216s 539ms/step - loss: 83.6191 - val_loss: 83.4599
Epoch {18}
401/401 [==============================] - 217s 540ms/step - loss: 83.2614 - val_loss: 83.0179
Epoch {19}
401/401 [==============================] - 216s 538ms/step - loss: 83.0979 - val_loss: 82.9933
Epoch {20}
401/401 [==============================] - 216s 540ms/step - loss: 82.9981 - val_loss: 83.1337
Epoch {21}
401/401 [==============================] - 217s 541ms/step - loss: 83.3534 - val_loss: 83.2616
Epoch {22}
401/401 [==============================] - 216s 538ms/step - loss: 83.0058 - val_loss: 83.3742
Epoch {23}
401/401 [==============================] - 215s 537ms/step - loss: 82.8949 - val_loss: 82.8818
Epoch {24}
401/401 [==============================] - 216s 540ms/step - loss: 82.8733 - val_loss: 82.9096
Epoch {25}
401/401 [==============================] - 216s 539ms/step - loss: 82.7388 - val_loss: 82.9174
Epoch {26}
401/401 [==============================] - 216s 538ms/step - loss: 82.6197 - val_loss: 82.8225
Epoch {27}
401/401 [==============================] - 217s 542ms/step - loss: 82.6324 - val_loss: 82.7165
Epoch {28}
401/401 [==============================] - 217s 541ms/step - loss: 82.6395 - val_loss: 82.9619
Epoch {29}
401/401 [==============================] - 217s 540ms/step - loss: 82.5301 - val_loss: 82.6542
Epoch {30}
401/401 [==============================] - 216s 539ms/step - loss: 82.4292 - val_loss: 82.7544
Epoch {31}
401/401 [==============================] - 216s 540ms/step - loss: 82.3163 - val_loss: 82.5337
Epoch {32}
401/401 [==============================] - 217s 542ms/step - loss: 82.2777 - val_loss: 82.4381
Epoch {33}
401/401 [==============================] - 216s 539ms/step - loss: 82.2332 - val_loss: 82.3882
Epoch {34}
401/401 [==============================] - 216s 539ms/step - loss: 82.1103 - val_loss: 82.3868
Epoch {35}
401/401 [==============================] - 216s 540ms/step - loss: 82.2566 - val_loss: 82.5256
Epoch {36}
401/401 [==============================] - 217s 540ms/step - loss: 82.0328 - val_loss: 82.1725
Epoch {37}
401/401 [==============================] - 217s 541ms/step - loss: 81.8559 - val_loss: 82.5292
Epoch {38}
401/401 [==============================] - 218s 543ms/step - loss: 81.8228 - val_loss: 82.0848
Epoch {39}
401/401 [==============================] - 216s 539ms/step - loss: 81.6979 - val_loss: 82.0048
Epoch {40}
401/401 [==============================] - 217s 542ms/step - loss: 81.6386 - val_loss: 82.1347
Epoch {41}
401/401 [==============================] - 217s 541ms/step - loss: 81.4803 - val_loss: 81.9483
Epoch {42}
401/401 [==============================] - 216s 539ms/step - loss: 81.3467 - val_loss: 81.9057
Epoch {43}
401/401 [==============================] - 216s 540ms/step - loss: 81.2729 - val_loss: 81.6880
Epoch {44}
401/401 [==============================] - 217s 540ms/step - loss: 81.1227 - val_loss: 81.4872
Epoch {45}
401/401 [==============================] - 217s 542ms/step - loss: 80.9853 - val_loss: 81.5364
Epoch {46}
401/401 [==============================] - 218s 543ms/step - loss: 80.7934 - val_loss: 81.3115
Epoch {47}
401/401 [==============================] - 216s 538ms/step - loss: 80.6937 - val_loss: 81.3160
Epoch {48}
401/401 [==============================] - 217s 540ms/step - loss: 80.5339 - val_loss: 81.0083
Epoch {49}
401/401 [==============================] - 217s 540ms/step - loss: 80.3940 - val_loss: 80.9763
Epoch {50}
401/401 [==============================] - 217s 540ms/step - loss: 80.1273 - val_loss: 80.9803
Epoch {51}
401/401 [==============================] - 216s 538ms/step - loss: 79.9189 - val_loss: 80.7292
Epoch {52}
401/401 [==============================] - 217s 540ms/step - loss: 79.6818 - val_loss: 80.7028
Epoch {53}
401/401 [==============================] - 216s 538ms/step - loss: 79.5491 - val_loss: 80.4903
Epoch {54}
401/401 [==============================] - 216s 538ms/step - loss: 79.3103 - val_loss: 80.0156
Epoch {55}
401/401 [==============================] - 216s 538ms/step - loss: 79.1402 - val_loss: 79.8615
Epoch {56}
401/401 [==============================] - 217s 541ms/step - loss: 78.8721 - val_loss: 80.2680
Epoch {57}
401/401 [==============================] - 217s 542ms/step - loss: 78.7382 - val_loss: 79.8621
Epoch {58}
401/401 [==============================] - 216s 538ms/step - loss: 78.5503 - val_loss: 79.6697
Epoch {59}
401/401 [==============================] - 218s 544ms/step - loss: 78.1248 - val_loss: 79.2896
Epoch {61}
401/401 [==============================] - 219s 546ms/step - loss: 77.8770 - val_loss: 79.2735
Epoch {62}
401/401 [==============================] - 218s 544ms/step - loss: 77.6700 - val_loss: 78.8796
Epoch {63}
401/401 [==============================] - 219s 546ms/step - loss: 77.4123 - val_loss: 78.6680
Epoch {64}
401/401 [==============================] - 218s 545ms/step - loss: 77.2242 - val_loss: 78.6922
Epoch {65}
401/401 [==============================] - 218s 544ms/step - loss: 76.9965 - val_loss: 78.6453
Epoch {66}
401/401 [==============================] - 222s 555ms/step - loss: 76.8428 - val_loss: 78.7607
Epoch {67}
401/401 [==============================] - 219s 546ms/step - loss: 76.6378 - val_loss: 78.3506
Epoch {68}
401/401 [==============================] - 220s 549ms/step - loss: 76.4411 - val_loss: 78.3003
Epoch {69}
401/401 [==============================] - 220s 548ms/step - loss: 76.2352 - val_loss: 78.1769
Epoch {70}
401/401 [==============================] - 218s 545ms/step - loss: 75.9956 - val_loss: 77.6856
Epoch {71}
401/401 [==============================] - 218s 543ms/step - loss: 75.7297 - val_loss: 77.7279
Epoch {72}
401/401 [==============================] - 219s 546ms/step - loss: 75.6561 - val_loss: 77.7105
Epoch {73}
401/401 [==============================] - 217s 540ms/step - loss: 75.3969 - val_loss: 77.6314
Epoch {74}
401/401 [==============================] - 215s 536ms/step - loss: 75.1690 - val_loss: 77.2845
Epoch {75}
401/401 [==============================] - 215s 536ms/step - loss: 75.0211 - val_loss: 76.8827
Epoch {76}
401/401 [==============================] - 216s 540ms/step - loss: 74.8540 - val_loss: 76.8148
Epoch {77}
401/401 [==============================] - 216s 538ms/step - loss: 74.4988 - val_loss: 76.6936
Epoch {78}
401/401 [==============================] - 216s 538ms/step - loss: 74.4268 - val_loss: 76.7197
Epoch {79}
401/401 [==============================] - 219s 546ms/step - loss: 74.1031 - val_loss: 76.5946
Epoch {80}
306/401 [=====================>........] - ETA: 46s - loss: 73.5987
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_take2.h5')
print(model.evaluate(Xtest,yTest))
1342/1342 [==============================] - 97s 70ms/step - loss: 65.6605
65.6605453491211
In [27]:
pred = model.predict(Xtest)
1342/1342 [==============================] - 101s 73ms/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: 6.596753303191891
MSE: 65.66055747557922
RMSE: 8.103120230848067
R-Squared: [0.22897081]

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

In [ ]:
#another 150 epochs to train

model = load_model( 'bilstm_predict_rul_experiment8_extended_full_take2.h5')
epoch = 150
historyvet =[]

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_take2_part2.h5')
model.summary()
Epoch {0}
401/401 [==============================] - 233s 563ms/step - loss: 61.4369 - val_loss: 67.7014
Epoch {1}
401/401 [==============================] - 221s 551ms/step - loss: 60.7073 - val_loss: 66.9075
Epoch {2}
401/401 [==============================] - 220s 549ms/step - loss: 60.5731 - val_loss: 65.3768
Epoch {3}
401/401 [==============================] - 218s 544ms/step - loss: 60.4557 - val_loss: 65.7222
Epoch {4}
401/401 [==============================] - 220s 550ms/step - loss: 60.0413 - val_loss: 67.7645
Epoch {5}
401/401 [==============================] - 221s 551ms/step - loss: 60.3019 - val_loss: 65.6037
Epoch {6}
401/401 [==============================] - 221s 550ms/step - loss: 60.3881 - val_loss: 65.1572
Epoch {7}
401/401 [==============================] - 223s 555ms/step - loss: 59.8136 - val_loss: 66.2358
Epoch {8}
401/401 [==============================] - 222s 554ms/step - loss: 59.5725 - val_loss: 65.5955
Epoch {9}
401/401 [==============================] - 219s 545ms/step - loss: 59.5176 - val_loss: 64.4465
Epoch {10}
401/401 [==============================] - 218s 543ms/step - loss: 59.4475 - val_loss: 64.7505
Epoch {11}
401/401 [==============================] - 220s 549ms/step - loss: 59.3431 - val_loss: 64.3998
Epoch {12}
401/401 [==============================] - 225s 561ms/step - loss: 58.6588 - val_loss: 64.7519
Epoch {13}
401/401 [==============================] - 219s 547ms/step - loss: 58.6263 - val_loss: 67.3454
Epoch {14}
401/401 [==============================] - 219s 547ms/step - loss: 58.4996 - val_loss: 64.7940
Epoch {15}
401/401 [==============================] - 218s 544ms/step - loss: 58.4543 - val_loss: 63.9119
Epoch {16}
401/401 [==============================] - 220s 547ms/step - loss: 58.1140 - val_loss: 63.6129
Epoch {17}
401/401 [==============================] - 220s 548ms/step - loss: 58.0378 - val_loss: 63.6366
Epoch {18}
340/401 [========================>.....] - ETA: 30s - loss: 57.6767
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)
1342/1342 [==============================] - 95s 66ms/step
In [32]:
print(model.evaluate(Xtest,yTest))
1342/1342 [==============================] - 90s 67ms/step - loss: 39.0607
39.06074523925781
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: 4.686460824318068
MSE: 39.0607247452565
RMSE: 6.2498579780069
R-Squared: [0.54132343]
In [ ]:
#another 150 epochs to train

model = load_model( 'bilstm_predict_rul_experiment8_extended_full_take2_part2.h5')
epoch = 150
historyvet =[]

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_take2_part3.h5')
model.summary()
Epoch {0}
401/401 [==============================] - 234s 565ms/step - loss: 31.2476 - val_loss: 39.4803
Epoch {1}
401/401 [==============================] - 217s 542ms/step - loss: 30.2632 - val_loss: 38.4035
Epoch {2}
401/401 [==============================] - 218s 543ms/step - loss: 30.0561 - val_loss: 42.8214
Epoch {3}
401/401 [==============================] - 220s 549ms/step - loss: 30.7828 - val_loss: 39.0291
Epoch {4}
401/401 [==============================] - 221s 551ms/step - loss: 29.5461 - val_loss: 37.4229
Epoch {5}
401/401 [==============================] - 221s 551ms/step - loss: 30.2005 - val_loss: 40.7866
Epoch {6}
401/401 [==============================] - 222s 554ms/step - loss: 29.5961 - val_loss: 42.7344
Epoch {7}
401/401 [==============================] - 223s 556ms/step - loss: 29.3946 - val_loss: 40.0666
Epoch {8}
401/401 [==============================] - 222s 554ms/step - loss: 29.2059 - val_loss: 38.7470
Epoch {9}
401/401 [==============================] - 224s 558ms/step - loss: 28.9327 - val_loss: 39.7285
Epoch {10}
401/401 [==============================] - 220s 550ms/step - loss: 29.6296 - val_loss: 37.9657
Epoch {11}
401/401 [==============================] - 220s 549ms/step - loss: 28.7611 - val_loss: 38.6359
Epoch {12}
401/401 [==============================] - 220s 548ms/step - loss: 28.8319 - val_loss: 36.7309
Epoch {13}
401/401 [==============================] - 220s 549ms/step - loss: 28.1567 - val_loss: 36.8362
Epoch {14}
401/401 [==============================] - 220s 548ms/step - loss: 27.8235 - val_loss: 36.7315
Epoch {15}
401/401 [==============================] - 220s 549ms/step - loss: 29.2316 - val_loss: 36.4354
Epoch {16}
401/401 [==============================] - 219s 547ms/step - loss: 27.8606 - val_loss: 38.4014
Epoch {17}
401/401 [==============================] - 221s 552ms/step - loss: 27.6111 - val_loss: 38.5687
Epoch {18}
401/401 [==============================] - 221s 551ms/step - loss: 27.0063 - val_loss: 40.3143
Epoch {19}
401/401 [==============================] - 220s 549ms/step - loss: 27.2545 - val_loss: 36.2094
Epoch {20}
401/401 [==============================] - ETA: 0s - loss: 27.5948
In [35]:
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 [36]:
pred = model.predict(Xtest)
1342/1342 [==============================] - 94s 68ms/step
In [37]:
print(model.evaluate(Xtest,yTest))
1342/1342 [==============================] - 95s 71ms/step - loss: 24.6568
24.656784057617188
In [38]:
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.6131264009058905
MSE: 24.656778787791826
RMSE: 4.965559262338113
R-Squared: [0.71046398]
In [ ]:
#another 150 epochs to train

model = load_model( 'bilstm_predict_rul_experiment8_extended_full_take2_part3.h5')
epoch = 150
historyvet =[]

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_take2_part4.h5')
model.summary()
Epoch {0}
401/401 [==============================] - 236s 565ms/step - loss: 15.9210 - val_loss: 29.0664
Epoch {1}
401/401 [==============================] - 222s 553ms/step - loss: 15.1446 - val_loss: 26.9247
Epoch {2}
401/401 [==============================] - 222s 553ms/step - loss: 16.6580 - val_loss: 27.0608
Epoch {3}
401/401 [==============================] - 221s 551ms/step - loss: 15.6186 - val_loss: 25.1585
Epoch {4}
401/401 [==============================] - 220s 548ms/step - loss: 14.5957 - val_loss: 28.7059
Epoch {5}
401/401 [==============================] - 222s 552ms/step - loss: 17.2268 - val_loss: 27.2629
Epoch {6}
401/401 [==============================] - 221s 551ms/step - loss: 15.6433 - val_loss: 24.4611
Epoch {7}
401/401 [==============================] - 220s 548ms/step - loss: 15.4466 - val_loss: 26.4037
Epoch {8}
401/401 [==============================] - 220s 550ms/step - loss: 16.0261 - val_loss: 25.1107
Epoch {9}
401/401 [==============================] - 220s 549ms/step - loss: 14.3738 - val_loss: 25.3910
Epoch {10}
401/401 [==============================] - 221s 551ms/step - loss: 21.6420 - val_loss: 34.9434
Epoch {11}
401/401 [==============================] - 221s 552ms/step - loss: 19.7200 - val_loss: 26.9873
Epoch {12}
401/401 [==============================] - 221s 551ms/step - loss: 15.9794 - val_loss: 24.0281
Epoch {13}
401/401 [==============================] - 222s 553ms/step - loss: 14.6064 - val_loss: 26.3621
Epoch {14}
310/401 [======================>.......] - ETA: 45s - loss: 20.0066
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)
1342/1342 [==============================] - 101s 70ms/step
In [42]:
print(model.evaluate(Xtest,yTest))
1342/1342 [==============================] - 93s 69ms/step - loss: 18.2670
18.266984939575195
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: 3.0380673508383915
MSE: 18.266999225148204
RMSE: 4.27399101837477
R-Squared: [0.78549695]
In [44]:
#another 150 epochs to train

model = load_model( 'bilstm_predict_rul_experiment8_extended_full_take2_part4.h5')
epoch = 150
historyvet =[]

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_take2_part5.h5')
model.summary()
Epoch {0}
401/401 [==============================] - 237s 574ms/step - loss: 10.1911 - val_loss: 20.0340
Epoch {1}
401/401 [==============================] - 226s 563ms/step - loss: 11.5154 - val_loss: 21.0004
Epoch {2}
401/401 [==============================] - 222s 553ms/step - loss: 10.3234 - val_loss: 18.1452
Epoch {3}
401/401 [==============================] - 223s 556ms/step - loss: 9.6100 - val_loss: 20.7835
Epoch {4}
401/401 [==============================] - 222s 553ms/step - loss: 9.7245 - val_loss: 18.0271
Epoch {5}
401/401 [==============================] - 222s 554ms/step - loss: 9.6922 - val_loss: 19.1018
Epoch {6}
401/401 [==============================] - 220s 549ms/step - loss: 10.1971 - val_loss: 19.2618
Epoch {7}
401/401 [==============================] - 222s 554ms/step - loss: 12.4140 - val_loss: 19.5756
Epoch {8}
401/401 [==============================] - 222s 554ms/step - loss: 10.3606 - val_loss: 18.1911
Epoch {9}
401/401 [==============================] - 221s 552ms/step - loss: 11.7900 - val_loss: 19.3602
Epoch {10}
401/401 [==============================] - 221s 551ms/step - loss: 10.3269 - val_loss: 23.5043
Epoch {11}
401/401 [==============================] - 222s 553ms/step - loss: 10.0624 - val_loss: 20.2693
Epoch {12}
401/401 [==============================] - 222s 553ms/step - loss: 10.6708 - val_loss: 18.6421
Epoch {13}
401/401 [==============================] - 222s 554ms/step - loss: 10.2877 - val_loss: 20.8051
Epoch {14}
401/401 [==============================] - 222s 554ms/step - loss: 10.5713 - val_loss: 18.9866
Epoch {15}
401/401 [==============================] - 221s 551ms/step - loss: 10.1824 - val_loss: 18.4252
Epoch {16}
401/401 [==============================] - 224s 558ms/step - loss: 11.4057 - val_loss: 20.7604
Epoch {17}
401/401 [==============================] - 222s 554ms/step - loss: 9.5444 - val_loss: 16.7429
Epoch {18}
401/401 [==============================] - 221s 550ms/step - loss: 9.6775 - val_loss: 18.9371
Epoch {19}
401/401 [==============================] - 221s 552ms/step - loss: 10.2164 - val_loss: 23.5961
Epoch {20}
401/401 [==============================] - 221s 551ms/step - loss: 13.6619 - val_loss: 17.8863
Epoch {21}
401/401 [==============================] - 223s 555ms/step - loss: 9.0597 - val_loss: 20.1740
Epoch {22}
401/401 [==============================] - 221s 550ms/step - loss: 10.0528 - val_loss: 18.9002
Epoch {23}
401/401 [==============================] - 222s 554ms/step - loss: 10.5297 - val_loss: 18.3544
Epoch {24}
401/401 [==============================] - 223s 555ms/step - loss: 10.5057 - val_loss: 19.1291
Epoch {25}
401/401 [==============================] - 223s 555ms/step - loss: 10.0979 - val_loss: 18.7988
Epoch {26}
401/401 [==============================] - 222s 553ms/step - loss: 10.2725 - val_loss: 21.2651
Epoch {27}
401/401 [==============================] - 222s 553ms/step - loss: 9.2537 - val_loss: 19.3949
Epoch {28}
401/401 [==============================] - 223s 555ms/step - loss: 10.1059 - val_loss: 16.8795
Epoch {29}
401/401 [==============================] - 223s 555ms/step - loss: 31.6589 - val_loss: 33.9948
Epoch {30}
401/401 [==============================] - 221s 552ms/step - loss: 20.5709 - val_loss: 25.9805
Epoch {31}
401/401 [==============================] - 222s 554ms/step - loss: 17.0967 - val_loss: 25.8051
Epoch {32}
401/401 [==============================] - 221s 552ms/step - loss: 16.1695 - val_loss: 24.3259
Epoch {33}
401/401 [==============================] - 221s 552ms/step - loss: 15.2121 - val_loss: 24.7448
Epoch {34}
401/401 [==============================] - 221s 551ms/step - loss: 15.0843 - val_loss: 23.0459
Epoch {35}
401/401 [==============================] - 222s 553ms/step - loss: 16.2185 - val_loss: 23.5857
Epoch {36}
401/401 [==============================] - 222s 554ms/step - loss: 14.3597 - val_loss: 24.6068
Epoch {37}
401/401 [==============================] - 224s 558ms/step - loss: 17.3436 - val_loss: 24.0528
Epoch {38}
401/401 [==============================] - 219s 547ms/step - loss: 14.0442 - val_loss: 23.2460
Epoch {39}
401/401 [==============================] - 222s 553ms/step - loss: 14.7327 - val_loss: 22.1465
Epoch {40}
401/401 [==============================] - 221s 550ms/step - loss: 14.7535 - val_loss: 22.5981
Epoch {41}
401/401 [==============================] - 222s 554ms/step - loss: 13.0029 - val_loss: 23.0132
Epoch {42}
401/401 [==============================] - 223s 556ms/step - loss: 14.3959 - val_loss: 23.0746
Epoch {43}
401/401 [==============================] - 220s 548ms/step - loss: 14.6933 - val_loss: 24.7570
Epoch {44}
401/401 [==============================] - 222s 553ms/step - loss: 13.5441 - val_loss: 21.2546
Epoch {45}
401/401 [==============================] - 221s 550ms/step - loss: 12.8601 - val_loss: 20.8996
Epoch {46}
401/401 [==============================] - 222s 553ms/step - loss: 12.8885 - val_loss: 23.2225
Epoch {47}
401/401 [==============================] - 222s 553ms/step - loss: 13.5670 - val_loss: 26.3462
Epoch {48}
401/401 [==============================] - 223s 556ms/step - loss: 13.3832 - val_loss: 21.5223
Epoch {49}
401/401 [==============================] - 220s 550ms/step - loss: 12.1610 - val_loss: 22.8895
Epoch {50}
401/401 [==============================] - 222s 553ms/step - loss: 11.8629 - val_loss: 23.1259
Epoch {51}
401/401 [==============================] - 220s 549ms/step - loss: 12.5899 - val_loss: 19.0460
Epoch {52}
401/401 [==============================] - 223s 555ms/step - loss: 11.8993 - val_loss: 26.1773
Epoch {53}
401/401 [==============================] - 222s 554ms/step - loss: 13.2957 - val_loss: 22.7201
Epoch {54}
401/401 [==============================] - 221s 551ms/step - loss: 12.4298 - val_loss: 19.5979
Epoch {55}
401/401 [==============================] - 222s 554ms/step - loss: 11.2135 - val_loss: 20.2887
Epoch {56}
401/401 [==============================] - 221s 552ms/step - loss: 11.4082 - val_loss: 22.3006
Epoch {57}
401/401 [==============================] - 222s 553ms/step - loss: 11.4554 - val_loss: 18.2129
Epoch {58}
401/401 [==============================] - 222s 553ms/step - loss: 11.1581 - val_loss: 22.9550
Epoch {59}
401/401 [==============================] - 221s 551ms/step - loss: 11.6429 - val_loss: 19.2440
Epoch {60}
401/401 [==============================] - 221s 552ms/step - loss: 10.6054 - val_loss: 22.3513
Epoch {61}
401/401 [==============================] - 222s 554ms/step - loss: 11.6638 - val_loss: 20.7543
Epoch {62}
401/401 [==============================] - 222s 553ms/step - loss: 12.0726 - val_loss: 19.5326
Epoch {63}
401/401 [==============================] - 222s 554ms/step - loss: 11.7858 - val_loss: 19.5101
Epoch {64}
401/401 [==============================] - 220s 549ms/step - loss: 13.1620 - val_loss: 28.0415
Epoch {65}
401/401 [==============================] - 222s 553ms/step - loss: 10.5737 - val_loss: 18.1346
Epoch {66}
401/401 [==============================] - 223s 557ms/step - loss: 9.7481 - val_loss: 21.7710
Epoch {67}
401/401 [==============================] - 219s 547ms/step - loss: 16.2130 - val_loss: 39.9367
Epoch {68}
401/401 [==============================] - 221s 551ms/step - loss: 21.2600 - val_loss: 26.8478
Epoch {69}
401/401 [==============================] - 220s 548ms/step - loss: 17.7322 - val_loss: 27.4722
Epoch {70}
401/401 [==============================] - 221s 552ms/step - loss: 17.3487 - val_loss: 25.8234
Epoch {71}
401/401 [==============================] - 220s 549ms/step - loss: 15.2978 - val_loss: 24.1048
Epoch {72}
401/401 [==============================] - 221s 550ms/step - loss: 14.2951 - val_loss: 21.7529
Epoch {73}
401/401 [==============================] - 221s 551ms/step - loss: 14.3886 - val_loss: 21.9283
Epoch {74}
401/401 [==============================] - 223s 555ms/step - loss: 14.5375 - val_loss: 21.2238
Epoch {75}
401/401 [==============================] - 220s 548ms/step - loss: 14.7485 - val_loss: 22.8932
Epoch {76}
401/401 [==============================] - 222s 553ms/step - loss: 13.6627 - val_loss: 23.5823
Epoch {77}
401/401 [==============================] - 221s 552ms/step - loss: 15.6706 - val_loss: 24.3290
Epoch {78}
401/401 [==============================] - 220s 549ms/step - loss: 13.6545 - val_loss: 20.8670
Epoch {79}
401/401 [==============================] - 221s 551ms/step - loss: 13.3318 - val_loss: 24.7175
Epoch {80}
401/401 [==============================] - 219s 547ms/step - loss: 12.7207 - val_loss: 24.2255
Epoch {81}
401/401 [==============================] - 221s 551ms/step - loss: 13.9079 - val_loss: 20.3543
Epoch {82}
401/401 [==============================] - 221s 550ms/step - loss: 14.4751 - val_loss: 20.1711
Epoch {83}
401/401 [==============================] - 221s 551ms/step - loss: 13.2354 - val_loss: 21.2368
Epoch {84}
401/401 [==============================] - 220s 548ms/step - loss: 14.1005 - val_loss: 19.6584
Epoch {85}
401/401 [==============================] - 222s 554ms/step - loss: 12.7860 - val_loss: 21.8026
Epoch {86}
401/401 [==============================] - 221s 552ms/step - loss: 11.8752 - val_loss: 24.4551
Epoch {87}
401/401 [==============================] - 222s 553ms/step - loss: 11.7880 - val_loss: 18.9306
Epoch {88}
401/401 [==============================] - 221s 550ms/step - loss: 12.8745 - val_loss: 20.7034
Epoch {89}
401/401 [==============================] - 222s 554ms/step - loss: 13.5786 - val_loss: 22.9336
Epoch {90}
401/401 [==============================] - 221s 551ms/step - loss: 12.0763 - val_loss: 18.8411
Epoch {91}
401/401 [==============================] - 221s 550ms/step - loss: 10.2351 - val_loss: 17.7204
Epoch {92}
401/401 [==============================] - 221s 551ms/step - loss: 12.1949 - val_loss: 19.6158
Epoch {93}
401/401 [==============================] - 221s 550ms/step - loss: 11.1835 - val_loss: 18.5021
Epoch {94}
401/401 [==============================] - 222s 553ms/step - loss: 9.9344 - val_loss: 20.3782
Epoch {95}
401/401 [==============================] - 221s 551ms/step - loss: 11.4455 - val_loss: 20.3077
Epoch {96}
401/401 [==============================] - 221s 550ms/step - loss: 16.3836 - val_loss: 21.5549
Epoch {97}
401/401 [==============================] - 221s 552ms/step - loss: 13.5667 - val_loss: 21.7264
Epoch {98}
401/401 [==============================] - 221s 550ms/step - loss: 13.4868 - val_loss: 22.1307
Epoch {99}
401/401 [==============================] - 220s 549ms/step - loss: 11.5874 - val_loss: 20.6492
Epoch {100}
401/401 [==============================] - 221s 550ms/step - loss: 11.3918 - val_loss: 20.2097
Epoch {101}
401/401 [==============================] - 221s 551ms/step - loss: 9.6784 - val_loss: 17.3080
Epoch {102}
401/401 [==============================] - 219s 546ms/step - loss: 9.8865 - val_loss: 20.2534
Epoch {103}
401/401 [==============================] - 219s 546ms/step - loss: 12.1497 - val_loss: 19.5047
Epoch {104}
401/401 [==============================] - 220s 549ms/step - loss: 14.9287 - val_loss: 22.5198
Epoch {105}
401/401 [==============================] - 221s 551ms/step - loss: 10.8704 - val_loss: 17.8845
Epoch {106}
401/401 [==============================] - 221s 551ms/step - loss: 9.5670 - val_loss: 17.8777
Epoch {107}
401/401 [==============================] - 221s 551ms/step - loss: 18.2607 - val_loss: 21.4245
Epoch {108}
401/401 [==============================] - 221s 551ms/step - loss: 12.0648 - val_loss: 26.7878
Epoch {109}
401/401 [==============================] - 221s 552ms/step - loss: 11.4658 - val_loss: 19.3835
Epoch {110}
401/401 [==============================] - 222s 553ms/step - loss: 15.5567 - val_loss: 21.7142
Epoch {111}
401/401 [==============================] - 220s 549ms/step - loss: 10.3381 - val_loss: 17.9763
Epoch {112}
401/401 [==============================] - 220s 548ms/step - loss: 14.8971 - val_loss: 19.2263
Epoch {113}
401/401 [==============================] - 221s 551ms/step - loss: 9.1857 - val_loss: 18.6832
Epoch {114}
401/401 [==============================] - 221s 550ms/step - loss: 10.0826 - val_loss: 17.2240
Epoch {115}
401/401 [==============================] - 221s 551ms/step - loss: 10.8023 - val_loss: 19.0173
Epoch {116}
401/401 [==============================] - 220s 549ms/step - loss: 11.7297 - val_loss: 17.9794
Epoch {117}
401/401 [==============================] - 221s 551ms/step - loss: 9.2279 - val_loss: 17.0566
Epoch {118}
401/401 [==============================] - 221s 552ms/step - loss: 14.2826 - val_loss: 25.0263
Epoch {119}
401/401 [==============================] - 222s 553ms/step - loss: 14.2783 - val_loss: 19.7532
Epoch {120}
401/401 [==============================] - 221s 551ms/step - loss: 9.0428 - val_loss: 18.4545
Epoch {121}
401/401 [==============================] - 223s 555ms/step - loss: 8.2855 - val_loss: 16.9691
Epoch {122}
401/401 [==============================] - 221s 552ms/step - loss: 11.2581 - val_loss: 20.8325
Epoch {123}
401/401 [==============================] - 222s 555ms/step - loss: 10.4298 - val_loss: 17.1205
Epoch {124}
401/401 [==============================] - 222s 553ms/step - loss: 9.6759 - val_loss: 18.1848
Epoch {125}
401/401 [==============================] - 222s 553ms/step - loss: 9.4522 - val_loss: 17.9753
Epoch {126}
401/401 [==============================] - 223s 556ms/step - loss: 9.9958 - val_loss: 17.3487
Epoch {127}
401/401 [==============================] - 222s 553ms/step - loss: 11.5105 - val_loss: 24.6533
Epoch {128}
401/401 [==============================] - 222s 553ms/step - loss: 10.5263 - val_loss: 21.0108
Epoch {129}
401/401 [==============================] - 221s 551ms/step - loss: 10.1754 - val_loss: 17.8999
Epoch {130}
401/401 [==============================] - 223s 556ms/step - loss: 9.8174 - val_loss: 16.8662
Epoch {131}
401/401 [==============================] - 223s 555ms/step - loss: 8.3500 - val_loss: 16.4740
Epoch {132}
401/401 [==============================] - 222s 554ms/step - loss: 12.0988 - val_loss: 17.7790
Epoch {133}
401/401 [==============================] - 221s 552ms/step - loss: 7.8509 - val_loss: 16.6751
Epoch {134}
401/401 [==============================] - 223s 557ms/step - loss: 10.7185 - val_loss: 18.6981
Epoch {135}
401/401 [==============================] - 222s 552ms/step - loss: 15.5791 - val_loss: 19.8200
Epoch {136}
401/401 [==============================] - 222s 554ms/step - loss: 9.2083 - val_loss: 17.1555
Epoch {137}
401/401 [==============================] - 221s 552ms/step - loss: 9.6127 - val_loss: 18.3381
Epoch {138}
401/401 [==============================] - 221s 552ms/step - loss: 14.4790 - val_loss: 23.4632
Epoch {139}
401/401 [==============================] - 224s 558ms/step - loss: 12.8079 - val_loss: 31.4013
Epoch {140}
401/401 [==============================] - 222s 553ms/step - loss: 10.0898 - val_loss: 15.6153
Epoch {141}
401/401 [==============================] - 221s 552ms/step - loss: 8.3405 - val_loss: 17.2248
Epoch {142}
401/401 [==============================] - 223s 556ms/step - loss: 8.8954 - val_loss: 18.7809
Epoch {143}
401/401 [==============================] - 222s 555ms/step - loss: 16.7357 - val_loss: 25.5180
Epoch {144}
401/401 [==============================] - 223s 555ms/step - loss: 16.9232 - val_loss: 22.3621
Epoch {145}
401/401 [==============================] - 221s 551ms/step - loss: 10.3795 - val_loss: 15.6775
Epoch {146}
401/401 [==============================] - 222s 554ms/step - loss: 7.6569 - val_loss: 17.0027
Epoch {147}
401/401 [==============================] - 222s 553ms/step - loss: 20.6282 - val_loss: 40.0962
Epoch {148}
401/401 [==============================] - 223s 555ms/step - loss: 20.2619 - val_loss: 22.9381
Epoch {149}
401/401 [==============================] - 222s 552ms/step - loss: 14.0837 - val_loss: 22.8351
Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 bidirectional (Bidirection  (None, 60, 256)           141312    
 al)                                                             
                                                                 
 bidirectional_1 (Bidirecti  (None, 60, 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 [46]:
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 [47]:
pred = model.predict(Xtest)
1342/1342 [==============================] - 97s 71ms/step
In [48]:
print(model.evaluate(Xtest,yTest))
1342/1342 [==============================] - 95s 71ms/step - loss: 22.6386
22.63863754272461
In [49]:
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.396019944758952
MSE: 22.638652198807716
RMSE: 4.7580092684659325
R-Squared: [0.73416215]
In [ ]:
 

Fine tune

In [50]:
newModel = load_model( 'bilstm_predict_rul_experiment8_extended_full_take2_part4.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_take2_part4_best.h5')
newModel.summary()
Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 bidirectional (Bidirection  (None, 60, 256)           141312    
 al)                                                             
                                                                 
 bidirectional_1 (Bidirecti  (None, 60, 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
86/86 [==============================] - 59s 507ms/step - loss: 23.2153
Epoch 2/25
86/86 [==============================] - 43s 499ms/step - loss: 16.8423
Epoch 3/25
86/86 [==============================] - 43s 495ms/step - loss: 16.8764
Epoch 4/25
86/86 [==============================] - 43s 503ms/step - loss: 14.5695
Epoch 5/25
86/86 [==============================] - 43s 505ms/step - loss: 15.8548
Epoch 6/25
86/86 [==============================] - 43s 502ms/step - loss: 14.4943
Epoch 7/25
86/86 [==============================] - 43s 496ms/step - loss: 13.5403
Epoch 8/25
86/86 [==============================] - 43s 496ms/step - loss: 12.5136
Epoch 9/25
86/86 [==============================] - 43s 497ms/step - loss: 12.4321
Epoch 10/25
86/86 [==============================] - 43s 500ms/step - loss: 12.2096
Epoch 11/25
86/86 [==============================] - 43s 496ms/step - loss: 11.1654
Epoch 12/25
86/86 [==============================] - 43s 502ms/step - loss: 11.2050
Epoch 13/25
86/86 [==============================] - 43s 497ms/step - loss: 11.4696
Epoch 14/25
86/86 [==============================] - 43s 498ms/step - loss: 14.5517
Epoch 15/25
86/86 [==============================] - 43s 498ms/step - loss: 11.8839
Epoch 16/25
86/86 [==============================] - 43s 498ms/step - loss: 11.5035
Epoch 17/25
86/86 [==============================] - 43s 500ms/step - loss: 13.4582
Epoch 18/25
86/86 [==============================] - 43s 499ms/step - loss: 11.1590
Epoch 19/25
86/86 [==============================] - 43s 505ms/step - loss: 9.9155
Epoch 20/25
86/86 [==============================] - 43s 499ms/step - loss: 9.0699
Epoch 21/25
86/86 [==============================] - 43s 502ms/step - loss: 10.0819
Epoch 22/25
86/86 [==============================] - 43s 502ms/step - loss: 12.0419
Epoch 23/25
86/86 [==============================] - 42s 494ms/step - loss: 10.1867
Epoch 24/25
86/86 [==============================] - 43s 499ms/step - loss: 9.2870
Epoch 25/25
86/86 [==============================] - 43s 497ms/step - loss: 15.4750
Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 bidirectional (Bidirection  (None, 60, 256)           141312    
 al)                                                             
                                                                 
 bidirectional_1 (Bidirecti  (None, 60, 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 [51]:
print(newModel.evaluate(Xtest,yTest))
1342/1342 [==============================] - 94s 69ms/step - loss: 24.0179
24.017932891845703
In [52]:
pred = newModel.predict(Xtest)
1342/1342 [==============================] - 94s 68ms/step
In [53]:
# 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 [54]:
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 [55]:
y = yTest.copy()
yhat = pred.copy()
In [56]:
# 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.5631727280717835
MSE: 24.017930591932696
RMSE: 4.90080917726172
R-Squared: [0.71796576]
In [57]:
results = pd.DataFrame({'Predicted':pred.flatten()})
results['Actual'] = yTest.flatten()
results
Out[57]:
Predicted Actual
0 6.372204 13
1 27.241673 28
2 13.592990 4
3 21.745377 15
4 13.126698 15
... ... ...
42925 -1.093263 2
42926 16.448595 12
42927 21.141308 27
42928 27.599411 27
42929 27.264639 29

42930 rows × 2 columns