No Description

v4.py 20KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558
  1. # Csar Fdez, UdL, 2025
  2. # Changes from v1: Normalization
  3. # IN v1, each failure type has its own normalization pars (mean and stdevs)
  4. # In v2, mean and stdev is the same for all data
  5. # v3.py trains the models looping in TIME_STEPS (4,8,12,16,20,24,....) finding the optimal Threshold factor
  6. # Changes in v4: see comments on v1_unsupervised.py
  7. # Be careful with v0_unsupervised and all versions for supervised.
  8. # because dataTrain is not stacke before create_sequences, so,
  9. # the sets are not aligned in time
  10. # Because in this case we don't observe into transitories, we keep independently each train set
  11. # Optimizxation of threshold factor changed, bacause is based on F1-Score
  12. import pandas as pd
  13. import matplotlib.pyplot as plt
  14. import datetime
  15. import numpy as np
  16. import keras
  17. import os.path
  18. from keras import layers
  19. from optparse import OptionParser
  20. import copy
  21. import pickle
  22. parser = OptionParser()
  23. parser.add_option("-t", "--train", dest="train", help="Trains the models (false)", default=False, action="store_true")
  24. parser.add_option("-o", "--optimizetf", dest="optimizetf", help="Optimzes Threshold Factor (false)", default=False, action="store_true")
  25. parser.add_option("-n", "--timesteps", dest="timesteps", help="TIME STEPS ", default=12)
  26. parser.add_option("-f", "--thresholdfactor", dest="TF", help="Threshold Factor ", default=1.4)
  27. (options, args) = parser.parse_args()
  28. # data files arrays. Index:
  29. # 0. No failure
  30. # 1. Blocked evaporator
  31. # 2. Full Blocked condenser
  32. # 3. Partial Blocked condenser
  33. # 4 Fan condenser not working
  34. # 5. Open door
  35. NumberOfFailures=4 # So far, we have only data for the first 4 types of failures
  36. datafiles=[]
  37. for i in range(NumberOfFailures+1):
  38. datafiles.append([])
  39. # Next set of ddata corresponds to Freezer, SP=-26
  40. datafiles[0]=['2024-08-07_5_','2024-08-08_5_','2025-01-25_5_','2025-01-26_5_','2025-01-27_5_','2025-01-28_5_']
  41. datafiles[1]=['2024-12-11_5_', '2024-12-12_5_','2024-12-13_5_','2024-12-14_5_','2024-12-15_5_']
  42. #datafiles[1]=['2024-12-17_5_','2024-12-16_5_','2024-12-11_5_', '2024-12-12_5_','2024-12-13_5_','2024-12-14_5_','2024-12-15_5_'] # This have transitions
  43. datafiles[2]=['2024-12-18_5_','2024-12-19_5_']
  44. datafiles[3]=['2024-12-21_5_','2024-12-22_5_','2024-12-23_5_','2024-12-24_5_','2024-12-25_5_','2024-12-26_5_']
  45. datafiles[4]=['2024-12-28_5_','2024-12-29_5_','2024-12-30_5_','2024-12-31_5_','2025-01-01_5_']
  46. #datafiles[4]=['2024-12-27_5_','2024-12-28_5_','2024-12-29_5_','2024-12-30_5_','2024-12-31_5_','2025-01-01_5_'] # This have transitions
  47. #datafiles[4]=[]
  48. # Features suggested by Xavier
  49. # Care with 'tc s3' because on datafiles[0] is always nulll
  50. # Seems to be incoropored in new tests
  51. #r1s5 supply air flow temperature
  52. #r1s1 inlet evaporator temperature
  53. #r1s4 condenser outlet
  54. # VAriables r1s4 and pa1 apiii may not exists in cloud controlers
  55. features=['r1 s1','r1 s4','r1 s5','pa1 apiii']
  56. features=['r1 s1','r1 s4','r1 s5']
  57. #features=['r1 s1','r1 s5']
  58. featureNames={}
  59. featureNames['r1 s1']='$T_{evap}$'
  60. featureNames['r1 s4']='$T_{cond}$'
  61. featureNames['r1 s5']='$T_{air}$'
  62. featureNames['pa1 apiii']='$P_{elec}$'
  63. unitNames={}
  64. unitNames['r1 s1']='$(^{o}C)$'
  65. unitNames['r1 s4']='$(^{o}C)$'
  66. unitNames['r1 s5']='$(^{o}C)$'
  67. unitNames['pa1 apiii']='$(W)$'
  68. #features=['r1 s1','r1 s2','r1 s3','r1 s4','r1 s5','r1 s6','r1 s7','r1 s8','r1 s9','r1 s10','r2 s1','r2 s2','r2 s3','r2 s4','r2 s5','r2 s6','r2 s7','r2 s8','r2 s9','pa1 apiii','tc s1','tc s2']
  69. #features=['r2 s2', 'tc s1','r1 s10','r1 s6','r2 s8']
  70. NumFeatures=len(features)
  71. df_list=[]
  72. for i in range(NumberOfFailures+1):
  73. df_list.append([])
  74. for i in range(NumberOfFailures+1):
  75. dftemp=[]
  76. for f in datafiles[i]:
  77. print(" ", f)
  78. #df1 = pd.read_csv('./data/'+f+'.csv', parse_dates=['datetime'], dayfirst=True, index_col='datetime')
  79. df1 = pd.read_csv('./data/'+f+'.csv')
  80. dftemp.append(df1)
  81. df_list[i]=pd.concat(dftemp)
  82. # subsampled to 5' = 30 * 10"
  83. # We consider smaples every 5' because in production, we will only have data at this frequency
  84. subsamplingrate=30
  85. dataframe=[]
  86. for i in range(NumberOfFailures+1):
  87. dataframe.append([])
  88. for i in range(NumberOfFailures+1):
  89. datalength=df_list[i].shape[0]
  90. dataframe[i]=df_list[i].iloc[range(0,datalength,subsamplingrate)][features]
  91. dataframe[i].reset_index(inplace=True,drop=True)
  92. dataframe[i].dropna(inplace=True)
  93. # Train data is first 2/3 of data
  94. # Test data is: last 1/3 of data
  95. dataTrain=[]
  96. dataTest=[]
  97. for i in range(NumberOfFailures+1):
  98. dataTrain.append(dataframe[i].values[0:int(dataframe[i].shape[0]*2/3),:])
  99. dataTest.append(dataframe[i].values[int(dataframe[i].shape[0]*2/3):,:])
  100. # Calculate means and stdev
  101. a=dataTrain[0]
  102. for i in range(1,NumberOfFailures+1):
  103. a=np.vstack((a,dataTrain[i]))
  104. means=a.mean(axis=0)
  105. stdevs=a.std(axis=0)
  106. def normalize2(train,test):
  107. return( (train-means)/stdevs, (test-means)/stdevs )
  108. dataTrainNorm=[]
  109. dataTestNorm=[]
  110. for i in range(NumberOfFailures+1):
  111. dataTrainNorm.append([])
  112. dataTestNorm.append([])
  113. for i in range(NumberOfFailures+1):
  114. (dataTrainNorm[i],dataTestNorm[i])=normalize2(dataTrain[i],dataTest[i])
  115. def plotData():
  116. fig, axes = plt.subplots(
  117. nrows=NumberOfFailures+1, ncols=2, figsize=(15, 20), dpi=80, facecolor="w", edgecolor="k",sharex=True
  118. )
  119. for i in range(NumberOfFailures+1):
  120. axes[i][0].plot(np.concatenate((dataTrainNorm[i][:,0],dataTestNorm[i][:,0])),label="Fail "+str(i)+", feature 0")
  121. axes[i][1].plot(np.concatenate((dataTrainNorm[i][:,1],dataTestNorm[i][:,1])),label="Fail "+str(i)+", feature 1")
  122. #axes[1].legend()
  123. #axes[0].set_ylabel(features[0])
  124. #axes[1].set_ylabel(features[1])
  125. plt.show()
  126. #plotData()
  127. #exit(0)
  128. NumFilters=64
  129. KernelSize=7
  130. DropOut=0.2
  131. ThresholdFactor=1.4
  132. def create_sequences(values, time_steps):
  133. output = []
  134. for i in range(len(values) - time_steps + 1):
  135. output.append(values[i : (i + time_steps)])
  136. return np.stack(output)
  137. def AtLeastOneTrue(x):
  138. for i in range(NumFeatures):
  139. if x[i]:
  140. return True
  141. return False
  142. def anomalyMetric(th,ts,testList): # first of list is non failure data
  143. # FP, TP: false/true positive
  144. # TN, FN: true/false negative
  145. # Sensitivity (recall): probab failure detection if data is fail: TP/(TP+FN)
  146. # Specificity: true negative ratio given data is OK: TN/(TN+FP)
  147. # Accuracy: Rate of correct predictions: (TN+TP)/(TN+TP+FP+FN)
  148. # Precision: Rate of positive results: TP/(TP+FP)
  149. # F1-score: predictive performance measure: 2*Precision*Sensitity/(Precision+Sensitity)
  150. # F2-score: predictive performance measure: 2*Specificity*Sensitity/(Specificity+Sensitity)
  151. x_test = create_sequences(testList[0],ts)
  152. x_test_pred = model.predict(x_test)
  153. test_mae_loss = np.mean(np.abs(x_test_pred - x_test), axis=1)
  154. anomalies = test_mae_loss > th
  155. count=0
  156. for i in range(anomalies.shape[0]):
  157. if AtLeastOneTrue(anomalies[i]):
  158. count+=1
  159. FP=count
  160. TN=anomalies.shape[0]-count
  161. count=0
  162. TP=np.zeros((NumberOfFailures))
  163. FN=np.zeros((NumberOfFailures))
  164. Sensitivity=np.zeros((NumberOfFailures))
  165. Precision=np.zeros((NumberOfFailures))
  166. for i in range(1,len(testList)):
  167. x_test = create_sequences(testList[i],ts)
  168. x_test_pred = model.predict(x_test)
  169. test_mae_loss = np.mean(np.abs(x_test_pred - x_test), axis=1)
  170. anomalies = test_mae_loss > th
  171. count=0
  172. for j in range(anomalies.shape[0]):
  173. if AtLeastOneTrue(anomalies[j]):
  174. count+=1
  175. TP[i-1] = count
  176. FN[i-1] = anomalies.shape[0]-count
  177. Sensitivity[i-1]=TP[i-1]/(TP[i-1]+FN[i-1])
  178. Precision[i-1]=TP[i-1]/(TP[i-1]+FP)
  179. GlobalSensitivity=TP.sum()/(TP.sum()+FN.sum())
  180. Specificity=TN/(TN+FP)
  181. Accuracy=(TN+TP.sum())/(TN+TP.sum()+FP+FN.sum())
  182. GlobalPrecision=TP.sum()/(TP.sum()+FP)
  183. F1Score= 2*GlobalPrecision*GlobalSensitivity/(GlobalPrecision+GlobalSensitivity)
  184. F2Score = 2*Specificity*GlobalSensitivity/(Specificity+GlobalSensitivity)
  185. print("Global Precision: ",GlobalPrecision)
  186. print("Precision: ",Precision)
  187. print("Global Sensitivity: ",GlobalSensitivity)
  188. print("Sensitivity: ",Sensitivity)
  189. #print("Specifity: ",Specificity)
  190. #print("Accuracy: ",Accuracy)
  191. print("F1Score: ",F1Score)
  192. #print("F2Score: ",F2Score)
  193. #print("FP: ",FP)
  194. #return Sensitivity+Specifity
  195. return F1Score
  196. FScoreHash={}
  197. threshold={}
  198. def getFScore(timestep,datalist):
  199. FScoreHash[timestep]=[]
  200. tf=0.3
  201. while tf<8:
  202. th=threshold[timestep]*tf
  203. r=anomalyMetric(th,timestep,datalist)
  204. FScoreHash[timestep].append([tf,r])
  205. if tf<2:
  206. tf+=0.1
  207. else:
  208. tf+=0.5
  209. def plotFScore(FS):
  210. plt.rcParams.update({'font.size': 16})
  211. fig, axes = plt.subplots(nrows=1, ncols=1, figsize=(14, 10), dpi=80, facecolor="w", edgecolor="k")
  212. for k in FS.keys():
  213. ar=np.array((FS[k]))
  214. axes.plot(ar[:,0],ar[:,1],label="$ns=$"+str(k),linewidth=3)
  215. axes.set_xlabel("Threshold factor ($tf$)")
  216. axes.set_ylabel("F1-Score")
  217. axes.legend()
  218. axes.grid()
  219. s='['
  220. for i in range(len(features)):
  221. s+=featureNames[features[i]]
  222. if i < len(features)-1:
  223. s+=', '
  224. s+=']'
  225. plt.title(s)
  226. plt.show()
  227. def listToString(l):
  228. r=''
  229. for i in l:
  230. r+=str(i)
  231. return(r.replace(' ',''))
  232. if options.train: # Train not needed to be changed
  233. for timesteps in range(4,21,4):
  234. x_train=[]
  235. for i in range(NumberOfFailures+1):
  236. x_train.append(create_sequences(dataTrainNorm[i],timesteps))
  237. model = keras.Sequential(
  238. [
  239. layers.Input(shape=(x_train[0].shape[1], x_train[0].shape[2])),
  240. layers.Conv1D(
  241. filters=NumFilters,
  242. kernel_size=KernelSize,
  243. padding="same",
  244. strides=2,
  245. activation="relu",
  246. ),
  247. layers.Dropout(rate=DropOut),
  248. layers.Conv1D(
  249. filters=int(NumFilters/2),
  250. kernel_size=KernelSize,
  251. padding="same",
  252. strides=2,
  253. activation="relu",
  254. ),
  255. layers.Conv1DTranspose(
  256. filters=int(NumFilters/2),
  257. kernel_size=KernelSize,
  258. padding="same",
  259. strides=2,
  260. activation="relu",
  261. ),
  262. layers.Dropout(rate=DropOut),
  263. layers.Conv1DTranspose(
  264. filters=NumFilters,
  265. kernel_size=KernelSize,
  266. padding="same",
  267. strides=2,
  268. activation="relu",
  269. ),
  270. layers.Conv1DTranspose(filters=x_train[i].shape[2], kernel_size=KernelSize, padding="same"),
  271. ]
  272. )
  273. model.compile(optimizer=keras.optimizers.Adam(learning_rate=0.001), loss="mse")
  274. model.summary()
  275. path_checkpoint="model_noclass_v4_"+str(timesteps)+listToString(features)+"_checkpoint.weights.h5"
  276. es_callback=keras.callbacks.EarlyStopping(monitor="val_loss", min_delta=0, patience=15)
  277. modelckpt_callback=keras.callbacks.ModelCheckpoint( monitor="val_loss", filepath=path_checkpoint, verbose=1, save_weights_only=True, save_best_only=True,)
  278. history=model.fit( x_train[0], x_train[0], epochs=400, batch_size=128, validation_split=0.3, callbacks=[ es_callback, modelckpt_callback ],)
  279. x_train_pred=model.predict(x_train[0])
  280. train_mae_loss=np.mean(np.abs(x_train_pred - x_train[0]), axis=1)
  281. threshold[timesteps]=np.max(train_mae_loss,axis=0)
  282. file = open('threshold_v4_'+listToString(features)+'.pk', 'wb')
  283. pickle.dump(threshold, file)
  284. file.close()
  285. exit(0)
  286. else:
  287. file = open('threshold_v4_'+listToString(features)+'.pk', 'rb')
  288. threshold=pickle.load(file)
  289. file.close()
  290. x_train=[]
  291. for i in range(NumberOfFailures+1):
  292. x_train.append(create_sequences(dataTrainNorm[i],int(options.timesteps)))
  293. model = keras.Sequential(
  294. [
  295. layers.Input(shape=(x_train[0].shape[1], x_train[0].shape[2])),
  296. layers.Conv1D(
  297. filters=NumFilters,
  298. kernel_size=KernelSize,
  299. padding="same",
  300. strides=2,
  301. activation="relu",
  302. ),
  303. layers.Dropout(rate=DropOut),
  304. layers.Conv1D(
  305. filters=int(NumFilters/2),
  306. kernel_size=KernelSize,
  307. padding="same",
  308. strides=2,
  309. activation="relu",
  310. ),
  311. layers.Conv1DTranspose(
  312. filters=int(NumFilters/2),
  313. kernel_size=KernelSize,
  314. padding="same",
  315. strides=2,
  316. activation="relu",
  317. ),
  318. layers.Dropout(rate=DropOut),
  319. layers.Conv1DTranspose(
  320. filters=NumFilters,
  321. kernel_size=KernelSize,
  322. padding="same",
  323. strides=2,
  324. activation="relu",
  325. ),
  326. layers.Conv1DTranspose(filters=x_train[i].shape[2], kernel_size=KernelSize, padding="same"),
  327. ]
  328. )
  329. model.compile(optimizer=keras.optimizers.Adam(learning_rate=0.001), loss="mse")
  330. model.summary()
  331. if options.optimizetf:
  332. for timesteps in range(4,21,4):
  333. path_checkpoint="model_noclass_v4_"+str(timesteps)+listToString(features)+"_checkpoint.weights.h5"
  334. es_callback=keras.callbacks.EarlyStopping(monitor="val_loss", min_delta=0, patience=15)
  335. modelckpt_callback=keras.callbacks.ModelCheckpoint( monitor="val_loss", filepath=path_checkpoint, verbose=1, save_weights_only=True, save_best_only=True,)
  336. model.load_weights(path_checkpoint)
  337. getFScore(timesteps,[dataTestNorm[0],dataTrainNorm[1],dataTrainNorm[2],dataTrainNorm[3],dataTrainNorm[4]])
  338. file = open('FScore_v4_'+listToString(features)+'.pk', 'wb')
  339. pickle.dump(FScoreHash, file)
  340. file.close()
  341. path_checkpoint="model_noclass_v4_"+str(options.timesteps)+listToString(features)+"_checkpoint.weights.h5"
  342. es_callback=keras.callbacks.EarlyStopping(monitor="val_loss", min_delta=0, patience=15)
  343. modelckpt_callback=keras.callbacks.ModelCheckpoint( monitor="val_loss", filepath=path_checkpoint, verbose=1, save_weights_only=True, save_best_only=True,)
  344. model.load_weights(path_checkpoint)
  345. file = open('FScore_v4_'+listToString(features)+'.pk', 'rb')
  346. FS=pickle.load(file)
  347. file.close()
  348. #plotFScore(FS)
  349. #exit(0)
  350. TIME_STEPS=int(options.timesteps)
  351. # 1st scenario. Detect only anomaly. Later, we will classiffy it
  352. # Test data= testnormal + testfail1 + testtail2 + testfail3 + testfail4 + testnormal
  353. #d=np.vstack((dataTestNorm[0],dataTestNorm[1],dataTestNorm[2],dataTestNorm[3],dataTestNorm[4],dataTestNorm[0]))
  354. # For Failure data, we can use Train data becasue not used for training and includes the firsts samples
  355. #datalist=[dataTestNorm[0],dataTrainNorm[1],dataTrainNorm[2],dataTrainNorm[3],dataTrainNorm[4]]
  356. datalist=[dataTestNorm[0],dataTestNorm[1],dataTestNorm[2],dataTestNorm[3],dataTestNorm[4]]
  357. x_test=create_sequences(datalist[0],int(options.timesteps))
  358. for i in range(1,len(datalist)):
  359. x_test=np.vstack((x_test,create_sequences(datalist[i],int(options.timesteps))))
  360. x_test_pred = model.predict(x_test)
  361. test_mae_loss = np.mean(np.abs(x_test_pred - x_test), axis=1)
  362. # Define ranges for plotting in different colors
  363. testRanges=[]
  364. r=0
  365. for i in range(len(datalist)):
  366. testRanges.append([r,r+datalist[i].shape[0]-int(options.timesteps)])
  367. r+=datalist[i].shape[0]-int(options.timesteps)
  368. #r=dataTestNorm[0].shape[0]
  369. #testRanges.append([0,r])
  370. #for i in range(1,NumberOfFailures+1):
  371. # rnext=r+dataTrainNorm[i].shape[0]
  372. # testRanges.append([r,rnext] )
  373. # r=rnext
  374. anomalies = test_mae_loss > threshold[int(options.timesteps)]*float(options.TF)
  375. anomalous_data_indices = []
  376. for i in range(anomalies.shape[0]):
  377. if AtLeastOneTrue(anomalies[i]):
  378. #if anomalies[i][0] or anomalies[i][1] or anomalies[i][2] or anomalies[i][3]:
  379. anomalous_data_indices.append(i)
  380. # Let's plot some features
  381. colorline=['violet','lightcoral','cyan','lime','grey']
  382. colordot=['darkviolet','red','blue','green','black']
  383. #featuresToPlot=['r1 s1','r1 s2','r1 s3','pa1 apiii']
  384. featuresToPlot=features
  385. indexesToPlot=[]
  386. for i in featuresToPlot:
  387. indexesToPlot.append(features.index(i))
  388. def plotData3():
  389. NumFeaturesToPlot=len(indexesToPlot)
  390. plt.rcParams.update({'font.size': 16})
  391. fig, axes = plt.subplots(
  392. nrows=NumFeaturesToPlot, ncols=1, figsize=(15, 10), dpi=80, facecolor="w", edgecolor="k",sharex=True
  393. )
  394. for i in range(NumFeaturesToPlot):
  395. x=[]
  396. y=[]
  397. for k in anomalous_data_indices:
  398. if (k)<x_test.shape[0]:
  399. x.append(k)
  400. y.append(x_test[k,0,indexesToPlot[i]]*stdevs[i]+means[i])
  401. axes[i].plot(x,y ,color='black',marker='.',linewidth=0,label="Fail detection" )
  402. init=0
  403. end=testRanges[0][1]
  404. axes[i].plot(range(init,end),x_test[testRanges[0][0]:testRanges[0][1],0,indexesToPlot[i]]*stdevs[i]+means[i],label="No fail")
  405. init=end
  406. end+=(testRanges[1][1]-testRanges[1][0])
  407. for j in range(1,NumberOfFailures+1):
  408. axes[i].plot(range(init,end),x_test[testRanges[j][0]:testRanges[j][1],0,indexesToPlot[i]]*stdevs[i]+means[i],label="Fail type "+str(j), color=colorline[j-1],linewidth=1)
  409. if j<NumberOfFailures:
  410. init=end
  411. end+=(testRanges[j+1][1]-testRanges[j+1][0])
  412. if i==(NumFeatures-1):
  413. axes[i].legend(loc='right')
  414. s=''
  415. s+=featureNames[features[indexesToPlot[i]]]
  416. s+=' '+unitNames[features[indexesToPlot[i]]]
  417. axes[i].set_ylabel(s)
  418. axes[i].grid()
  419. axes[NumFeaturesToPlot-1].set_xlabel("Sample number")
  420. plt.show()
  421. anomalyMetric(threshold[int(options.timesteps)]*float(options.TF), int(options.timesteps),datalist)
  422. plotData3()
  423. exit(0)
  424. # 2nd scenario. Detect only anomaly. Later, we will classiffy it
  425. # Test data= testnormal + testfail1 + testtail2 + testfail3 + testfail4 + testnormal
  426. #d=np.vstack((dataTestNorm[0],dataTestNorm[1],dataTestNorm[2],dataTestNorm[3],dataTestNorm[4],dataTestNorm[0]))
  427. num=100
  428. d=np.vstack((dataTestNorm[0][0:num,:],dataTestNorm[1][0:num,:],dataTestNorm[0][num:2*num,:],dataTestNorm[2][70:70+num,:],dataTestNorm[0][2*num-90:3*num-90,:],dataTestNorm[3][50:num+50,:],dataTestNorm[0][150:150+num,:],dataTestNorm[4][0:num+TIME_STEPS,:]))
  429. x_test = create_sequences(d,int(options.timesteps))
  430. x_test_pred = model.predict(x_test)
  431. test_mae_loss = np.mean(np.abs(x_test_pred - x_test), axis=1)
  432. anomalies = test_mae_loss > threshold[int(options.timesteps)]*float(options.TF)
  433. anomalous_data_indices = []
  434. for i in range(anomalies.shape[0]):
  435. if AtLeastOneTrue(anomalies[i]):
  436. #if anomalies[i][0] or anomalies[i][1] or anomalies[i][2] or anomalies[i][3]:
  437. anomalous_data_indices.append(i)
  438. def plotData4():
  439. NumFeaturesToPlot=len(indexesToPlot)
  440. plt.rcParams.update({'font.size': 16})
  441. fig, axes = plt.subplots(
  442. nrows=NumFeaturesToPlot, ncols=1, figsize=(15, 10), dpi=80, facecolor="w", edgecolor="k",sharex=True
  443. )
  444. for i in range(NumFeaturesToPlot):
  445. for j in range(1,NumberOfFailures+1):
  446. if j==1:
  447. axes[i].plot(range((j-1)*2*num,(j-1)*2*num+num),x_test[(j-1)*2*num:(j-1)*2*num+num,0,indexesToPlot[i]],label="No fail", color='C0')
  448. else:
  449. axes[i].plot(range((j-1)*2*num,(j-1)*2*num+num),x_test[(j-1)*2*num:(j-1)*2*num+num,0,indexesToPlot[i]], color='C0')
  450. axes[i].plot(range(j*2*num-num,j*2*num),x_test[j*2*num-num:j*2*num,0,indexesToPlot[i]],label="File type "+str(j),color=colorline[j-1])
  451. x=[]
  452. y=[]
  453. for k in anomalous_data_indices:
  454. if (k+TIME_STEPS)<x_test.shape[0]:
  455. x.append(k+TIME_STEPS)
  456. y.append(x_test[k+TIME_STEPS,0,indexesToPlot[i]])
  457. axes[i].plot(x,y ,color='black',marker='.',linewidth=0,label="Fail detection" )
  458. if i==0:
  459. axes[i].legend(bbox_to_anchor=(0.9, 0.4))
  460. s=''
  461. s+=featureNames[features[indexesToPlot[i]]]
  462. axes[i].set_ylabel(s)
  463. axes[i].grid()
  464. axes[NumFeaturesToPlot-1].set_xlabel("Sample number")
  465. plt.show()
  466. plotData4()

Powered by TurnKey Linux.