From 64e1c209ea4ce25febfea1025ef9a10ab139cda2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Kl=C3=BCttermann?= Date: Sat, 29 Jan 2022 17:52:17 +0100 Subject: [PATCH] initial push --- README | 9 +++++++++ example1.pdf | Bin 0 -> 8587 bytes example2.pdf | Bin 0 -> 8688 bytes 3 files changed, 9 insertions(+) create mode 100644 README create mode 100644 example1.pdf create mode 100644 example2.pdf diff --git a/README b/README new file mode 100644 index 0000000..12e6462 --- /dev/null +++ b/README @@ -0,0 +1,9 @@ +Ensembles are a way to combine multiple models to create a more powerful model.In anomaly detection you can use a concept called feature bagging to create multiple predictions from the same algoritm. For this each run of the algorithm only works on some features. Generally this is used to increase the robustness of the anomaly detection method (if 2 features seem really important, anomaly detection methods might neglect the other features. If you have runs without these important features, this forces the algorithm to still consider less important features), but I would like to explore a sligthly different question: +If you are given multiple predictions, you will see events that are anomalous to some predictions, but normal to other ones. And when each model has different inputs, you might find that models considering a feature are anomalous, while models that dont consider the current event normal. In this case you could say that the input feature is the reason this event is anomalous. +Youre task would be to develop this into a method to analyze the reason for a given anomaly. Normally I would now include some example code, but since my trivial example needs thausands of models to output something useful, I only show 2 example images. +In both I train an ensemble of anomaly methods to differentiate mnist data (letters). The model should consider a "7" as normal, while finding every other letter as anomaly. The images shown are my favorite from ~20 I have looked at. +The first image (example1.pdf pdf because vector graphics) shows a slightly weird 7 (a 7 with another line at the top) on the left and the "anomaly reason" on the right side. You see the part of the 7 which we would initially consider normal in black (low anomaly reason), but not the additional line as this is not a usual part of the "7". +The second image (example2.pdf) shows a "2" and thus an anomaly. See this "2" here again as a "7" with another line. Again you see the basic structure of the "7" represented in the image, but this time the second line is really anomalous(We can not expect there to be a 7 with a line below, but we could imagine in the test set being another 7 with a line above), and so it is found by the algorithm and as you see in the heatmap, this is represented: This image is not a "7" since it contains another line. +The biggest drawback of this algorithm is that it requires many different anomaly predictions (I used here ~2000, this is also only possible because I use an anomaly algorihm I thought of, which is really fast). This is partially the case since the mnist images used have many (784) features, and we can assume that this effect will be less strong with fewer features. You can probably still improve the speed (number of models) quite a lot. A better querry strategy for the feature bagging, a better combination function for the resulting anomaly scores or even some more active idea (train this model to test the current hypothesis) should help quite a lot. +On the other hand, this algorithm could also be used for fewer features (where it will be much faster), but then you could also consider relations between the features (given two inputs, which are always between 0 and 1, but always the same: They are anomalous not for any value, but always when they are not the same) +If you have any questions, feel free to write an email to Simon.Kluettermann@cs.tu-dortmund.de diff --git a/example1.pdf b/example1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..48ba0702e78cd893f149eb81c6b3709295bb41e3 GIT binary patch literal 8587 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