Csar Fdez 2 weeks ago
parent
commit
e6d80da958
1 changed files with 17 additions and 65 deletions
  1. 17
    65
      v4_class.py

+ 17
- 65
v4_class.py View File

168
         output.append(values[i : (i + time_steps)])
168
         output.append(values[i : (i + time_steps)])
169
     return np.stack(output)
169
     return np.stack(output)
170
 
170
 
171
-def AtLeastOneTrue(x):
172
-    for i in range(NumFeatures):
173
-        if x[i]:
174
-            return True
175
-    return False
176
-
177
-
178
-def anomalyMetric(th,ts,testList):  # first of list is non failure data
179
-    # FP, TP: false/true positive
180
-    # TN, FN: true/false negative
181
-    # Sensitivity (recall): probab failure detection if data is fail: TP/(TP+FN)
182
-    # Specificity: true negative ratio given  data is OK: TN/(TN+FP)
183
-    # Accuracy: Rate of correct predictions:  (TN+TP)/(TN+TP+FP+FN)
184
-    # Precision: Rate of positive results:  TP/(TP+FP)  
185
-    # F1-score: predictive performance measure: 2*Precision*Sensitity/(Precision+Sensitity)
186
-    # F2-score: predictive performance measure:  2*Specificity*Sensitity/(Specificity+Sensitity)
187
-    x_test = create_sequences(testList[0],ts)
188
-    x_test_pred = model.predict(x_test)
189
-    test_mae_loss = np.mean(np.abs(x_test_pred - x_test), axis=1)
190
-    anomalies = test_mae_loss > th
191
-    count=0
192
-    for i in range(anomalies.shape[0]):
193
-        if AtLeastOneTrue(anomalies[i]):
194
-            count+=1
195
-    FP=count
196
-    TN=anomalies.shape[0]-count
197
-    count=0
198
-    TP=np.zeros((NumberOfFailures))
199
-    FN=np.zeros((NumberOfFailures))
200
-    Sensitivity=np.zeros((NumberOfFailures))
201
-    Precision=np.zeros((NumberOfFailures))
202
-    for i in range(1,len(testList)):
203
-        x_test = create_sequences(testList[i],ts)
204
-        x_test_pred = model.predict(x_test)
205
-        test_mae_loss = np.mean(np.abs(x_test_pred - x_test), axis=1)
206
-        anomalies = test_mae_loss > th
207
-        count=0
208
-        for j in range(anomalies.shape[0]):
209
-            if AtLeastOneTrue(anomalies[j]):
210
-                count+=1
211
-        TP[i-1] = count
212
-        FN[i-1] = anomalies.shape[0]-count
213
-        Sensitivity[i-1]=TP[i-1]/(TP[i-1]+FN[i-1])
214
-        Precision[i-1]=TP[i-1]/(TP[i-1]+FP)
215
-    GlobalSensitivity=TP.sum()/(TP.sum()+FN.sum())
216
-    Specificity=TN/(TN+FP)
217
-    Accuracy=(TN+TP.sum())/(TN+TP.sum()+FP+FN.sum())
218
-    GlobalPrecision=TP.sum()/(TP.sum()+FP)
219
-    F1Score= 2*GlobalPrecision*GlobalSensitivity/(GlobalPrecision+GlobalSensitivity)
220
-    F2Score = 2*Specificity*GlobalSensitivity/(Specificity+GlobalSensitivity)
221
-    print("Global Precision: ",GlobalPrecision)
222
-    print("Precision: ",Precision)
223
-    print("Global Sensitivity: ",GlobalSensitivity)
224
-    print("Sensitivity: ",Sensitivity)
225
-    #print("Specifity: ",Specificity)
226
-    #print("Accuracy: ",Accuracy)
227
-    print("F1Score: ",F1Score)
228
-    #print("F2Score: ",F2Score)
229
-    #print("FP: ",FP)
230
-    #return Sensitivity+Specifity
231
-    return F1Score
232
-
233
 
171
 
234
 
172
 
235
 def listToString(l):
173
 def listToString(l):
331
     testRanges.append([r,r+datalist[i].shape[0]-int(options.timesteps)])
269
     testRanges.append([r,r+datalist[i].shape[0]-int(options.timesteps)])
332
     r+=datalist[i].shape[0]-int(options.timesteps)
270
     r+=datalist[i].shape[0]-int(options.timesteps)
333
 
271
 
272
+testClasses=[0,1,2,3,4]
273
+
274
+if not len(testClasses)==len(testRanges):
275
+    print("ERROR:  testClasses and testRanges must have same length")
276
+    exit(0)
334
 
277
 
335
 x_test_predict=[]
278
 x_test_predict=[]
336
 for m in range(NumberOfFailures+1):
279
 for m in range(NumberOfFailures+1):
340
 test_mae_loss =[]
283
 test_mae_loss =[]
341
 for m in range(NumberOfFailures+1):
284
 for m in range(NumberOfFailures+1):
342
     test_mae_loss.append(np.mean(np.abs(x_test_predict[m,:,:,:] - x_test), axis=1))
285
     test_mae_loss.append(np.mean(np.abs(x_test_predict[m,:,:,:] - x_test), axis=1))
286
+
343
 test_mae_loss=np.array((test_mae_loss))
287
 test_mae_loss=np.array((test_mae_loss))
344
 test_mae_loss_average=np.mean(test_mae_loss,axis=2)  # average over features
288
 test_mae_loss_average=np.mean(test_mae_loss,axis=2)  # average over features
345
 classes=np.argmin(test_mae_loss_average,axis=0)
289
 classes=np.argmin(test_mae_loss_average,axis=0)
351
     y.append([])
295
     y.append([])
352
 for j in range(NumberOfFailures+1):
296
 for j in range(NumberOfFailures+1):
353
     for k in range(testRanges[j][0],testRanges[j][1]):
297
     for k in range(testRanges[j][0],testRanges[j][1]):
354
-        if not  classes[k]==j:
298
+        if not  classes[k]==testClasses[j]:
355
             x[classes[k]].append(k)
299
             x[classes[k]].append(k)
356
             y[classes[k]].append(x_test[k,0,indexesToPlot[0]]*stdevs[0]+means[0])
300
             y[classes[k]].append(x_test[k,0,indexesToPlot[0]]*stdevs[0]+means[0])
357
 
301
 
358
 
302
 
359
-
360
 def plotData4():
303
 def plotData4():
361
     NumFeaturesToPlot=len(indexesToPlot)
304
     NumFeaturesToPlot=len(indexesToPlot)
362
     plt.rcParams.update({'font.size': 16})
305
     plt.rcParams.update({'font.size': 16})
391
     plt.show()
334
     plt.show()
392
 
335
 
393
 
336
 
394
-plotData4()
395
 
337
 
396
 ##   It remains to implemenent anomaly metrics for each failure type
338
 ##   It remains to implemenent anomaly metrics for each failure type
339
+def anomalyMetric(classes,testranges,testclasses):  
340
+    # FP, TP: false/true positive
341
+    # TN, FN: true/false negative
342
+    # Sensitivity (recall): probab failure detection if data is fail: TP/(TP+FN)
343
+    # Precision: Rate of positive results:  TP/(TP+FP)  
344
+    # F1-score: predictive performance measure: 2*Precision*Sensitity/(Precision+Sensitity)
397
 
345
 
346
+    print(classes)
347
+
348
+anomalyMetric(classes,testRanges,testClasses)
349
+plotData4()
398
 exit(0)
350
 exit(0)
399
 
351
 
400
 
352
 

Powered by TurnKey Linux.