/ pyod / test / test_auto_encoder.py
test_auto_encoder.py
  1  # -*- coding: utf-8 -*-
  2  
  3  
  4  import os
  5  import sys
  6  import unittest
  7  
  8  # noinspection PyProtectedMember
  9  from sklearn.metrics import roc_auc_score
 10  
 11  # temporary solution for relative imports in case pyod is not installed
 12  # if pyod is installed, no need to use the following line
 13  sys.path.append(
 14      os.path.abspath(os.path.join(os.path.dirname("__file__"), '..')))
 15  sys.path.append(os.path.abspath(os.path.dirname("__file__")))
 16  
 17  from pyod.models.auto_encoder import AutoEncoder
 18  from pyod.utils.data import generate_data
 19  
 20  
 21  class TestAutoEncoder(unittest.TestCase):
 22      def assertHasAttr(self, obj, intended_attr):
 23          self.assertTrue(hasattr(obj, intended_attr))
 24  
 25      def assertInRange(self, data, lower, upper):
 26          self.assertGreaterEqual(data.min(), lower)
 27          self.assertLessEqual(data.max(), upper)
 28  
 29      def setUp(self):
 30          self.n_train = 6000
 31          self.n_test = 1000
 32          self.n_features = 300
 33          self.contamination = 0.1
 34          self.roc_floor = 0.8
 35  
 36          self.X_train, self.X_test, self.y_train, self.y_test = generate_data(
 37              n_train=self.n_train, n_test=self.n_test,
 38              n_features=self.n_features, contamination=self.contamination,
 39              random_state=42)
 40  
 41          self.clf = AutoEncoder(epoch_num=5, contamination=self.contamination)
 42          self.clf.fit(self.X_train)
 43  
 44      def test_parameters(self):
 45          self.assertHasAttr(self.clf, 'decision_scores_')
 46          self.assertIsNotNone(self.clf.decision_scores_)
 47          self.assertHasAttr(self.clf, 'labels_')
 48          self.assertIsNotNone(self.clf.labels_)
 49          self.assertHasAttr(self.clf, 'threshold_')
 50          self.assertIsNotNone(self.clf.threshold_)
 51          self.assertHasAttr(self.clf, '_mu')
 52          self.assertIsNotNone(self.clf._mu)
 53          self.assertHasAttr(self.clf, '_sigma')
 54          self.assertIsNotNone(self.clf._sigma)
 55          self.assertHasAttr(self.clf, 'model')
 56          self.assertIsNotNone(self.clf.model)
 57  
 58      def test_train_scores(self):
 59          self.assertEqual(len(self.clf.decision_scores_), self.X_train.shape[0])
 60  
 61      def test_prediction_scores(self):
 62          pred_scores = self.clf.decision_function(self.X_test)
 63          self.assertEqual(pred_scores.shape[0], self.X_test.shape[0])
 64          self.assertGreaterEqual(roc_auc_score(self.y_test, pred_scores),
 65                                  self.roc_floor)
 66  
 67      def test_prediction_labels(self):
 68          pred_labels = self.clf.predict(self.X_test)
 69          self.assertEqual(pred_labels.shape, self.y_test.shape)
 70  
 71      def test_prediction_proba(self):
 72          pred_proba = self.clf.predict_proba(self.X_test)
 73          self.assertInRange(pred_proba, 0, 1)
 74  
 75      def test_prediction_proba_linear(self):
 76          pred_proba = self.clf.predict_proba(self.X_test, method='linear')
 77          self.assertInRange(pred_proba, 0, 1)
 78  
 79      def test_prediction_proba_unify(self):
 80          pred_proba = self.clf.predict_proba(self.X_test, method='unify')
 81          self.assertInRange(pred_proba, 0, 1)
 82  
 83      def test_prediction_proba_parameter(self):
 84          self.assertRaises(ValueError, self.clf.predict_proba, self.X_test,
 85                            method='something')
 86  
 87      def test_prediction_labels_confidence(self):
 88          pred_labels, confidence = self.clf.predict(self.X_test,
 89                                                     return_confidence=True)
 90          self.assertEqual(pred_labels.shape, self.y_test.shape)
 91          self.assertEqual(confidence.shape, self.y_test.shape)
 92          self.assertInRange(confidence, 0, 1)
 93  
 94      def test_prediction_proba_linear_confidence(self):
 95          pred_proba, confidence = self.clf.predict_proba(self.X_test,
 96                                                          method='linear',
 97                                                          return_confidence=True)
 98          self.assertInRange(pred_proba, 0, 1)
 99          self.assertEqual(confidence.shape, self.y_test.shape)
100          self.assertInRange(confidence, 0, 1)
101  
102      def test_prediction_with_rejection(self):
103          pred_labels = self.clf.predict_with_rejection(self.X_test,
104                                                        return_stats=False)
105          self.assertEqual(pred_labels.shape, self.y_test.shape)
106  
107      def test_prediction_with_rejection_stats(self):
108          _, [expected_rejrate, ub_rejrate,
109              ub_cost] = self.clf.predict_with_rejection(self.X_test,
110                                                         return_stats=True)
111          self.assertGreaterEqual(expected_rejrate, 0)
112          self.assertLessEqual(expected_rejrate, 1)
113          self.assertGreaterEqual(ub_rejrate, 0)
114          self.assertLessEqual(ub_rejrate, 1)
115          self.assertGreaterEqual(ub_cost, 0)
116  
117      def test_fit_predict(self):
118          pred_labels = self.clf.fit_predict(self.X_train)
119          self.assertEqual(pred_labels.shape, self.y_train.shape)
120  
121      def test_fit_predict_score(self):
122          self.clf.fit_predict_score(self.X_test, self.y_test)
123          self.clf.fit_predict_score(self.X_test, self.y_test,
124                                     scoring='roc_auc_score')
125          self.clf.fit_predict_score(self.X_test, self.y_test,
126                                     scoring='prc_n_score')
127          self.assertRaises(NotImplementedError, self.clf.fit_predict_score,
128                            self.X_test, self.y_test, scoring='something')
129  
130      def tearDown(self):
131          pass
132  
133  
134  if __name__ == '__main__':
135      unittest.main()