From 6aa59d071206b8ae6153fc627cf4b2a7a0cd8809 Mon Sep 17 00:00:00 2001 From: yelircaasi Date: Mon, 3 Aug 2020 11:05:55 +0200 Subject: [PATCH] improved test file for FFNN --- classifier/nn_ff.py | 9 ++++----- plots/confusion_matrix_plot.png | Bin 0 -> 33815 bytes plots/confusion_matrix_plot_ff.png | Bin 0 -> 32987 bytes testing/ff_model_testing.py | 28 +++++++++++++++++++++++++--- utils/nn_reader.py | 9 ++++++++- 5 files changed, 37 insertions(+), 9 deletions(-) create mode 100644 plots/confusion_matrix_plot.png create mode 100644 plots/confusion_matrix_plot_ff.png diff --git a/classifier/nn_ff.py b/classifier/nn_ff.py index 24accaf..97bbb81 100644 --- a/classifier/nn_ff.py +++ b/classifier/nn_ff.py @@ -36,7 +36,7 @@ class FeedForward(torch.nn.Module): def read_data(self): """" Reads in training and test data and converts it to proper format. """ - self.X_train_, self.y_train_, self.X_test = read_csv_nn() + self.X_train_, self.y_train_, self.X_test, self.y_test_ = read_csv_nn() self.X_test = torch.FloatTensor(self.X_test) yclass = np.array([(x[1] == 1) + 2 * (x[2] == 1) for x in self.y_train_]) is0 = yclass == 0 @@ -51,14 +51,13 @@ class FeedForward(torch.nn.Module): self.l0 = sum(is0) self.l1 = sum(is1) self.l2 = sum(is2) + self.y_test = (self.y_test_[:, 1] == 1) + 2 * (self.y_test_[:, 2] == 1) - def fit(self, epochs=100, batch_size=16, lr=0.01, samples0=1000, samples1=1000, samples2=1000): + def fit(self, epochs=100, batch_size=16, lr=0.01, samples=(1000, 1000, 1000)): """ Trains model, using cross entropy loss and SGD optimizer. """ self.criterion = torch.nn.CrossEntropyLoss() self.optimizer = torch.optim.SGD(self.parameters(), lr) - self.samples0 = samples0 - self.samples1 = samples1 - self.samples2 = samples2 + self.samples0, self.samples1, self.samples2 = samples self.eval() # put into eval mode diff --git a/plots/confusion_matrix_plot.png b/plots/confusion_matrix_plot.png new file mode 100644 index 0000000000000000000000000000000000000000..36c0225a671c02d3437265a973921c4a3fe8f339 GIT binary patch literal 33815 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 literal 0 HcmV?d00001 diff --git a/plots/confusion_matrix_plot_ff.png b/plots/confusion_matrix_plot_ff.png new file mode 100644 index 0000000000000000000000000000000000000000..e6f00f8379889f34eaaaaa0da5a0eed0a8ddcd6a GIT binary patch literal 32987 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 literal 0 HcmV?d00001 diff --git a/testing/ff_model_testing.py b/testing/ff_model_testing.py index a290a61..e7af60c 100644 --- a/testing/ff_model_testing.py +++ b/testing/ff_model_testing.py @@ -2,11 +2,33 @@ import sys import os sys.path.append(os.getcwd()) from classifier.nn_ff import FeedForward +from sklearn.metrics import f1_score +from eval.metrics import plot_confusion_matrix, get_confusion_matrix +project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) -model = FeedForward(28, 9, 3) -model.fit() -model.predict() +clf = FeedForward(28, 9, 3) +clf.fit() +clf.predict() +# predict +y_test = clf.preds +y_true = clf.y_test + +# Model Evaluation +labels = set(['background', 'method', 'result']) +f1_score_micro = f1_score(y_true, y_test, average='micro') +f1_score_macro = f1_score(y_true, y_test, average='macro') + +# Print F1 Score +print('F1 score (micro): ', f1_score_micro) +print('F1 score (macro): ', f1_score_macro) + +# plot confusion matrix +classdict = {0: 'background', 1: 'method', 2: 'result'} +y_test = [classdict[x] for x in y_test] +y_true = [classdict[x] for x in y_true] +plot_path = project_root + '/plots/confusion_matrix_plot_ff.png' +plot_confusion_matrix(get_confusion_matrix(y_true, y_test), 'Feed-forward NN Classifier (Baseline)', plot_path) diff --git a/utils/nn_reader.py b/utils/nn_reader.py index 77ed33e..8f9ea3f 100644 --- a/utils/nn_reader.py +++ b/utils/nn_reader.py @@ -9,6 +9,7 @@ def read_csv_nn(scicite_dir=None): train_file_path = 'data/tsv/train.tsv' test_file_path = 'data/tsv/test.tsv' train_raw = read_csv_file(train_file_path, '\t') + test_raw = read_csv_file(test_file_path, '\t') features = [x.features for x in train_raw] features_unique = list(set(chain.from_iterable(features))) @@ -44,7 +45,13 @@ def read_csv_nn(scicite_dir=None): if f in features[i]: X_test[i,j] = 1 - return X_train, y_train, X_test + y_test_raw = np.array([x.true_label for x in test_raw]) + y_test = np.zeros((nobs, y_dim)) + + for j in range(y_dim): + y_test[:, j] = y_test_raw == y_unique[j] + + return X_train, y_train, X_test, y_test