#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