def testCLAClassificationRecord(self): record = { "ROWID": 0, "anomalyScore": 1.0, "anomalyVector": "Vector", "anomalyLabel": "Label" } state = _CLAClassificationRecord(**record) self.assertEqual(state.ROWID, record['ROWID']) self.assertEqual(state.anomalyScore, record['anomalyScore']) self.assertEqual(state.anomalyVector, record['anomalyVector']) self.assertEqual(state.anomalyLabel, record['anomalyLabel']) self.assertEqual(state.setByUser, False) record = { "ROWID": 0, "anomalyScore": 1.0, "anomalyVector": "Vector", "anomalyLabel": "Label", "setByUser": True } state = _CLAClassificationRecord(**record) self.assertEqual(state.ROWID, record['ROWID']) self.assertEqual(state.anomalyScore, record['anomalyScore']) self.assertEqual(state.anomalyVector, record['anomalyVector']) self.assertEqual(state.anomalyLabel, record['anomalyLabel']) self.assertEqual(state.setByUser, record['setByUser'])
def testAddRecordToKNN(self, getAnomalyVector): getAnomalyVector.return_value = "Vector" values = {'categoryRecencyList': [1, 2, 3]} classifier = self.helper.htm_prediction_model._getAnomalyClassifier( ).getSelf() classifier.getParameter.side_effect = values.get state = { "ROWID": 5, "anomalyScore": 1.0, "anomalyVector": "", "anomalyLabel": ["Label"], "setByUser": False } record = _CLAClassificationRecord(**state) # Test with record not already in KNN self.helper._addRecordToKNN(record) classifier._knn.learn.assert_called_once_with("Vector", ANY, rowID=state['ROWID']) self.assertTrue(not classifier._knn.prototypeSetCategory.called) classifier._knn.learn.reset_mock() # Test with record already in KNN values = {'categoryRecencyList': [1, 2, 3, 5]} classifier.getParameter.side_effect = values.get self.helper._addRecordToKNN(record) classifier._knn.prototypeSetCategory.assert_called_once_with(\ state['ROWID'], ANY) self.assertTrue(not classifier._knn.learn.called)
def testAddRecordToKNN(self, getAnomalyVector): getAnomalyVector.return_value = "Vector" values = { 'categoryRecencyList': [1, 2, 3] } classifier = self.helper.htm_prediction_model._getAnomalyClassifier().getSelf() classifier.getParameter.side_effect = values.get state = { "ROWID": 5, "anomalyScore": 1.0, "anomalyVector": "", "anomalyLabel": ["Label"], "setByUser": False } record = _CLAClassificationRecord(**state) # Test with record not already in KNN self.helper._addRecordToKNN(record) classifier._knn.learn.assert_called_once_with("Vector", ANY, rowID=state['ROWID']) self.assertTrue(not classifier._knn.prototypeSetCategory.called) classifier._knn.learn.reset_mock() # Test with record already in KNN values = { 'categoryRecencyList': [1, 2, 3, 5] } classifier.getParameter.side_effect = values.get self.helper._addRecordToKNN(record) classifier._knn.prototypeSetCategory.assert_called_once_with(\ state['ROWID'], ANY) self.assertTrue(not classifier._knn.learn.called)
def testRun(self, compute): state = { "ROWID": 0, "anomalyScore": 1.0, "anomalyVector": [1, 4, 5], "anomalyLabel": "Label" } compute.return_value = _CLAClassificationRecord(**state) result = self.helper.run() compute.assert_called_once_with() self.assertEqual(result, state['anomalyLabel'])
def testRun(self,compute): state = { "ROWID": 0, "anomalyScore": 1.0, "anomalyVector": [1,4,5], "anomalyLabel": "Label" } compute.return_value = _CLAClassificationRecord(**state) result = self.helper.run() compute.assert_called_once_with() self.assertEqual(result, state['anomalyLabel'])
def testCLAClassificationRecordGetState(self): record = { "ROWID": 0, "anomalyScore": 1.0, "anomalyVector": "Vector", "anomalyLabel": "Label", "setByUser": False } state = _CLAClassificationRecord(**record) self.assertEqual(state.__getstate__(), record)
def testGetAnomalyVector(self): state = { "ROWID": 0, "anomalyScore": 1.0, "anomalyVector": [1, 4, 5], "anomalyLabel": "Label" } record = _CLAClassificationRecord(**state) self.helper._anomalyVectorLength = 10 vector = self.helper._getStateAnomalyVector(record) self.assertEqual(len(vector), self.helper._anomalyVectorLength) self.assertEqual(vector.nonzero()[0].tolist(), record.anomalyVector)
def testGetAnomalyVector(self): state = { "ROWID": 0, "anomalyScore": 1.0, "anomalyVector": [1,4,5], "anomalyLabel": "Label" } record = _CLAClassificationRecord(**state) self.helper._anomalyVectorLength = 10 vector = self.helper._getStateAnomalyVector(record) self.assertEqual(len(vector), self.helper._anomalyVectorLength) self.assertEqual(vector.nonzero()[0].tolist(), record.anomalyVector)
def testCompute(self, createRecord, updateState): state = { "ROWID": 0, "anomalyScore": 1.0, "anomalyVector": "Vector", "anomalyLabel": "Label" } record = _CLAClassificationRecord(**state) createRecord.return_value = record # Test add first record self.helper._history_length = 10 self.helper._autoDetectWaitRecords = 0 self.helper.saved_states = [] result = self.helper.compute() self.assertEqual(result, record) self.assertEqual(len(self.helper.saved_states), 1) updateState.assert_called_once_with(result) # Test add record before wait records updateState.reset_mock() self.helper._history_length = 10 self.helper._autoDetectWaitRecords = 10 self.helper.saved_states = [] result = self.helper.compute() self.assertEqual(result, record) self.assertEqual(len(self.helper.saved_states), 1) result = self.helper.compute() self.assertEqual(result, record) self.assertEqual(len(self.helper.saved_states), 2) self.assertTrue(not updateState.called) # Test exceeded cache length updateState.reset_mock() self.helper._history_length = 1 self.helper.saved_states = [] result = self.helper.compute() self.assertEqual(result, record) self.assertEqual(len(self.helper.saved_states), 1) result = self.helper.compute() self.assertEqual(result, record) self.assertEqual(len(self.helper.saved_states), 1) self.assertTrue(not updateState.called)
def testRecomputeRecordFromKNN(self, getAnomalyVector): getAnomalyVector.return_value = "Vector" values = { 'categoryRecencyList': [1, 2, 3, 5, 6, 7, 8, 9], 'latestDists': numpy.array([0.7, 0.2, 0.5, 1, 0.3, 0.2, 0.1]), 'categories': ['A', 'B', 'C', 'D', 'E', 'F', 'G'] } classifier = self.helper.htm_prediction_model._getAnomalyClassifier( ).getSelf() classifier.getLatestDistances.return_value = values['latestDists'] classifier.getCategoryList.return_value = values['categories'] classifier.getParameter.side_effect = values.get state = { "ROWID": 5, "anomalyScore": 1.0, "anomalyVector": "", "anomalyLabel": ["Label"], "setByUser": False } record = _CLAClassificationRecord(**state) # Test finding best category before record - exists self.helper._classificationMaxDist = 0.4 self.helper._autoDetectWaitRecords = 0 result = self.helper._recomputeRecordFromKNN(record) self.assertEqual(result, 'B') # Test finding best category before record - does not exists self.helper._classificationMaxDist = 0.1 result = self.helper._recomputeRecordFromKNN(record) self.assertEqual(result, None) # Test finding best category before record - not record before record.ROWID = 0 self.helper._classificationMaxDist = 0.1 result = self.helper._recomputeRecordFromKNN(record) self.assertEqual(result, None)
def testRecomputeRecordFromKNN(self, getAnomalyVector): getAnomalyVector.return_value = "Vector" values = { 'categoryRecencyList': [1, 2, 3, 5, 6, 7, 8, 9], 'latestDists': numpy.array([0.7, 0.2, 0.5, 1, 0.3, 0.2, 0.1]), 'categories': ['A','B','C','D','E','F','G'] } classifier = self.helper.htm_prediction_model._getAnomalyClassifier().getSelf() classifier.getLatestDistances.return_value = values['latestDists'] classifier.getCategoryList.return_value = values['categories'] classifier.getParameter.side_effect = values.get state = { "ROWID": 5, "anomalyScore": 1.0, "anomalyVector": "", "anomalyLabel": ["Label"], "setByUser": False } record = _CLAClassificationRecord(**state) # Test finding best category before record - exists self.helper._classificationMaxDist = 0.4 self.helper._autoDetectWaitRecords = 0 result = self.helper._recomputeRecordFromKNN(record) self.assertEqual(result, 'B') # Test finding best category before record - does not exists self.helper._classificationMaxDist = 0.1 result = self.helper._recomputeRecordFromKNN(record) self.assertEqual(result, None) # Test finding best category before record - not record before record.ROWID = 0 self.helper._classificationMaxDist = 0.1 result = self.helper._recomputeRecordFromKNN(record) self.assertEqual(result, None)
def testUpdateState(self, toLabelList, recompute, deleteRecord, addRecord): record = { "ROWID": 0, "anomalyScore": 1.0, "anomalyVector": "", "anomalyLabel": ["Label"], "setByUser": False } # Test record not labeled and not above threshold deleteRecord.reset_mock() addRecord.reset_mock() self.helper._autoDetectWaitRecords = 0 self.helper._autoDetectThreshold = 1.1 toLabelList.return_value = [] state = _CLAClassificationRecord(**record) self.helper._updateState(state) self.assertEqual(state.anomalyLabel, []) deleteRecord.assert_called_once_with([state]) # Test record not labeled and above threshold deleteRecord.reset_mock() addRecord.reset_mock() self.helper._autoDetectThreshold = 0.5 toLabelList.return_value = [] state = _CLAClassificationRecord(**record) self.helper._updateState(state) self.assertEqual(state.anomalyLabel, \ [HTMPredictionModelClassifierHelper.AUTO_THRESHOLD_CLASSIFIED_LABEL]) addRecord.assert_called_once_with(state) # Test record not labeled and above threshold during wait period deleteRecord.reset_mock() addRecord.reset_mock() self.helper._autoDetectWaitRecords = 10 self.helper._autoDetectThreshold = 0.5 toLabelList.return_value = [] state = _CLAClassificationRecord(**record) self.helper._updateState(state) self.assertEqual(state.anomalyLabel, []) self.assertTrue(not addRecord.called) # Test record labeled and not above threshold deleteRecord.reset_mock() addRecord.reset_mock() self.helper._autoDetectWaitRecords = 0 self.helper._autoDetectThreshold = 1.1 toLabelList.return_value = ["Label"] state = _CLAClassificationRecord(**record) self.helper._updateState(state) self.assertEqual(state.anomalyLabel, ["Label"]) self.assertTrue(not addRecord.called) # Test setByUser deleteRecord.reset_mock() addRecord.reset_mock() self.helper._autoDetectThreshold = 1.1 toLabelList.return_value = ["Label 2"] recordCopy = copy.deepcopy(record) recordCopy['setByUser'] = True state = _CLAClassificationRecord(**recordCopy) self.helper._updateState(state) self.assertEqual( state.anomalyLabel, [recordCopy["anomalyLabel"][0], toLabelList.return_value[0]]) addRecord.assert_called_once_with(state) # Test removal of above threshold deleteRecord.reset_mock() addRecord.reset_mock() self.helper._autoDetectThreshold = 1.1 toLabelList.return_value = [] recordCopy = copy.deepcopy(record) recordCopy['setByUser'] = True recordCopy['anomalyLabel'] = \ [HTMPredictionModelClassifierHelper.AUTO_THRESHOLD_CLASSIFIED_LABEL, HTMPredictionModelClassifierHelper.AUTO_THRESHOLD_CLASSIFIED_LABEL + \ HTMPredictionModelClassifierHelper.AUTO_TAG] state = _CLAClassificationRecord(**recordCopy) self.helper._updateState(state) self.assertEqual(state.anomalyLabel, []) # Auto classified threshold deleteRecord.reset_mock() addRecord.reset_mock() self.helper._autoDetectThreshold = 1.1 toLabelList.return_value = \ [HTMPredictionModelClassifierHelper.AUTO_THRESHOLD_CLASSIFIED_LABEL] recordCopy = copy.deepcopy(record) recordCopy['setByUser'] = True recordCopy['anomalyLabel'] = \ [HTMPredictionModelClassifierHelper.AUTO_THRESHOLD_CLASSIFIED_LABEL] state = _CLAClassificationRecord(**recordCopy) self.helper._updateState(state) self.assertEqual(state.anomalyLabel, [HTMPredictionModelClassifierHelper.AUTO_THRESHOLD_CLASSIFIED_LABEL + \ HTMPredictionModelClassifierHelper.AUTO_TAG]) addRecord.assert_called_once_with(state) # Test precedence of threshold label above auto threshold label deleteRecord.reset_mock() addRecord.reset_mock() self.helper._autoDetectThreshold = 0.8 toLabelList.return_value = \ [HTMPredictionModelClassifierHelper.AUTO_THRESHOLD_CLASSIFIED_LABEL, HTMPredictionModelClassifierHelper.AUTO_THRESHOLD_CLASSIFIED_LABEL + \ HTMPredictionModelClassifierHelper.AUTO_TAG] recordCopy = copy.deepcopy(record) recordCopy['setByUser'] = True recordCopy['anomalyLabel'] = \ [HTMPredictionModelClassifierHelper.AUTO_THRESHOLD_CLASSIFIED_LABEL] state = _CLAClassificationRecord(**recordCopy) self.helper._updateState(state) self.assertEqual(state.anomalyLabel, [ HTMPredictionModelClassifierHelper.AUTO_THRESHOLD_CLASSIFIED_LABEL ]) addRecord.assert_called_once_with(state)
def testUpdateState(self, toLabelList, recompute, deleteRecord, addRecord): record = { "ROWID": 0, "anomalyScore": 1.0, "anomalyVector": "", "anomalyLabel": ["Label"], "setByUser": False } # Test record not labeled and not above threshold deleteRecord.reset_mock() addRecord.reset_mock() self.helper._autoDetectWaitRecords = 0 self.helper._autoDetectThreshold = 1.1 toLabelList.return_value = [] state = _CLAClassificationRecord(**record) self.helper._updateState(state) self.assertEqual(state.anomalyLabel, []) deleteRecord.assert_called_once_with([state]) # Test record not labeled and above threshold deleteRecord.reset_mock() addRecord.reset_mock() self.helper._autoDetectThreshold = 0.5 toLabelList.return_value = [] state = _CLAClassificationRecord(**record) self.helper._updateState(state) self.assertEqual(state.anomalyLabel, \ [HTMPredictionModelClassifierHelper.AUTO_THRESHOLD_CLASSIFIED_LABEL]) addRecord.assert_called_once_with(state) # Test record not labeled and above threshold during wait period deleteRecord.reset_mock() addRecord.reset_mock() self.helper._autoDetectWaitRecords = 10 self.helper._autoDetectThreshold = 0.5 toLabelList.return_value = [] state = _CLAClassificationRecord(**record) self.helper._updateState(state) self.assertEqual(state.anomalyLabel, []) self.assertTrue(not addRecord.called) # Test record labeled and not above threshold deleteRecord.reset_mock() addRecord.reset_mock() self.helper._autoDetectWaitRecords = 0 self.helper._autoDetectThreshold = 1.1 toLabelList.return_value = ["Label"] state = _CLAClassificationRecord(**record) self.helper._updateState(state) self.assertEqual(state.anomalyLabel, ["Label"]) self.assertTrue(not addRecord.called) # Test setByUser deleteRecord.reset_mock() addRecord.reset_mock() self.helper._autoDetectThreshold = 1.1 toLabelList.return_value = ["Label 2"] recordCopy = copy.deepcopy(record) recordCopy['setByUser'] = True state = _CLAClassificationRecord(**recordCopy) self.helper._updateState(state) self.assertEqual(state.anomalyLabel, [recordCopy["anomalyLabel"][0], toLabelList.return_value[0]]) addRecord.assert_called_once_with(state) # Test removal of above threshold deleteRecord.reset_mock() addRecord.reset_mock() self.helper._autoDetectThreshold = 1.1 toLabelList.return_value = [] recordCopy = copy.deepcopy(record) recordCopy['setByUser'] = True recordCopy['anomalyLabel'] = \ [HTMPredictionModelClassifierHelper.AUTO_THRESHOLD_CLASSIFIED_LABEL, HTMPredictionModelClassifierHelper.AUTO_THRESHOLD_CLASSIFIED_LABEL + \ HTMPredictionModelClassifierHelper.AUTO_TAG] state = _CLAClassificationRecord(**recordCopy) self.helper._updateState(state) self.assertEqual(state.anomalyLabel, []) # Auto classified threshold deleteRecord.reset_mock() addRecord.reset_mock() self.helper._autoDetectThreshold = 1.1 toLabelList.return_value = \ [HTMPredictionModelClassifierHelper.AUTO_THRESHOLD_CLASSIFIED_LABEL] recordCopy = copy.deepcopy(record) recordCopy['setByUser'] = True recordCopy['anomalyLabel'] = \ [HTMPredictionModelClassifierHelper.AUTO_THRESHOLD_CLASSIFIED_LABEL] state = _CLAClassificationRecord(**recordCopy) self.helper._updateState(state) self.assertEqual(state.anomalyLabel, [HTMPredictionModelClassifierHelper.AUTO_THRESHOLD_CLASSIFIED_LABEL + \ HTMPredictionModelClassifierHelper.AUTO_TAG]) addRecord.assert_called_once_with(state) # Test precedence of threshold label above auto threshold label deleteRecord.reset_mock() addRecord.reset_mock() self.helper._autoDetectThreshold = 0.8 toLabelList.return_value = \ [HTMPredictionModelClassifierHelper.AUTO_THRESHOLD_CLASSIFIED_LABEL, HTMPredictionModelClassifierHelper.AUTO_THRESHOLD_CLASSIFIED_LABEL + \ HTMPredictionModelClassifierHelper.AUTO_TAG] recordCopy = copy.deepcopy(record) recordCopy['setByUser'] = True recordCopy['anomalyLabel'] = \ [HTMPredictionModelClassifierHelper.AUTO_THRESHOLD_CLASSIFIED_LABEL] state = _CLAClassificationRecord(**recordCopy) self.helper._updateState(state) self.assertEqual(state.anomalyLabel, [HTMPredictionModelClassifierHelper.AUTO_THRESHOLD_CLASSIFIED_LABEL]) addRecord.assert_called_once_with(state)