Skip to main content

A Python Outlier Detection (Anomaly Detection) Toolbox

Project description

# Python Outlier Detection (PyOD)
[![PyPI version](https://badge.fury.io/py/pyod.svg)](https://badge.fury.io/py/pyod) [![Documentation Status](https://readthedocs.org/projects/pyod/badge/?version=latest)](https://pyod.readthedocs.io/en/latest/?badge=latest) [![Build Status](https://travis-ci.org/yzhao062/Pyod.svg?branch=master)](https://travis-ci.org/yzhao062/Pyod) [![Coverage Status](https://coveralls.io/repos/github/yzhao062/Pyod/badge.svg?branch=master&service=github)](https://coveralls.io/github/yzhao062/Pyod?branch=master)

--------------------------

PyOD is a **Python-based toolkit** to **identify outlying objects** in data with both unsupervised and supervised approaches. It strives to provide an unified APIs across various anomaly detection algorithms. This exciting yet challenging field is commonly referred as ***[Outlier Detection](https://en.wikipedia.org/wiki/Anomaly_detection)*** or ***[Anomaly Detection](https://en.wikipedia.org/wiki/Anomaly_detection)*** .

**PyOD has been successfully used in academic researches [4, 8] and under active development**. However, the purpose of the toolkit is quick exploration. Using it as the final output should be cautious, and fine-tunning may be needed to generate meaningful results. The authours can be reached out at yuezhao@cs.toronto.edu; comments, questions, pull requests and issues are welcome. **Enjoy catching outliers!**

**Table of Contents**:
<!-- TOC -->

- [Key Links & Resources](#key-links-resources)
- [Quick Introduction](#quick-introduction)
- [Installation](#installation)
- [API Cheatsheet & Reference](#api-cheatsheet-reference)
- [Quick Start for Outlier Detection](#quick-start-for-outlier-detection)
- [Quick Start for Combining Outlier Scores from Various Base Detectors](#quick-start-for-combining-outlier-scores-from-various-base-detectors)
- [Reference](#reference)

<!-- /TOC -->

------------------------------
# Key Links & Resources

- **[Documentation & API Reference](https://pyod.readthedocs.io)** [![Documentation Status](https://readthedocs.org/projects/pyod/badge/?version=latest)](https://pyod.readthedocs.io/en/latest/?badge=latest)

- **[Current version on PyPI](https://pypi.org/project/pyod/)** [![PyPI version](https://badge.fury.io/py/pyod.svg)](https://badge.fury.io/py/pyod)

- **[Github repository with examples](https://github.com/yzhao062/Pyod/examples)** | **[Example Documentation](https://pyod.readthedocs.io/en/latest/example.html)**

- **Anomaly detection related resources**, e.g., books, papers and videos, can be found at **[anomaly-detection-resources.](https://github.com/yzhao062/anomaly-detection-resources)**

-----------------------------------

### Quick Introduction

PyOD toolkit consists of three major groups of functionalities: (i) **outlier detection algorithms**; (ii) **outlier ensemble frameworks** and (iii) **outlier detection utility functions**.

- Individual Detection Algorithms:
1. **Local Outlier Factor, LOF** [1]
2. **Isolation Forest, iForest** [2]
3. **One-Class Support Vector Machines** [3]
4. **kNN** Outlier Detection (use the distance to the kth nearst neighbor as the outlier score)
5. **Average KNN** Outlier Detection (use the average distance to k nearst neighbors as the outlier score)
6. **Median KNN** Outlier Detection (use the median distance to k nearst neighbors as the outlier score)
7. **Histogram-based Outlier Score, HBOS** [5]
8. **Angle-Based Outlier Detection, ABOD** [7]
9. **Fast Angle-Based Outlier Detection, FastABOD** [7]
10. More to add...

- Outlier Ensemble Framework (Outlier Score Combination Frameworks)
1. **Feature bagging**
2. **Average of Maximum (AOM)** [6]
3. **Maximum of Average (MOA)** [6]
4. **Threshold Sum (Thresh)** [6]

- Utility functions:
1. **score_to_lable()**: convert raw outlier scores to binary labels
2. **precision_n_scores()**: one of the popular evaluation metrics for outlier mining (precision @ rank n)
3. **generate_data()**: generate pseudo data for outlier detection experiment
4. **wpearson()**: weighted pearson is useful in pseudo ground truth generation
------------

### Installation

It is advised to use **pip** for installation. Please make sure **the latest version** is installed since PyOD is currently updated on **a daily basis**:
````cmd
pip install pyod
pip install --upgrade pyod # make sure the latest version is installed!
````
or
````cmd
pip install pyod==x.y.z # (x.y.z) is the current version number
````
Alternatively, [downloading/cloning the Github repository](https://github.com/yzhao062/Pyod) also works. You could unzip the files and execute the following command in the folder where the files get decompressed.

````cmd
python setup.py install
````
Library Dependency (work only with **Python 3.5+**, e.g. 3.5 & 3.6):
- scipy>=0.19.1
- pandas>=0.21
- numpy>=1.13
- scikit_learn>=0.19.1
- matplotlib>=2.0.2 **(optional but required for running examples)**

------------
### API Cheatsheet & Reference

Full API Reference: (http://pyod.readthedocs.io/en/latest/api.html)

API cheatsheet:

- **fit(X)**: Fit detector.
- **fit_predict(X)**: Fit detector and predict if a particular sample is an outlier or not.
- **fit_predict_evaluate(X, y)**: Fit, predict and then evaluate with ROC and Precision @ rank n.
- **decision_function(X)**: Return raw outlier scores of a sample.
- **predict(X)**: Predict if a particular sample is an outlier or not. The model must be fitted first.
- **predict_proba(X)**: Predict the probability of a sample being outlier. The model must be fitted first.
- **predict_rank(X)**: Predict the outlyingness rank of a sample.


Import outlier detection models, such like:
````python
from pyod.models.knn import KNN
from pyod.models.abod import ABOD
from pyod.models.hbos import HBOS
...
````

Import utility functions:
````python
from pyod.util.utility import precision_n_scores
...
````

Full package structure can be found below:
- http://pyod.readthedocs.io/en/latest/genindex.html
- http://pyod.readthedocs.io/en/latest/py-modindex.html

------------

### Quick Start for Outlier Detection
See examples for more demos. "examples/knn_example.py" demonstrates the basic APIs of PyOD using kNN detector. **It is noted the APIs for other detectors are similar**.

0. Import models
````python
from pyod.models.knn import KNN # kNN detector

from pyod.utils.load_data import generate_data
from pyod.utils.utility import precision_n_scores
from sklearn.metrics import roc_auc_score
````

1. Generate sample data first; normal data is generated by a 2-d Gaussian distribution, and outliers are generated by a 2-d uniform distribution.
````python
contamination = 0.1 # percentage of outliers
n_train = 1000 # number of training points
n_test = 500 # number of testing points

X_train, y_train, c_train, X_test, y_test, c_test = generate_data(
n_train=n_train, n_test=n_test, contamination=contamination)
````

2. Initialize a kNN detector, fit the model, and make the prediction.
```python
# train a k-NN detector (default parameters, k=5)
clf = KNN()
clf.fit(X_train)

y_train_pred = clf.y_pred
y_train_score = clf.decision_scores

# get the prediction on the test data
y_test_pred = clf.predict(X_test) # outlier label (0 or 1)
y_test_score = clf.decision_function(X_test)
```
3. Evaluate the prediction by ROC and Precision@rank *n* (p@n):
```python
print(n_train.format(
roc=roc_auc_score(y_train, y_train_score),
prn=precision_n_scores(y_train, y_train_score)))

print(n_train.format(
roc=roc_auc_score(y_test, y_test_score),
prn=precision_n_scores(y_test, y_test_score)))
```
See a sample output:
````python
Train ROC:0.9473, precision@n:0.7857
Test ROC:0.992, precision@n:0.9
````

To check the result of the classification visually ([knn_figure](https://github.com/yzhao062/Pyod/blob/master/examples/example_figs/knn.png)):
![kNN example figure](https://github.com/yzhao062/Pyod/blob/master/examples/example_figs/knn.png)

---
### Quick Start for Combining Outlier Scores from Various Base Detectors

"examples/comb_example.py" is a quick demo for showing the API for combining multiple algorithms. Given we have *n* individual outlier detectors, each of them generates an individual score for all samples. The task is to combine the outputs from these detectors effectivelly.

**Key Step: conducting Z-score normalization on raw scores before the combination.**
Four combination mechanisms are shown in this demo:
1. Mean: use the mean value of all scores as the final output.
2. Max: use the max value of all scores as the final output.
3. Average of Maximum (AOM): first randomly split n detectors in to p groups. For each group, use the maximum within the group as the group output. Use the average of all group outputs as the final output.
4. Maximum of Average (MOA): similarly to AOM, the same grouping is introduced. However, we use the average of a group as the group output, and use maximum of all group outputs as the final output.
To better understand the merging techniques, refer to [6].

The walkthrough of the code example is provided:

0. Import models and generate sample data
````python
from pyod.models.knn import Knn
from pyod.models.combination import aom, moa # combination methods
from pyod.utils.load_data import generate_data
from pyod.utils.utility import precision_n_scores
from pyod.utils.utility import standardizer
from sklearn.metrics import roc_auc_score

X, y, _ = generate_data(train_only=True) # load data
````

1. First initialize 20 kNN outlier detectors with different k (10 to 200), and get the outlier scores:
```python
# initialize 20 base detectors for combination
k_list = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140,
150, 160, 170, 180, 190, 200]

train_scores = np.zeros([X_train.shape[0], n_clf])
test_scores = np.zeros([X_test.shape[0], n_clf])

for i in range(n_clf):
k = k_list[i]

clf = KNN(n_neighbors=k, method='largest')
clf.fit(X_train_norm)

train_scores[:, i] = clf.decision_scores.ravel()
test_scores[:, i] = clf.decision_function(X_test_norm).ravel()
```
2. Then the output codes are standardized into zero mean and unit std before combination.
```python
decision_scores
train_scores_norm, test_scores_norm = standardizer(train_scores, test_scores)
```
3. Then four different combination algorithms are applied as described above:
```python
comb_by_mean = np.mean(test_scores_norm, axis=1)
comb_by_max = np.max(test_scores_norm, axis=1)
comb_by_aom = aom(test_scores_norm, 5) # 5 groups
comb_by_moa = moa(test_scores_norm, 5)) # 5 groups
```
4. Finally, all four combination methods are evaluated with 20 iterations:
````bash
Combining 20 kNN detectors
ite 1 comb by mean, ROC: 0.9014 precision@n_train: 0.4531
ite 1 comb by max, ROC: 0.9014 precision@n_train: 0.5
ite 1 comb by aom, ROC: 0.9081 precision@n_train: 0.5
ite 1 comb by moa, ROC: 0.9052 precision@n_train: 0.4843
...

Summary of 10 iterations
comb by mean, ROC: 0.9196, precision@n: 0.5464
comb by max, ROC: 0.9198, precision@n: 0.5532
comb by aom, ROC: 0.9260, precision@n: 0.5630
comb by moa, ROC: 0.9244, precision@n: 0.5523
````
---

### Reference
[1] Breunig, M.M., Kriegel, H.P., Ng, R.T. and Sander, J., 2000, May. LOF: identifying density-based local outliers. In *ACM SIGMOD Record*, pp. 93-104. ACM.

[2] Liu, F.T., Ting, K.M. and Zhou, Z.H., 2008, December. Isolation forest. In *ICDM '08*, pp. 413-422. IEEE.

[3] Ma, J. and Perkins, S., 2003, July. Time-series novelty detection using one-class support vector machines. In *IJCNN' 03*, pp. 1741-1745. IEEE.

[4] Y. Zhao and M.K. Hryniewicki, "DCSO: Dynamic Combination of Detector Scores for Outlier Ensembles," *ACM SIGKDD Workshop on Outlier Detection De-constructed*, 2018. Submitted, under review.

[5] Goldstein, M. and Dengel, A., 2012. Histogram-based outlier score (hbos): A fast unsupervised anomaly detection algorithm. In *KI-2012: Poster and Demo Track*, pp.59-63.

[6] Aggarwal, C.C. and Sathe, S., 2015. Theoretical foundations and algorithms for outlier ensembles.*ACM SIGKDD Explorations Newsletter*, 17(1), pp.24-47.

[7] Kriegel, H.P. and Zimek, A., 2008, August. Angle-based outlier detection in high-dimensional data. In *KDD '08*, pp. 444-452. ACM.

[8] Y. Zhao and M.K. Hryniewicki, "XGBOD: Improving Supervised Outlier Detection with Unsupervised Representation Learning," *IEEE International Joint Conference on Neural Networks*, 2018.

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pyod-0.3.2.tar.gz (194.3 kB view hashes)

Uploaded Source

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page