-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathclassifier.py
95 lines (76 loc) · 3.53 KB
/
classifier.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import numpy as np
from sklearn.svm import SVC, NuSVC
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay, f1_score
from sklearn.neural_network import MLPClassifier
import torch
import torch.nn as nn
import os
from data_utils import read_freq_data, get_all_sets
from torch.utils.data import random_split
import torchvision.transforms as transforms
import argparse
from networks.net import NeuralNetwork
import matplotlib.pyplot as plt
from joblib import dump
from datetime import datetime
from micromlgen import port
from sklearn.model_selection import train_test_split
today = datetime.today().strftime('%Y-%m-%d-%H:%M:%S')
parser = argparse.ArgumentParser(description='ANN Upsampler Training')
parser.add_argument('--folder_path', help="Path to dataset folder", required=True)
parser.add_argument('--method', help="type of classifier to train", default="svm")
parser.add_argument('--upsampler', help="Path to upsampler model")
parser.add_argument('--save_path', help="Save Path for classifier", default="models")
args = parser.parse_args()
torch.manual_seed(1)
input_signal, output_signal, labels = read_freq_data(args.folder_path) # The percentage argument needs to be provided via config
train_set, val_set, test_set = get_all_sets(input_signal, output_signal, labels)
ann_upsampler = torch.load(args.upsampler)
# get_input = lambda x: np.array([ann_upsampler(inp.float()).detach().numpy() for inp, op, label in x])
get_input = lambda x: np.array([inp.float().detach().numpy() for inp, op, label in x])
get_label = lambda x: np.array([label for inp, op, label in x])
train_input = get_input(train_set)
train_labels = get_label(train_set)
test_input = get_input(test_set)
test_labels = get_label(test_set)
print(f"Train Normal Signals - {np.sum(train_labels==0)}")
print(f"Train Abnormal Signals - {np.sum(train_labels==1)}")
# print(f"Val Normal Signals - {np.sum(val_labels==0)}")
# print(f"Val Abnormal Signals - {np.sum(val_labels==1)}")
print(f"Test Normal Signals - {np.sum(test_labels==0)}")
print(f"Test Abnormal Signals - {np.sum(test_labels==1)}")
if args.method == "svm":
clf = SVC(gamma=1.0/(train_input.shape[1] * train_input.var()))
# clf = SVC()
print(1.0/(train_input.shape[1] * train_input.var()))
clf.fit(train_input, train_labels)
elif args.method == "lr":
clf = LogisticRegression(C=5)
# print(1.0/(train_input.shape[1] * train_input.var()))
clf.fit(train_input, train_labels)
# exit()
# Save Model
# Save plain C version
with open(os.path.join(args.save_path, 'logisticregression_classifier_69_ftrs.h'), 'w') as f:
f.write(port(clf))
# Report test accuracy and display confusion matrix
print("Test Accuracy")
print((clf.predict(test_input) == test_labels).mean())
print(test_input[(clf.predict(test_input)==0) & (test_labels == 0)][0])
print("F1 Score")
print(f1_score(test_labels, clf.predict(test_input)))
cm = confusion_matrix(test_labels, clf.predict(test_input))
disp = ConfusionMatrixDisplay(confusion_matrix=cm,
display_labels=["Normal", 'Abnormal'])
disp.plot()
print(clf.decision_function(test_input[(clf.predict(test_input)==0) & (test_labels == 0)][0].reshape(1, -1)))
plt.show()
# print("Val Accuracy")
# print((clf.predict(val_input) == val_labels).mean())
# print(f1_score(val_labels, clf.predict(val_input)))
# cm = confusion_matrix(val_labels, clf.predict(val_input))
# disp = ConfusionMatrixDisplay(confusion_matrix=cm,
# display_labels=["Normal", 'Abnormal'])
# disp.plot()
# plt.show()