def removeLabels(self, start=None, end=None, labelFilter=None): """ Remove labels from each record with record ROWID in range from start to end, noninclusive of end. Removes all records if labelFilter is None, otherwise only removes the labels eqaul to labelFilter. This will recalculate all points from end to the last record stored in the internal cache of this classifier. """ if len(self.saved_states) == 0: raise HTMPredictionModelInvalidRangeError("Invalid supplied range for " "'removeLabels'. Model has no saved records.") startID = self.saved_states[0].ROWID clippedStart = 0 if start is None else max(0, start - startID) clippedEnd = len(self.saved_states) if end is None else \ max(0, min( len( self.saved_states) , end - startID)) if clippedEnd <= clippedStart: raise HTMPredictionModelInvalidRangeError("Invalid supplied range for " "'removeLabels'.", debugInfo={ 'requestRange': { 'startRecordID': start, 'endRecordID': end }, 'clippedRequestRange': { 'startRecordID': clippedStart, 'endRecordID': clippedEnd }, 'validRange': { 'startRecordID': startID, 'endRecordID': self.saved_states[len(self.saved_states)-1].ROWID }, 'numRecordsStored': len(self.saved_states) }) # Remove records within the cache recordsToDelete = [] for state in self.saved_states[clippedStart:clippedEnd]: if labelFilter is not None: if labelFilter in state.anomalyLabel: state.anomalyLabel.remove(labelFilter) else: state.anomalyLabel = [] state.setByUser = False recordsToDelete.append(state) self._deleteRecordsFromKNN(recordsToDelete) # Remove records not in cache self._deleteRangeFromKNN(start, end) # Recompute [clippedEnd, ...) for state in self.saved_states[clippedEnd:]: self._updateState(state) return {'status': 'success'}
def addLabel(self, start, end, labelName): """ Add the label labelName to each record with record ROWID in range from start to end, noninclusive of end. This will recalculate all points from end to the last record stored in the internal cache of this classifier. """ if len(self._recordsCache) == 0: raise HTMPredictionModelInvalidRangeError("Invalid supplied range for 'addLabel'. " "Model has no saved records.") try: start = int(start) except Exception: start = 0 try: end = int(end) except Exception: end = int(self._recordsCache[-1].ROWID) startID = self._recordsCache[0].ROWID clippedStart = max(0, start - startID) clippedEnd = max(0, min( len( self._recordsCache) , end - startID)) if clippedEnd <= clippedStart: raise HTMPredictionModelInvalidRangeError("Invalid supplied range for 'addLabel'.", debugInfo={ 'requestRange': { 'startRecordID': start, 'endRecordID': end }, 'clippedRequestRange': { 'startRecordID': clippedStart, 'endRecordID': clippedEnd }, 'validRange': { 'startRecordID': startID, 'endRecordID': self._recordsCache[len(self._recordsCache)-1].ROWID }, 'numRecordsStored': len(self._recordsCache) }) # Add label to range [clippedStart, clippedEnd) for state in self._recordsCache[clippedStart:clippedEnd]: if labelName not in state.anomalyLabel: state.anomalyLabel.append(labelName) state.setByUser = True self._addRecordToKNN(state) assert len(self.saved_categories) > 0 # Recompute [end, ...) for state in self._recordsCache[clippedEnd:]: self.classifyState(state)
def getLabels(self, start=None, end=None): """ Get the labels on classified points within range start to end. Not inclusive of end. reval - dict of format: { 'isProcessing': boolean, 'recordLabels': list of results } isProcessing - currently always false as recalculation blocks; used if reprocessing of records is still being performed; Each item in recordLabels is of format: { 'ROWID': id of the row, 'labels': list of strings } """ if len(self._recordsCache) == 0: return {'isProcessing': False, 'recordLabels': []} try: start = int(start) except Exception: start = 0 try: end = int(end) except Exception: end = self._recordsCache[-1].ROWID if end <= start: raise HTMPredictionModelInvalidRangeError( "Invalid supplied range for 'getLabels'.", debugInfo={ 'requestRange': { 'startRecordID': start, 'endRecordID': end }, 'numRecordsStored': len(self._recordsCache) }) results = {'isProcessing': False, 'recordLabels': []} ROWIDX = numpy.array( self._knnclassifier.getParameter('categoryRecencyList')) validIdx = numpy.where((ROWIDX >= start) & (ROWIDX < end))[0].tolist() categories = self._knnclassifier.getCategoryList() for idx in validIdx: row = dict(ROWID=int(ROWIDX[idx]), labels=self._categoryToLabelList(categories[idx])) results['recordLabels'].append(row) return results
def getLabels(self, start=None, end=None): if len(self.saved_states) == 0: return { 'isProcessing': False, 'recordLabels': [] } if start is None: start = 0 if end is None: end = self.saved_states[-1].ROWID if end <= start: raise HTMPredictionModelInvalidRangeError("Invalid supplied range for 'getLabels'.", debugInfo={ 'requestRange': { 'startRecordID': start, 'endRecordID': end }, 'numRecordsStored': len(self.saved_states) }) results = { 'isProcessing': False, 'recordLabels': [] } classifier = self.htm_prediction_model._getAnomalyClassifier() knn = classifier.getSelf()._knn ROWIDX = numpy.array( classifier.getSelf().getParameter('categoryRecencyList')) validIdx = numpy.where((ROWIDX >= start) & (ROWIDX < end))[0].tolist() categories = knn._categoryList for idx in validIdx: row = dict( ROWID=int(ROWIDX[idx]), labels=self._categoryToLabelList(categories[idx])) results['recordLabels'].append(row) return results
def removeLabels(self, start=None, end=None, labelFilter=None): """ Remove labels from each record with record ROWID in range from ``start`` to ``end``, noninclusive of end. Removes all records if ``labelFilter`` is None, otherwise only removes the labels equal to ``labelFilter``. This will recalculate all points from end to the last record stored in the internal cache of this classifier. :param start: (int) start index :param end: (int) end index (noninclusive) :param labelFilter: (string) label filter """ if len(self._recordsCache) == 0: raise HTMPredictionModelInvalidRangeError("Invalid supplied range for " "'removeLabels'. Model has no saved records.") try: start = int(start) except Exception: start = 0 try: end = int(end) except Exception: end = self._recordsCache[-1].ROWID startID = self._recordsCache[0].ROWID clippedStart = 0 if start is None else max(0, start - startID) clippedEnd = len(self._recordsCache) if end is None else \ max(0, min( len( self._recordsCache) , end - startID)) if clippedEnd <= clippedStart: raise HTMPredictionModelInvalidRangeError("Invalid supplied range for " "'removeLabels'.", debugInfo={ 'requestRange': { 'startRecordID': start, 'endRecordID': end }, 'clippedRequestRange': { 'startRecordID': clippedStart, 'endRecordID': clippedEnd }, 'validRange': { 'startRecordID': startID, 'endRecordID': self._recordsCache[len(self._recordsCache)-1].ROWID }, 'numRecordsStored': len(self._recordsCache) }) # Remove records within the cache recordsToDelete = [] for state in self._recordsCache[clippedStart:clippedEnd]: if labelFilter is not None: if labelFilter in state.anomalyLabel: state.anomalyLabel.remove(labelFilter) else: state.anomalyLabel = [] state.setByUser = False recordsToDelete.append(state) self._deleteRecordsFromKNN(recordsToDelete) # Remove records not in cache self._deleteRangeFromKNN(start, end) # Recompute [clippedEnd, ...) for state in self._recordsCache[clippedEnd:]: self._classifyState(state)