Skip to content

Commit

Permalink
OA-Task: AnomalyDetector #520
Browse files Browse the repository at this point in the history
  • Loading branch information
syamrajsatheesh committed Jun 29, 2023
1 parent 7b3c133 commit 1dbef55
Show file tree
Hide file tree
Showing 3 changed files with 97 additions and 57 deletions.
Original file line number Diff line number Diff line change
@@ -1 +1 @@
<mxfile host="Electron" modified="2023-06-25T09:30:22.127Z" agent="5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.8.16 Chrome/106.0.5249.199 Electron/21.4.0 Safari/537.36" etag="f3BLNP2B88-4XzHatskl" version="20.8.16" type="device"><diagram id="C5RBs43oDa-KdzZeNtuy" name="Page-1">7V1rd5pIGP41OZvuOfFwUcCPXmKarU3bJN1s+4Uzyqg0yFDAGPvrdwYYBGYETCDRBNtaGAbm8l7meS+DJ/Jg+XjhAmfxGRnQOpEE4/FEHp5IUldT8Tcp2IQFHTUqmLumERaJ24Ib8w+MCoWodGUa0EtV9BGyfNNJF06RbcOpnyoDrovW6WozZKVbdcAcMgU3U2CxpXem4S/CUkmWle2Fj9CcL2jTSqcdXlkCWjsaircABloniuTzE3ngIuSHR8vHAbTI5NGJubvc3Fnje+Xin2/eb/C9/+n26t+z8GGjfW6Jx+BC23/yo2fTf/6dyB+vzxfq1c30obd8hL+jW4QHYK2iCYvG6m/oDM5dtHJK9iDq6QN0ffjIoy+Y0MduZxCzHkRL6LsbXC+6qx11bJM+XW9J2O5GZYsE9WJagYht5vGTtzODD6LJ2WOiRM5EKRZutj9DeErIAC3kBleU3yvCEv0TSRaCT7JI8KiI0DIxeVmZR/8Hj56kKEFrkQbPwsf0cAWx7TyyjxjDObSNoEb0LDf7dDwPE05ZOJ5MR5iby5QUzcxslp6ZopEqvIHmjo83Fs8BNre1qJ+kJXc+OcVkw38xtwiJow+7OxCNtnAUXHLh/8HSwQf2xHPC6WCLdg0rVe2SDM5x0dyFnlfqsZUWBc1jKTEN4JvIfuEOXENgbIIlBn+tPJiYs5Ds+zFoWnR3UWpP/ttPKqqQw1RJqvPA911zsvJhMJcjsupBf4GM0w9VUukKrglPriaWOSW6edvoKGyOUmxC+mEuHQsu8ToDjb21UpUEfSL5eE3kTnNCKcUt4Wd1013JVKiGNgFhRqa9gK4ZTHcRkRaAjN30smTCi7ALd5OlWklIDUFn5rZSavK6oO8nIxH3u8jH+CeYLDqfo2TfD0cA2CkVnjLkNF8lhn8IrLVjHqpSsmU7m4HaGDST8oW/xNh0KBLNYZlzGx9bcEauEGBtYuOmFxX7iMz4eoFn+cYBU/KYNTbjcBkG7bYBCaIVoukYxHOBZ0BRBFLu+S66h6krwdzgK9TYIb2YmZaVqDQLPvEAklZBrpGRtQpY9J/E91q31U1+2i8J9yUG7g+hgwE1YU+CajKEw1d6xFjFZxMLTe/TRLTABFpfkWcGiEgeuuEIYmqOM9eXpmGQJxdRP66Hmx+ZFm2OEDsyxEVpbypBI2VQ77TQzkRFklsitsPoR0uZbGeSqLFWW0dsCW1R2X44VO3kEDXqzldkBvJNuUloSYIm4EVTC/50Uz0RJaElCLIgdjQVfyuCmH6+h1buFEaPTBrQmVY6HcyQgtaRJJX8EdX2Xs34wJ1Dv7gZOo/0PjSbeTB1C2Y1sEnUcMgDvN3TIwstJUGnblfJdjwjL2EDW+mJqf90gZIZgboMlwciUTMXLQ9XpoRGpliZkqWWrLUVQcZigL/b9YhUfiv7StQmQYM8+aqK59vFzjVvbS4tYEPKYtEVOcGoUwKE3J2L/3RhWsYYbNCKkNrzwfSenvUXyDX/4McCKjX4skv5GFsZyRo35M6I211I3BVfKXeLcdEYeH5UB0MrCzieGTr0SJUlJodp95HvY2mOHpRCISlMEUIP6pPloQxtCqdTHkiZaJ12hzxw7gLDhCloE2MTOrOjl8IuKbmRtx+p0JMptJL1ZZkV3yznc8T3mnhX7bkFt13Bij/N+JzG8TrFwVVKujlgYQ60gQ/7hJ5eHbLSKZYVywzkJLEIsDxUVrtjc3pq2vNbIkLDM3FbMg5uDAQwKrmO5kUO+NkH1Ict5KxC0YqMu93pn3SGQYmL2dTGPQZmwHAQi9Iaen55VmyXZsVNmoz78Zq2m9WeBamVRhs+RxvOZhJfGxrKROkoh6oNRakldZPgpNGGJWRFbbRhESsqpVnxILWh1mjDZ2hDA0BtxtWGylSDk9mBakOsc1qymrDE1UYblpCVbqMNi1hRK82Kr60N2ysPtn8O/jOuzJ83V7d33e7jA5WkpPfHmEOq8fD0LNAc2cA635Zm9Me2zhgFhCN0+wV9fxOpNLDyUZpDGKe4IAwGoecn63hKO1hZmuQlw4S+kJzB07SowJuRVy8iWaE3yYUW8M2HdAZU5TRjM2J6NloCazOEJNSD3DCOKRLqnH7p3QLv/sMhrXFt4bDXuBL+j6J1LG8N3I+J90D83fTCIqvswiIL3IWl2Ed5PAsZV2TYqNJAv/3x9RyXBafCX5EI4UMqRX8xMhNFCUuFBtMrV5tduUgRwvfOrIAzF3gRhDZnNUuvWn2SDyW0OmT9kgb4XNyeFy5pSb1rwBlYWfyFLlfrlF7oOOywg/1q0pNs5GOgX/U+N0SvkegKi25eluiNO7N6onalckStC6SyDkxdN23T1/XTk4F00hMc3QbLIGkmSPTEkxPL+BXCxCYppDEkCm8hFZ5x4OguXg6hvgRkBj+PCchqDfTr3tXFuX6LbYTesJZWgQHiYU4QsuJx3ror/jhr+HZ0Y+VYWB58qBuYj/k9GgEryAOteAYeTG+FpfMPzG21hqm30ByjzHnc0hjNMcXHXy703nhcS4tTy8P/Vh5B4bTVAT2vvL2//3b0+zWG0iQxgDUYmnVwH5UpUv1YpDNFKceL9CytyTo6dXdln5LhYu3p+bod5EeGMjQ28SR1+pe4HNjYaO4M3x4HpKzAuggvUXoWEZ5aT9W7B9jlMsK55w8wyM44ncxacNEKTg/KM3Do3u8j9QwoNFuTWmbtkoBOFHNg+tF5BrSzG8vUdU/88XH2TRpaqu9ec/bhZT0DgZi8L7uQs42wWFMq+XrxtQ1DkQ3t7nAHvC9alyTsPmtgp6R6qY3WEivVjRfg2WRVtdd1A0hs4GPrB5ACk9z08BTraPKL7GgPNo6+caumNmJrZfV1bdRmRfZ1QpMjPIr80KQQnOFB/0dOMOWi0x/RQ4OT4WOy5nBDzx5NP3EbPvuRuLK9iZzQe/bDiYVhUClylBfHQU8qDoPu2jWRho9qNod+R/r53rszMu86UJXUdox966e3bzB3q1r6bq2dGdWO1P3KQmBsOCQTNh5Emwrj2HHm+kGZik0QuRZTMRtEVjnbXvimIrUp34SpyJcgdltJ1laMvbNCH3jBJtomxFgATWK9dDyBZakJMtZA1rKh49oAJ+sgWBgWDcDoK8fA2sU7dXRIHEK6aSSCjS8Td3vJbzrMyJYKhrrDYXzs6iu9436HAVAb26tl4wUV8L0jofve767uXHeW95gsveXZiuMBbeJEe8eJ9qe7KJb0klURKOISnnWnBMbHFrGcJuNGB4X+m0BRLei/m0H/bbkk1Orm8OjRgX+usEgc7J+OHlB7/91HEXKVzXP2SdSG8rk9bkB+9UQtGxmqC+vkZRLuiiA4ugEfzOilisI7jSpUQ36lrOVeF/1ZEw8LyMyPE2MawPO+AE82M0ahWQKF7k4hh0XfBuJh8weziGd4fTm6bXAOV8McD84ReW/YboDO86j62kCHOheaXIn6af2SqOZMXZ99uru8+OVJ9ujn3Vdvdm2fsfJ60JkST8h4eGp2xX64IZkpkccar7BhvFxOgSJk/DAVZUqoahYm5WdKFNQvyJQQYwQUK9PaUiW48pRnJQz6p9uTxkR4fyZC+YwIUX5DJgJXUIpNhMH4+83t+TU+7PduzknROzcachXOQRoN3B43bwaqnqgvaDNwO0x/OayxGeqn9UvaDBvJ6nbN9bfJ/Gzds2/W3rfRJ07U/4L83FgT/H23QCcb/BXLBn9FUdjNpEcHdLjSwrrIskDnIvyxvib6m6ttDhLgcHvM+s/eM8CphqgvCHC4HWZ3QJSJ/i4h+QGwWjI8pehv2EgyzvwuoVU1XFYWWuX9Msez2IxNHMFTQKi1wmRp8FWDryi0L5n5+6aS67gSw6blMH6kWIIajFWgdo4HYzUv26+eqK+NsThvnWp8SPWQuizQqWIDgbwew0/Th5/f1f76Xh6LtuUZB/Py8L136EupIPI2bHwIW/TzQPDhBJ4zQTEp6wKqKPAsipk99/S9ersiz0q3k1e/aI9+Zlhy9s3Y1QWeuQJF2eHoBOrY5KlzaPKUSeQQs4xXlzxJBe+8yGZySM9654WcVRM1yxOLJ49EntQDFqi8rQAHI1Ba1tjOvm2lLoFqF6RGae1OXv0CgcoOS876BmoWKPlYBarGrMEkz+dlDda+hijdFv3pIJqrlGWPmvIB1eiNGGVXkUz9olUke7dWFdPjUxchP1ndBc7iMzIgqfE/</diagram></mxfile>
<mxfile host="Electron" modified="2023-06-29T09:51:08.204Z" agent="5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.8.16 Chrome/106.0.5249.199 Electron/21.4.0 Safari/537.36" etag="ZhdQ6_yVc6DEGYvaVe5B" version="20.8.16" type="device"><diagram id="C5RBs43oDa-KdzZeNtuy" name="Page-1">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</diagram></mxfile>
121 changes: 83 additions & 38 deletions src/mlpro/oa/streams/tasks/anomalydetectors.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ class AnomalyDetector(OATask):
C_TYPE = 'Anomaly Detector'
C_EVENT_ANOMALY = 'ANOMALY'

## -------------------------------------------------------------------------------------------------
## -------------------------------------------------------------------------------------------------
def __init__(self,
p_name:str = None,
p_range_max = StreamTask.C_RANGE_THREAD,
Expand All @@ -50,7 +50,6 @@ def __init__(self,
**p_kwargs)

self.data_points = []
self.anomaly_scores = None
self.counter = 0
self.anomaly_scores = []

Expand All @@ -59,65 +58,111 @@ def __init__(self,
def _run(self, p_inst_new: list, p_inst_del: list):
pass

## ---------------------------------------------------------------------------------
def myhandler(self, p_event_id, p_event_object:Event):
self.log(Log.C_LOG_TYPE_I, 'Received event id', p_event_id)
self.log(Log.C_LOG_TYPE_I, 'Event data:', p_event_object.get_data())



## -------------------------------------------------------------------------
## -------------------------------------------------------------------------
# Custom class that inherits event management functionalities from MLPro's class EventManager
class AnomalyEvent (EventManager):
class AnomalyDetectorCB(AnomalyDetector):

C_NAME = 'Event class'
C_TYPE = 'Cluster based Anomaly Detector'

C_EVENT_OWN = 'ANOMALY'

def __init__(self, p_logging=Log.C_LOG_ALL):
super().__init__(p_logging)

## ------------------------------------------------------------------------
def __init__(self,
p_name:str = None,
p_range_max = StreamTask.C_RANGE_THREAD,
p_ada : bool = True,
p_duplicate_data : bool = False,
p_visualize : bool = False,
p_logging=Log.C_LOG_ALL,
**p_kwargs):

def raise_anomaly(self, data_points, anomaly_scores, counter):
eventobj = Event(p_raising_object=self, p_par1='Anomaly detected')
self._raise_event(self.C_EVENT_OWN, eventobj)
self.anomaly_characteristics(data_points, anomaly_scores, counter)
super().__init__(p_name = p_name,
p_range_max = p_range_max,
p_ada = p_ada,
p_duplicate_data = p_duplicate_data,
p_visualize = p_visualize,
p_logging = p_logging,
**p_kwargs)

self.data_points = []
self.counter = 0
self.anomaly_scores = []


def anomaly_characteristics(self, data_points, anomaly_scores, counter):

count = 0
for x in anomaly_scores:
if x < 0:
count += 1

frequency = len(data_points)/count
## -------------------------------------------------------------------------
def _run(self, p_inst_new: list, p_inst_del: list):
pass


## --------------------------------------------------------------------------
def hdl_cluster_updates(p_event_id: str, p_event_object: Event):
pass

## ---------------------------------------------------------
## ---------------------------------------------------------
# Custom event handler class
class AnomalyEventHandler (Log):

C_TYPE = 'Event handler'
C_NAME = 'Anomaly-Event handler'
## -------------------------------------------------------------------------
## -------------------------------------------------------------------------
class AnomalyEvent (Event):

def myhandler(self, p_event_id, p_event_object:Event):
self.log(Log.C_LOG_TYPE_I, 'Received event id', p_event_id)
self.log(Log.C_LOG_TYPE_I, 'Event data:', p_event_object.get_data())
C_TYPE = 'Event'

C_NAME = 'Anomaly'

def __init__(self, p_raising_object, **p_kwargs):
pass


## -------------------------------------------------------------------------
## -------------------------------------------------------------------------
class PointAnomaly (AnomalyEvent):

C_NAME = 'Point Anomaly'

def __init__(self, p_raising_object, p_deviation, **p_kwargs):
pass


## -------------------------------------------------------------------------
## -------------------------------------------------------------------------
class GroupAnomaly (AnomalyEvent):

C_NAME = 'Group Anomaly'

def __init__(self, p_raising_object, p_mean, p_mean_deviation, **p_kwargs):
pass


## -------------------------------------------------------------------------
## -------------------------------------------------------------------------
class ContextualAnomaly (AnomalyEvent):

C_NAME = 'Contextual Anomaly'

def __init__(self, p_raising_object, **p_kwargs):
pass


## -------------------------------------------------------------------------
## -------------------------------------------------------------------------
class DriftEvent (AnomalyEvent):

C_NAME = 'Drift Anomaly'
C_NAME = 'Drift'

C_EVENT_OWN = 'DRIFT'
def __init__(self, p_raising_object, p_deviation, **p_kwargs):
pass

def __init__(self, p_logging=Log.C_LOG_ALL):
super().__init__(p_logging)


def do_something(self, data_points, anomaly_scores, counter):
eventobj = Event(p_raising_object=self, p_par1='Drift detected')
self._raise_event(self.C_EVENT_OWN, eventobj)
## -------------------------------------------------------------------------
## -------------------------------------------------------------------------
class DriftEventCB (DriftEvent):

C_NAME = 'Cluster based Drift'

def __init__(self, p_raising_object, p_deviation, **p_kwargs):
pass

31 changes: 13 additions & 18 deletions src/mlpro/wrappers/sklearn/anomalydetectors.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,7 @@

from mlpro.wrappers.sklearn.basics import *
from mlpro.oa.streams.basics import Instance, List
from mlpro.oa.streams.tasks.anomalydetectors import AnomalyDetector
from mlpro.oa.streams.tasks.anomalydetectors import AnomalyEventHandler
from mlpro.oa.streams.tasks.anomalydetectors import AnomalyEvent
from mlpro.oa.streams.tasks.anomalydetectors import *
from sklearn.neighbors import LocalOutlierFactor
from sklearn.svm import OneClassSVM
from sklearn.ensemble import IsolationForest
Expand Down Expand Up @@ -82,11 +80,10 @@ def _run(self, p_inst_new: list, p_inst_del: list):

# Determine if data point is an anomaly based on its outlier score
if self.anomaly_scores[-1] == -1:
self.counter += 1
handler_obj = AnomalyEventHandler()
event_obj = AnomalyEvent()
event_obj.register_event_handler(AnomalyEvent.C_EVENT_OWN, handler_obj.myhandler)
event_obj.raise_anomaly(self.data_points, self.anomaly_scores, self.counter)
event_obj = AnomalyEvent(p_raising_object=self, p_kwargs=self.data_points[-1]) )
handler = self.myhandler
self.register_event_handler(event_obj.C_NAME, handler)
self._raise_event(event_obj.C_NAME, event_obj)



Expand Down Expand Up @@ -142,10 +139,10 @@ def _run(self, p_inst_new: list, p_inst_del: list):
# Determine if the data point is an anomaly based on its outlier score
if self.anomaly_scores[-1] < 0:
self.counter += 1
handler_obj = AnomalyEventHandler()
event_obj = AnomalyEvent()
event_obj.register_event_handler(AnomalyEvent.C_EVENT_OWN, handler_obj.myhandler)
event_obj.raise_anomaly()
event_obj = AnomalyEvent(p_raising_object=self, p_kwargs=self.data_points[-1])
handler = self.myhandler
self.register_event_handler(event_obj.C_NAME, handler)
self._raise_event(event_obj.C_NAME, event_obj)



Expand Down Expand Up @@ -202,11 +199,9 @@ def _run(self, p_inst_new: list, p_inst_del: list):
# Determine if the latest data point is an anomaly based on its outlier score
if self.anomaly_scores[-1] < 0:
self.counter += 1
handler_obj = AnomalyEventHandler()
event_obj = AnomalyEvent()
event_obj.register_event_handler(AnomalyEvent.C_EVENT_OWN, handler_obj.myhandler)
event_obj.raise_anomaly()


event_obj = AnomalyEvent(p_raising_object=self, p_kwargs=self.data_points[-1])
handler = self.myhandler
self.register_event_handler(event_obj.C_NAME, handler)
self._raise_event(event_obj.C_NAME, event_obj)


0 comments on commit 1dbef55

Please sign in to comment.