#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
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')
#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)
| 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
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
#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
| 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
#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
| 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
df=clean.copy()
df = df.drop(columns= ['days_to_failure'], axis = 1)
df
| 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
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
| 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
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
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')
X_val, X_test, y_val, y_test = train_test_split(X_rim, y_rim ,stratify=y_rim, test_size=0.50)
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
X_train
#X_val
#X_test
| 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
X_train.shape
(200337, 541)
X_val.shape
(42930, 541)
Xtrain = X_train.copy()
Xtrain = Xtrain.drop(columns=['DayToFailure'], axis=1 )
Xtrain.shape
#Xtrain
(200337, 540)
Xval = X_val.copy()
Xval = Xval.drop(columns=['DayToFailure'], axis=1 )
Xval.shape
(42930, 540)
yTest = X_test[['DayToFailure']].values
#yTest
Xtest = X_test.drop(columns=['DayToFailure'], axis=1 )
#Xtest
#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))
ytrain = X_train[['DayToFailure']].values
yVal = X_val[['DayToFailure']].values
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)
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
#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
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()
#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
pred = model.predict(Xtest)
1342/1342 [==============================] - 101s 73ms/step
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
#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
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()
pred = model.predict(Xtest)
1342/1342 [==============================] - 95s 66ms/step
print(model.evaluate(Xtest,yTest))
1342/1342 [==============================] - 90s 67ms/step - loss: 39.0607 39.06074523925781
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]
#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
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()
pred = model.predict(Xtest)
1342/1342 [==============================] - 94s 68ms/step
print(model.evaluate(Xtest,yTest))
1342/1342 [==============================] - 95s 71ms/step - loss: 24.6568 24.656784057617188
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]
#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
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()
pred = model.predict(Xtest)
1342/1342 [==============================] - 101s 70ms/step
print(model.evaluate(Xtest,yTest))
1342/1342 [==============================] - 93s 69ms/step - loss: 18.2670 18.266984939575195
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]
#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)
_________________________________________________________________
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()
pred = model.predict(Xtest)
1342/1342 [==============================] - 97s 71ms/step
print(model.evaluate(Xtest,yTest))
1342/1342 [==============================] - 95s 71ms/step - loss: 22.6386 22.63863754272461
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]
 
Fine tune
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)
_________________________________________________________________
print(newModel.evaluate(Xtest,yTest))
1342/1342 [==============================] - 94s 69ms/step - loss: 24.0179 24.017932891845703
pred = newModel.predict(Xtest)
1342/1342 [==============================] - 94s 68ms/step
# 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()
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() 
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 - 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]
results = pd.DataFrame({'Predicted':pred.flatten()})
results['Actual'] = yTest.flatten()
results
| 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