Skip to content

Commit

Permalink
Added individual scores per attributes of an ovservation and adapted …
Browse files Browse the repository at this point in the history
…example acc.
  • Loading branch information
trechberger committed Jul 21, 2020
1 parent 2392c67 commit 740a5e5
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 3 deletions.
29 changes: 28 additions & 1 deletion coupled_biased_random_walks/detect.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,13 +91,40 @@ def score(self, observation_iterable):

def _score(self, observation):
"""
Computes the weighted anomaly score for an observation
Computes the weighted anomaly score (object_score in the paper) for an observation
:param observation: dict of the form {feature_name: feature_value, ...}
"""
return sum(self._get_feature_relevance(item) * \
self._stationary_prob.get(item, self._unknown_feature_score)
for item in iteritems(observation))

def value_scores(self, observation_iterable):
"""
Compute an anomaly sub-score for each value of the observation in observation_iterable
:param observation_iterable: iterable of dict observations with each dict
of the form {feature_name: feature_value, ...}
Return dict with sub score of each value of the observation/object of the form:
{feature_name: weighted score of value of feature, ...}
(sub-scores sum up to score(self, observation_iterable))
"""
if not (self._feature_relevance and self._stationary_prob):
raise CBRWScoreError()
if isinstance(observation_iterable, dict):
observation_iterable = [observation_iterable]
return np.array([self._value_scores(obs) for obs in observation_iterable])

def _value_scores(self, observation):
"""
Computes the weighted value scores for each feature value of an observation
"""
score_keys = []
value_scores = []
for item in iteritems(observation):
score_keys.append(item[0])
value_scores.append(self._get_feature_relevance(item) * \
self._stationary_prob.get(item, self._unknown_feature_score))
return dict(zip(score_keys, value_scores))

def _get_feature_relevance(self, feature_tuple):
"""
Getter for the relevance (weight) of a feature (category)
Expand Down
11 changes: 9 additions & 2 deletions example.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@

from six.moves import zip

from coupled_biased_random_walks import CBRW
#from coupled_biased_random_walks import CBRW
from coupled_biased_random_walks.detect import CBRW
from data.loading import load_from_csv


Expand All @@ -22,8 +23,14 @@

# fit and score data
detector.fit()
print('Feature weights: ', detector.feature_weights)
print()
scores = detector.score(data)

# print scores and observations
for score, datum in zip(scores, data):
print('Score: {} | Data: {}'.format(round(score, 4), datum))

print()
print('Scores: ', scores)
print()
print('Value scores per attribute: ', detector.value_scores(data))

0 comments on commit 740a5e5

Please sign in to comment.