From 0f5a1bcaa03f55ad96d0d301e662836711532093 Mon Sep 17 00:00:00 2001 From: abigailt Date: Thu, 2 May 2024 15:17:51 +0300 Subject: [PATCH] Tests and support for additional model output types Signed-off-by: abigailt --- apt/utils/models/model.py | 2 ++ tests/test_model.py | 19 ++++++++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/apt/utils/models/model.py b/apt/utils/models/model.py index a796089..1b1deea 100644 --- a/apt/utils/models/model.py +++ b/apt/utils/models/model.py @@ -227,6 +227,8 @@ class Model(metaclass=ABCMeta): count += np.count_nonzero(np.argmax(y[:, i], axis=1) == np.argmax(predicted[:, i], axis=1)) sum += predicted.shape[0] * predicted.shape[-1] return count / sum + elif self.output_type == ModelOutputType.CLASSIFIER_MULTI_OUTPUT_CATEGORICAL: + return np.count_nonzero(y == predicted) / (predicted.shape[0] * y.shape[1]) elif is_binary(self.output_type): if is_logits(self.output_type): if apply_non_linearity: diff --git a/tests/test_model.py b/tests/test_model.py index eba8b79..2d68180 100644 --- a/tests/test_model.py +++ b/tests/test_model.py @@ -189,7 +189,7 @@ def test_blackbox_classifier_predictions_multi_label_cat(): train = DatasetWithPredictions(y_train, x_train, y_train) test = DatasetWithPredictions(y_test, x_test, y_test) data = Data(train, test) - model = BlackboxClassifierPredictions(data, ModelOutputType.CLASSIFIER_SINGLE_OUTPUT_CATEGORICAL) + model = BlackboxClassifierPredictions(data, ModelOutputType.CLASSIFIER_MULTI_OUTPUT_CATEGORICAL) pred = model.predict(test) assert (pred.shape[0] == x_test.shape[0]) @@ -335,6 +335,23 @@ def test_blackbox_classifier_probabilities(): assert (score == 1.0) +def test_blackbox_classifier_multi_label_probabilities(): + (x_train, _), (_, _) = dataset_utils.get_iris_dataset_np() + y_train = np.array([[0.23, 0.56, 0.21] for i in range(105)]) + + # make multi-label categorical + y_train = np.column_stack((y_train, y_train, y_train)) + + train = ArrayDataset(x_train, y_train) + + data = Data(train) + model = BlackboxClassifierPredictions(data, ModelOutputType.CLASSIFIER_MULTI_OUTPUT_CLASS_PROBABILITIES) + pred = model.predict(train) + assert (pred.shape[0] == x_train.shape[0]) + assert (0.0 < pred).all() + assert (pred < 1.0).all() + + def test_blackbox_classifier_predict(): def predict(x): return np.array([[0.23, 0.56, 0.21] for i in range(x.shape[0])])