Skip to content

Instantly share code, notes, and snippets.

@tam17aki
Last active April 11, 2022 01:53
Show Gist options
  • Save tam17aki/0f1d388a9373246f5973ee8c0c99f643 to your computer and use it in GitHub Desktop.
Save tam17aki/0f1d388a9373246f5973ee8c0c99f643 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Benchmark of various outlier detection models\n",
"\n",
"### The models are evaluated by ROC, Precision @ n and execution time on 15 benchmark datasets. All datasets are split (60% for training and 40% for testing). \n",
"\n",
"**[PyOD](https://github.com/yzhao062/pyod)** is a comprehensive **Python toolkit** to **identify outlying objects** in \n",
"multivariate data with both unsupervised and supervised approaches.\n",
"The model covered in this example includes:\n",
"\n",
" 1. Linear Models for Outlier Detection:\n",
" 1. **OCSVM: One-Class Support Vector Machines**\n",
" 2. **PCA: Principal Component Analysis**\n",
" 3. **KPCA: Kernel Principal Component Analysis**\n",
" \n",
" 2. Proximity-Based Outlier Detection Models:\n",
" 1. **LOF: Local Outlier Factor**\n",
" 2. **kNN: k Nearest Neighbors** (use the distance to the kth nearest \n",
" neighbor as the outlier score)\n",
"\n",
" 3. Probabilistic Models for Outlier Detection:\n",
" 1. **ABOD: Angle-Based Outlier Detection**\n",
" \n",
" 4. Outlier Ensembles and Combination Frameworks\n",
" 1. **Isolation Forest**"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"from __future__ import division\n",
"from __future__ import print_function\n",
"\n",
"import os\n",
"import sys\n",
"import warnings\n",
"from time import time\n",
"\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"import pandas as pd\n",
"from pyod.models.abod import ABOD\n",
"from pyod.models.iforest import IForest\n",
"from pyod.models.knn import KNN\n",
"from pyod.models.lof import LOF\n",
"from pyod.models.ocsvm import OCSVM\n",
"from pyod.models.pca import PCA\n",
"from pyod.utils.utility import precision_n_scores, standardizer\n",
"from scipy.io import loadmat\n",
"from sklearn.metrics import roc_auc_score\n",
"from sklearn.model_selection import train_test_split\n",
"\n",
"from kpca import KPCA\n",
"\n",
"# temporary solution for relative imports in case pyod is not installed\n",
"# if pyod is installed, no need to use the following line\n",
"sys.path.append(os.path.abspath(os.path.join(os.path.dirname(\"__file__\"), \"..\")))\n",
"# supress warnings for clean output\n",
"warnings.filterwarnings(\"ignore\")"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"... Processing arrhythmia.mat ...\n",
"Angle-based Outlier Detector (ABOD) ROC:0.7687, precision @ rank n:0.3571, execution time: 0.8076s\n",
"K Nearest Neighbors (KNN) ROC:0.782, precision @ rank n:0.5, execution time: 0.0292s\n",
"Isolation Forest (IForest) ROC:0.8464, precision @ rank n:0.5714, execution time: 0.247s\n",
"Local Outlier Factor (LOF) ROC:0.7619, precision @ rank n:0.4286, execution time: 0.0036s\n",
"One-class SVM (OCSVM) ROC:0.7986, precision @ rank n:0.5, execution time: 0.0226s\n",
"Principal Component Analysis(PCA) ROC:0.7997, precision @ rank n:0.5, execution time: 0.0311s\n",
"Kernel PCA(KPCA) ROC:0.7883, precision @ rank n:0.4643, execution time: 0.0816s\n",
"Kernel PCA(KPCA) with samling ROC:0.7775, precision @ rank n:0.5, execution time: 0.0355s\n",
"\n",
"... Processing cardio.mat ...\n",
"Angle-based Outlier Detector (ABOD) ROC:0.5703, precision @ rank n:0.1923, execution time: 0.2436s\n",
"K Nearest Neighbors (KNN) ROC:0.7435, precision @ rank n:0.3718, execution time: 0.0893s\n",
"Isolation Forest (IForest) ROC:0.9348, precision @ rank n:0.5641, execution time: 0.2443s\n",
"Local Outlier Factor (LOF) ROC:0.5193, precision @ rank n:0.1282, execution time: 0.043s\n",
"One-class SVM (OCSVM) ROC:0.9415, precision @ rank n:0.5769, execution time: 0.0961s\n",
"Principal Component Analysis(PCA) ROC:0.9543, precision @ rank n:0.6538, execution time: 0.0026s\n",
"Kernel PCA(KPCA) ROC:0.8249, precision @ rank n:0.3846, execution time: 0.4285s\n",
"Kernel PCA(KPCA) with samling ROC:0.8095, precision @ rank n:0.4231, execution time: 0.1398s\n",
"\n",
"... Processing glass.mat ...\n",
"Angle-based Outlier Detector (ABOD) ROC:0.7287, precision @ rank n:0.0, execution time: 0.0225s\n",
"K Nearest Neighbors (KNN) ROC:0.811, precision @ rank n:0.0, execution time: 0.0058s\n",
"Isolation Forest (IForest) ROC:0.6067, precision @ rank n:0.0, execution time: 0.1852s\n",
"Local Outlier Factor (LOF) ROC:0.7287, precision @ rank n:0.0, execution time: 0.0017s\n",
"One-class SVM (OCSVM) ROC:0.4116, precision @ rank n:0.0, execution time: 0.0015s\n",
"Principal Component Analysis(PCA) ROC:0.5305, precision @ rank n:0.0, execution time: 0.001s\n",
"Kernel PCA(KPCA) ROC:0.8201, precision @ rank n:0.0, execution time: 0.0456s\n",
"Kernel PCA(KPCA) with samling ROC:0.6555, precision @ rank n:0.0, execution time: 0.0175s\n",
"\n",
"... Processing ionosphere.mat ...\n",
"Angle-based Outlier Detector (ABOD) ROC:0.8585, precision @ rank n:0.7955, execution time: 0.0561s\n",
"K Nearest Neighbors (KNN) ROC:0.9407, precision @ rank n:0.8182, execution time: 0.0122s\n",
"Isolation Forest (IForest) ROC:0.8175, precision @ rank n:0.5682, execution time: 0.2141s\n",
"Local Outlier Factor (LOF) ROC:0.8648, precision @ rank n:0.75, execution time: 0.0113s\n",
"One-class SVM (OCSVM) ROC:0.7819, precision @ rank n:0.6364, execution time: 0.0053s\n",
"Principal Component Analysis(PCA) ROC:0.7505, precision @ rank n:0.5909, execution time: 0.0021s\n",
"Kernel PCA(KPCA) ROC:0.9112, precision @ rank n:0.7955, execution time: 0.0611s\n",
"Kernel PCA(KPCA) with samling ROC:0.9456, precision @ rank n:0.8182, execution time: 0.0274s\n",
"\n",
"... Processing letter.mat ...\n",
"Angle-based Outlier Detector (ABOD) ROC:0.9104, precision @ rank n:0.3953, execution time: 0.2179s\n",
"K Nearest Neighbors (KNN) ROC:0.857, precision @ rank n:0.3488, execution time: 0.0782s\n",
"Isolation Forest (IForest) ROC:0.6048, precision @ rank n:0.1163, execution time: 0.2337s\n",
"Local Outlier Factor (LOF) ROC:0.896, precision @ rank n:0.4419, execution time: 0.0285s\n",
"One-class SVM (OCSVM) ROC:0.5712, precision @ rank n:0.1628, execution time: 0.0789s\n",
"Principal Component Analysis(PCA) ROC:0.5146, precision @ rank n:0.093, execution time: 0.0034s\n",
"Kernel PCA(KPCA) ROC:0.8478, precision @ rank n:0.2093, execution time: 0.3707s\n",
"Kernel PCA(KPCA) with samling ROC:0.8102, precision @ rank n:0.186, execution time: 0.1209s\n",
"\n",
"... Processing mnist.mat ...\n",
"Angle-based Outlier Detector (ABOD) ROC:0.7824, precision @ rank n:0.3611, execution time: 2.2379s\n",
"K Nearest Neighbors (KNN) ROC:0.8506, precision @ rank n:0.4306, execution time: 1.4719s\n",
"Isolation Forest (IForest) ROC:0.7974, precision @ rank n:0.2604, execution time: 0.5817s\n",
"Local Outlier Factor (LOF) ROC:0.67, precision @ rank n:0.3264, execution time: 0.6347s\n",
"One-class SVM (OCSVM) ROC:0.8543, precision @ rank n:0.3854, execution time: 1.8226s\n",
"Principal Component Analysis(PCA) ROC:0.8518, precision @ rank n:0.3785, execution time: 0.0561s\n",
"Kernel PCA(KPCA) ROC:0.8588, precision @ rank n:0.3958, execution time: 14.8045s\n",
"Kernel PCA(KPCA) with samling ROC:0.8494, precision @ rank n:0.3785, execution time: 0.6482s\n",
"\n",
"... Processing musk.mat ...\n",
"Angle-based Outlier Detector (ABOD) ROC:0.2741, precision @ rank n:0.0426, execution time: 0.7341s\n",
"K Nearest Neighbors (KNN) ROC:0.876, precision @ rank n:0.3404, execution time: 0.4263s\n",
"Isolation Forest (IForest) ROC:1.0, precision @ rank n:1.0, execution time: 0.3897s\n",
"Local Outlier Factor (LOF) ROC:0.668, precision @ rank n:0.2553, execution time: 0.1178s\n",
"One-class SVM (OCSVM) ROC:1.0, precision @ rank n:1.0, execution time: 0.4749s\n",
"Principal Component Analysis(PCA) ROC:1.0, precision @ rank n:1.0, execution time: 0.0574s\n",
"Kernel PCA(KPCA) ROC:0.7274, precision @ rank n:0.4043, execution time: 0.9847s\n",
"Kernel PCA(KPCA) with samling ROC:0.8434, precision @ rank n:0.5106, execution time: 0.2369s\n",
"\n",
"... Processing optdigits.mat ...\n",
"Angle-based Outlier Detector (ABOD) ROC:0.5204, precision @ rank n:0.0312, execution time: 1.0504s\n",
"K Nearest Neighbors (KNN) ROC:0.3974, precision @ rank n:0.0, execution time: 0.5476s\n",
"Isolation Forest (IForest) ROC:0.6907, precision @ rank n:0.0156, execution time: 0.4118s\n",
"Local Outlier Factor (LOF) ROC:0.5012, precision @ rank n:0.0781, execution time: 0.3103s\n",
"One-class SVM (OCSVM) ROC:0.5125, precision @ rank n:0.0, execution time: 0.6467s\n",
"Principal Component Analysis(PCA) ROC:0.5141, precision @ rank n:0.0, execution time: 0.0198s\n",
"Kernel PCA(KPCA) ROC:0.5284, precision @ rank n:0.0, execution time: 4.3066s\n",
"Kernel PCA(KPCA) with samling ROC:0.5023, precision @ rank n:0.0, execution time: 0.3975s\n",
"\n",
"... Processing pendigits.mat ...\n",
"Angle-based Outlier Detector (ABOD) ROC:0.6728, precision @ rank n:0.06, execution time: 0.997s\n",
"K Nearest Neighbors (KNN) ROC:0.6995, precision @ rank n:0.08, execution time: 0.5151s\n",
"Isolation Forest (IForest) ROC:0.955, precision @ rank n:0.38, execution time: 0.3741s\n",
"Local Outlier Factor (LOF) ROC:0.4443, precision @ rank n:0.06, execution time: 0.4893s\n",
"One-class SVM (OCSVM) ROC:0.9293, precision @ rank n:0.34, execution time: 0.9349s\n",
"Principal Component Analysis(PCA) ROC:0.9426, precision @ rank n:0.28, execution time: 0.013s\n",
"Kernel PCA(KPCA) ROC:0.9207, precision @ rank n:0.14, execution time: 9.0731s\n",
"Kernel PCA(KPCA) with samling ROC:0.9661, precision @ rank n:0.34, execution time: 0.545s\n",
"\n",
"... Processing pima.mat ...\n",
"Angle-based Outlier Detector (ABOD) ROC:0.6614, precision @ rank n:0.5048, execution time: 0.074s\n",
"K Nearest Neighbors (KNN) ROC:0.6909, precision @ rank n:0.5429, execution time: 0.0178s\n",
"Isolation Forest (IForest) ROC:0.6504, precision @ rank n:0.4857, execution time: 0.1928s\n",
"Local Outlier Factor (LOF) ROC:0.5148, precision @ rank n:0.3714, execution time: 0.0045s\n",
"One-class SVM (OCSVM) ROC:0.6184, precision @ rank n:0.4762, execution time: 0.011s\n",
"Principal Component Analysis(PCA) ROC:0.6351, precision @ rank n:0.4857, execution time: 0.001s\n",
"Kernel PCA(KPCA) ROC:0.6696, precision @ rank n:0.4952, execution time: 0.1347s\n",
"Kernel PCA(KPCA) with samling ROC:0.6753, precision @ rank n:0.5048, execution time: 0.0712s\n",
"\n",
"... Processing satellite.mat ...\n",
"Angle-based Outlier Detector (ABOD) ROC:0.5645, precision @ rank n:0.3882, execution time: 0.9812s\n",
"K Nearest Neighbors (KNN) ROC:0.6792, precision @ rank n:0.4794, execution time: 0.5223s\n",
"Isolation Forest (IForest) ROC:0.6967, precision @ rank n:0.5656, execution time: 0.3981s\n",
"Local Outlier Factor (LOF) ROC:0.5468, precision @ rank n:0.3676, execution time: 0.4176s\n",
"One-class SVM (OCSVM) ROC:0.6607, precision @ rank n:0.5244, execution time: 0.9794s\n",
"Principal Component Analysis(PCA) ROC:0.5976, precision @ rank n:0.464, execution time: 0.0079s\n",
"Kernel PCA(KPCA) ROC:0.6878, precision @ rank n:0.5039, execution time: 7.7041s\n",
"Kernel PCA(KPCA) with samling ROC:0.6909, precision @ rank n:0.509, execution time: 0.5056s\n",
"\n",
"... Processing satimage-2.mat ...\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Angle-based Outlier Detector (ABOD) ROC:0.8464, precision @ rank n:0.2647, execution time: 0.8863s\n",
"K Nearest Neighbors (KNN) ROC:0.9549, precision @ rank n:0.4412, execution time: 0.4757s\n",
"Isolation Forest (IForest) ROC:0.991, precision @ rank n:0.9118, execution time: 0.3707s\n",
"Local Outlier Factor (LOF) ROC:0.5507, precision @ rank n:0.0588, execution time: 0.3591s\n",
"One-class SVM (OCSVM) ROC:0.995, precision @ rank n:0.9412, execution time: 0.7805s\n",
"Principal Component Analysis(PCA) ROC:0.9713, precision @ rank n:0.8824, execution time: 0.0095s\n",
"Kernel PCA(KPCA) ROC:0.9841, precision @ rank n:0.5, execution time: 6.4915s\n",
"Kernel PCA(KPCA) with samling ROC:0.9589, precision @ rank n:0.4118, execution time: 0.4616s\n",
"\n",
"... Processing vertebral.mat ...\n",
"Angle-based Outlier Detector (ABOD) ROC:0.5843, precision @ rank n:0.25, execution time: 0.0248s\n",
"K Nearest Neighbors (KNN) ROC:0.495, precision @ rank n:0.0833, execution time: 0.0058s\n",
"Isolation Forest (IForest) ROC:0.4246, precision @ rank n:0.0, execution time: 0.1979s\n",
"Local Outlier Factor (LOF) ROC:0.503, precision @ rank n:0.0833, execution time: 0.0024s\n",
"One-class SVM (OCSVM) ROC:0.495, precision @ rank n:0.0833, execution time: 0.0019s\n",
"Principal Component Analysis(PCA) ROC:0.3919, precision @ rank n:0.0, execution time: 0.001s\n",
"Kernel PCA(KPCA) ROC:0.497, precision @ rank n:0.0833, execution time: 0.0902s\n",
"Kernel PCA(KPCA) with samling ROC:0.5694, precision @ rank n:0.0833, execution time: 0.0225s\n",
"\n",
"... Processing vowels.mat ...\n",
"Angle-based Outlier Detector (ABOD) ROC:0.956, precision @ rank n:0.4, execution time: 0.1645s\n",
"K Nearest Neighbors (KNN) ROC:0.9433, precision @ rank n:0.35, execution time: 0.0406s\n",
"Isolation Forest (IForest) ROC:0.6669, precision @ rank n:0.1, execution time: 0.2232s\n",
"Local Outlier Factor (LOF) ROC:0.9296, precision @ rank n:0.25, execution time: 0.014s\n",
"One-class SVM (OCSVM) ROC:0.7211, precision @ rank n:0.15, execution time: 0.0439s\n",
"Principal Component Analysis(PCA) ROC:0.4931, precision @ rank n:0.1, execution time: 0.0014s\n",
"Kernel PCA(KPCA) ROC:0.8834, precision @ rank n:0.2, execution time: 0.3537s\n",
"Kernel PCA(KPCA) with samling ROC:0.8444, precision @ rank n:0.2, execution time: 0.1124s\n",
"\n",
"... Processing wbc.mat ...\n",
"Angle-based Outlier Detector (ABOD) ROC:0.9456, precision @ rank n:0.2, execution time: 0.0593s\n",
"K Nearest Neighbors (KNN) ROC:0.9619, precision @ rank n:0.4, execution time: 0.013s\n",
"Isolation Forest (IForest) ROC:0.9728, precision @ rank n:0.6, execution time: 0.2198s\n",
"Local Outlier Factor (LOF) ROC:0.9361, precision @ rank n:0.2, execution time: 0.0036s\n",
"One-class SVM (OCSVM) ROC:0.966, precision @ rank n:0.4, execution time: 0.0067s\n",
"Principal Component Analysis(PCA) ROC:0.9646, precision @ rank n:0.4, execution time: 0.002s\n",
"Kernel PCA(KPCA) ROC:0.966, precision @ rank n:0.4, execution time: 0.0616s\n",
"Kernel PCA(KPCA) with samling ROC:0.9524, precision @ rank n:0.2, execution time: 0.0295s\n"
]
}
],
"source": [
"# Define data file and read X and y\n",
"mat_file_list = ['arrhythmia.mat',\n",
" 'cardio.mat',\n",
" 'glass.mat',\n",
" 'ionosphere.mat',\n",
" 'letter.mat',\n",
" 'mnist.mat',\n",
" 'musk.mat',\n",
" 'optdigits.mat',\n",
" 'pendigits.mat',\n",
" 'pima.mat',\n",
" 'satellite.mat',\n",
" 'satimage-2.mat',\n",
" # 'shuttle.mat',\n",
" 'vertebral.mat',\n",
" 'vowels.mat',\n",
" 'wbc.mat']\n",
"\n",
"# Define outlier detection tools to be compared\n",
"random_state = np.random.RandomState(42)\n",
"\n",
"df_columns = ['Data', '#Samples', '# Dimensions', 'Outlier Perc',\n",
" 'ABOD', 'KNN', 'IForest', 'LOF', 'OCSVM', 'PCA', 'KPCA', 'KPCA(SP)']\n",
"roc_df = pd.DataFrame(columns=df_columns)\n",
"prn_df = pd.DataFrame(columns=df_columns)\n",
"time_df = pd.DataFrame(columns=df_columns)\n",
"\n",
"\n",
"for mat_file in mat_file_list:\n",
" print(\"\\n... Processing\", mat_file, '...')\n",
" mat = loadmat(os.path.join('data', mat_file))\n",
"\n",
" X = mat['X']\n",
" y = mat['y'].ravel()\n",
" outliers_fraction = np.count_nonzero(y) / len(y)\n",
" outliers_percentage = round(outliers_fraction * 100, ndigits=4)\n",
"\n",
" # construct containers for saving results\n",
" roc_list = [mat_file[:-4], X.shape[0], X.shape[1], outliers_percentage]\n",
" prn_list = [mat_file[:-4], X.shape[0], X.shape[1], outliers_percentage]\n",
" time_list = [mat_file[:-4], X.shape[0], X.shape[1], outliers_percentage]\n",
"\n",
" # 60% data for training and 40% for testing\n",
" X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4,\n",
" random_state=random_state)\n",
"\n",
" # standardizing data for processing\n",
" X_train_norm, X_test_norm = standardizer(X_train, X_test)\n",
"\n",
" classifiers = {\n",
" 'Angle-based Outlier Detector (ABOD)': ABOD(\n",
" contamination=outliers_fraction),\n",
" 'K Nearest Neighbors (KNN)': KNN(contamination=outliers_fraction),\n",
" 'Isolation Forest (IForest)': IForest(\n",
" contamination=outliers_fraction,\n",
" random_state=random_state),\n",
" 'Local Outlier Factor (LOF)': LOF(\n",
" n_neighbors=10,\n",
" contamination=outliers_fraction),\n",
" 'One-class SVM (OCSVM)': OCSVM(contamination=outliers_fraction),\n",
" 'Principal Component Analysis(PCA)': PCA(\n",
" contamination=outliers_fraction, random_state=random_state),\n",
" 'Kernel PCA(KPCA)': KPCA(contamination=outliers_fraction, random_state=random_state),\n",
" 'Kernel PCA(KPCA) with samling': KPCA(sampling=True, subset_size=0.2,\n",
" contamination=outliers_fraction, random_state=random_state),\n",
" }\n",
"\n",
" for clf_name, clf in classifiers.items():\n",
" t0 = time()\n",
" clf.fit(X_train_norm)\n",
" test_scores = clf.decision_function(X_test_norm)\n",
" t1 = time()\n",
" duration = round(t1 - t0, ndigits=4)\n",
" time_list.append(duration)\n",
"\n",
" roc = round(roc_auc_score(y_test, test_scores), ndigits=4)\n",
" prn = round(precision_n_scores(y_test, test_scores), ndigits=4)\n",
"\n",
" print('{clf_name} ROC:{roc}, precision @ rank n:{prn}, '\n",
" 'execution time: {duration}s'.format(\n",
" clf_name=clf_name, roc=roc, prn=prn, duration=duration))\n",
"\n",
" roc_list.append(roc)\n",
" prn_list.append(prn)\n",
"\n",
" temp_df = pd.DataFrame(time_list).transpose()\n",
" temp_df.columns = df_columns\n",
" time_df = pd.concat([time_df, temp_df], axis=0)\n",
"\n",
" temp_df = pd.DataFrame(roc_list).transpose()\n",
" temp_df.columns = df_columns\n",
" roc_df = pd.concat([roc_df, temp_df], axis=0)\n",
"\n",
" temp_df = pd.DataFrame(prn_list).transpose()\n",
" temp_df.columns = df_columns\n",
" prn_df = pd.concat([prn_df, temp_df], axis=0)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Time complexity\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Data</th>\n",
" <th>#Samples</th>\n",
" <th># Dimensions</th>\n",
" <th>Outlier Perc</th>\n",
" <th>ABOD</th>\n",
" <th>KNN</th>\n",
" <th>IForest</th>\n",
" <th>LOF</th>\n",
" <th>OCSVM</th>\n",
" <th>PCA</th>\n",
" <th>KPCA</th>\n",
" <th>KPCA(SP)</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>arrhythmia</td>\n",
" <td>452</td>\n",
" <td>274</td>\n",
" <td>14.6018</td>\n",
" <td>0.8076</td>\n",
" <td>0.0292</td>\n",
" <td>0.247</td>\n",
" <td>0.0036</td>\n",
" <td>0.0226</td>\n",
" <td>0.0311</td>\n",
" <td>0.0816</td>\n",
" <td>0.0355</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>cardio</td>\n",
" <td>1831</td>\n",
" <td>21</td>\n",
" <td>9.6122</td>\n",
" <td>0.2436</td>\n",
" <td>0.0893</td>\n",
" <td>0.2443</td>\n",
" <td>0.043</td>\n",
" <td>0.0961</td>\n",
" <td>0.0026</td>\n",
" <td>0.4285</td>\n",
" <td>0.1398</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>glass</td>\n",
" <td>214</td>\n",
" <td>9</td>\n",
" <td>4.2056</td>\n",
" <td>0.0225</td>\n",
" <td>0.0058</td>\n",
" <td>0.1852</td>\n",
" <td>0.0017</td>\n",
" <td>0.0015</td>\n",
" <td>0.001</td>\n",
" <td>0.0456</td>\n",
" <td>0.0175</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>ionosphere</td>\n",
" <td>351</td>\n",
" <td>33</td>\n",
" <td>35.8974</td>\n",
" <td>0.0561</td>\n",
" <td>0.0122</td>\n",
" <td>0.2141</td>\n",
" <td>0.0113</td>\n",
" <td>0.0053</td>\n",
" <td>0.0021</td>\n",
" <td>0.0611</td>\n",
" <td>0.0274</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>letter</td>\n",
" <td>1600</td>\n",
" <td>32</td>\n",
" <td>6.25</td>\n",
" <td>0.2179</td>\n",
" <td>0.0782</td>\n",
" <td>0.2337</td>\n",
" <td>0.0285</td>\n",
" <td>0.0789</td>\n",
" <td>0.0034</td>\n",
" <td>0.3707</td>\n",
" <td>0.1209</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>mnist</td>\n",
" <td>7603</td>\n",
" <td>100</td>\n",
" <td>9.2069</td>\n",
" <td>2.2379</td>\n",
" <td>1.4719</td>\n",
" <td>0.5817</td>\n",
" <td>0.6347</td>\n",
" <td>1.8226</td>\n",
" <td>0.0561</td>\n",
" <td>14.8045</td>\n",
" <td>0.6482</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>musk</td>\n",
" <td>3062</td>\n",
" <td>166</td>\n",
" <td>3.1679</td>\n",
" <td>0.7341</td>\n",
" <td>0.4263</td>\n",
" <td>0.3897</td>\n",
" <td>0.1178</td>\n",
" <td>0.4749</td>\n",
" <td>0.0574</td>\n",
" <td>0.9847</td>\n",
" <td>0.2369</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>optdigits</td>\n",
" <td>5216</td>\n",
" <td>64</td>\n",
" <td>2.8758</td>\n",
" <td>1.0504</td>\n",
" <td>0.5476</td>\n",
" <td>0.4118</td>\n",
" <td>0.3103</td>\n",
" <td>0.6467</td>\n",
" <td>0.0198</td>\n",
" <td>4.3066</td>\n",
" <td>0.3975</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>pendigits</td>\n",
" <td>6870</td>\n",
" <td>16</td>\n",
" <td>2.2707</td>\n",
" <td>0.997</td>\n",
" <td>0.5151</td>\n",
" <td>0.3741</td>\n",
" <td>0.4893</td>\n",
" <td>0.9349</td>\n",
" <td>0.013</td>\n",
" <td>9.0731</td>\n",
" <td>0.545</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>pima</td>\n",
" <td>768</td>\n",
" <td>8</td>\n",
" <td>34.8958</td>\n",
" <td>0.074</td>\n",
" <td>0.0178</td>\n",
" <td>0.1928</td>\n",
" <td>0.0045</td>\n",
" <td>0.011</td>\n",
" <td>0.001</td>\n",
" <td>0.1347</td>\n",
" <td>0.0712</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>satellite</td>\n",
" <td>6435</td>\n",
" <td>36</td>\n",
" <td>31.6395</td>\n",
" <td>0.9812</td>\n",
" <td>0.5223</td>\n",
" <td>0.3981</td>\n",
" <td>0.4176</td>\n",
" <td>0.9794</td>\n",
" <td>0.0079</td>\n",
" <td>7.7041</td>\n",
" <td>0.5056</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>satimage-2</td>\n",
" <td>5803</td>\n",
" <td>36</td>\n",
" <td>1.2235</td>\n",
" <td>0.8863</td>\n",
" <td>0.4757</td>\n",
" <td>0.3707</td>\n",
" <td>0.3591</td>\n",
" <td>0.7805</td>\n",
" <td>0.0095</td>\n",
" <td>6.4915</td>\n",
" <td>0.4616</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>vertebral</td>\n",
" <td>240</td>\n",
" <td>6</td>\n",
" <td>12.5</td>\n",
" <td>0.0248</td>\n",
" <td>0.0058</td>\n",
" <td>0.1979</td>\n",
" <td>0.0024</td>\n",
" <td>0.0019</td>\n",
" <td>0.001</td>\n",
" <td>0.0902</td>\n",
" <td>0.0225</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>vowels</td>\n",
" <td>1456</td>\n",
" <td>12</td>\n",
" <td>3.4341</td>\n",
" <td>0.1645</td>\n",
" <td>0.0406</td>\n",
" <td>0.2232</td>\n",
" <td>0.014</td>\n",
" <td>0.0439</td>\n",
" <td>0.0014</td>\n",
" <td>0.3537</td>\n",
" <td>0.1124</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>wbc</td>\n",
" <td>378</td>\n",
" <td>30</td>\n",
" <td>5.5556</td>\n",
" <td>0.0593</td>\n",
" <td>0.013</td>\n",
" <td>0.2198</td>\n",
" <td>0.0036</td>\n",
" <td>0.0067</td>\n",
" <td>0.002</td>\n",
" <td>0.0616</td>\n",
" <td>0.0295</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Data #Samples # Dimensions Outlier Perc ABOD KNN IForest \\\n",
"0 arrhythmia 452 274 14.6018 0.8076 0.0292 0.247 \n",
"0 cardio 1831 21 9.6122 0.2436 0.0893 0.2443 \n",
"0 glass 214 9 4.2056 0.0225 0.0058 0.1852 \n",
"0 ionosphere 351 33 35.8974 0.0561 0.0122 0.2141 \n",
"0 letter 1600 32 6.25 0.2179 0.0782 0.2337 \n",
"0 mnist 7603 100 9.2069 2.2379 1.4719 0.5817 \n",
"0 musk 3062 166 3.1679 0.7341 0.4263 0.3897 \n",
"0 optdigits 5216 64 2.8758 1.0504 0.5476 0.4118 \n",
"0 pendigits 6870 16 2.2707 0.997 0.5151 0.3741 \n",
"0 pima 768 8 34.8958 0.074 0.0178 0.1928 \n",
"0 satellite 6435 36 31.6395 0.9812 0.5223 0.3981 \n",
"0 satimage-2 5803 36 1.2235 0.8863 0.4757 0.3707 \n",
"0 vertebral 240 6 12.5 0.0248 0.0058 0.1979 \n",
"0 vowels 1456 12 3.4341 0.1645 0.0406 0.2232 \n",
"0 wbc 378 30 5.5556 0.0593 0.013 0.2198 \n",
"\n",
" LOF OCSVM PCA KPCA KPCA(SP) \n",
"0 0.0036 0.0226 0.0311 0.0816 0.0355 \n",
"0 0.043 0.0961 0.0026 0.4285 0.1398 \n",
"0 0.0017 0.0015 0.001 0.0456 0.0175 \n",
"0 0.0113 0.0053 0.0021 0.0611 0.0274 \n",
"0 0.0285 0.0789 0.0034 0.3707 0.1209 \n",
"0 0.6347 1.8226 0.0561 14.8045 0.6482 \n",
"0 0.1178 0.4749 0.0574 0.9847 0.2369 \n",
"0 0.3103 0.6467 0.0198 4.3066 0.3975 \n",
"0 0.4893 0.9349 0.013 9.0731 0.545 \n",
"0 0.0045 0.011 0.001 0.1347 0.0712 \n",
"0 0.4176 0.9794 0.0079 7.7041 0.5056 \n",
"0 0.3591 0.7805 0.0095 6.4915 0.4616 \n",
"0 0.0024 0.0019 0.001 0.0902 0.0225 \n",
"0 0.014 0.0439 0.0014 0.3537 0.1124 \n",
"0 0.0036 0.0067 0.002 0.0616 0.0295 "
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"print('Time complexity')\n",
"time_df"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAfEAAAD7CAYAAAB63q2vAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAA3KElEQVR4nO3de5yOdf7H8deHUSpJQmISchYzcpxsShZRkdNKJx1U2pTO2drd2lZbbUXtprWWIm2IraVlhSj9asupcWgIOYS1ObSEMI35/P64rrn3njGHm9wzZryfj8f9cN/f63B/rntu9+e6vtf3YO6OiIiIFD+lijoAEREROTpK4iIiIsWUkriIiEgxpSQuIiJSTCmJi4iIFFNK4iIiIsWUkriISAlkZuea2TwzSzOzL8xscC7rnGlm75jZMjNbYGYXRC0bbGYrwm3vjSpPMrN/mdlyM3vXzMoX0iFJLpTERURKpgzgAXdvBLQB7jKzRjnWeRRIdfemwI3ASwBhMr8NaAUkAVeaWZ1wm9HAEHdvArwDPBT3I5E8WXEb7KVSpUpes2bNog5DRKRYWbt2LVWqVKF8+f9dOK9Zs4aqVaty+umnA7B8+XIaNGjA3r172b17N1m/tVu3bsXMqFq1Kp9//jnJycmYGenp6axZs4bGjRuzf/9+NmzYQFZOqV27NmXLlmXnzp1s27YNd+e0006jRo0amBm7d+9my5YtACQkJFCvXr3C/UCKmcWLF+9w98qHLXD3YvVo3ry5i4hI7NavX+/nnnuu7969O1v5L37xC7/33nvd3f2zzz7z0qVL+6JFizwtLc3r1q3rO3bs8H379nmbNm180KBB7u6ekpLi77zzjru7v/DCC16uXDl3dx80aJC/8cYb7u5+8OBB//777z0tLc2vvPJKT09Pd3f3O++808eNG+fbtm3zxMREX7dunbu779y5M+6fQXEHLPJccmJC4Z9PiIhIYdm7dy+9evXixRdfzHYVDjBkyBAGDx5McnIyTZo0oVmzZpQuXZqGDRvyyCOP0KlTJ0477TSSk5MpXbo0AK+++ir33HMPv/3tb+nWrRsnnXQSACkpKTz11FNs3ryZnj17UrduXd5//30WL15My5YtAdi/fz9VqlTh008/pV27dtSqVQuAihUrFuInUrIoiYuIlFA//PADvXr14rrrrqNnz56HLS9fvjyvvfYaENTK1qpVi9q1awNw6623cuuttwLw6KOPkpiYCECDBg2YNWsWAKtXr2b69OkAXHvttbRu3Zrp06fTtWtX/vznP+Pu9O/fn6effjrb+7777rvxOeATkBq2iYiUQO7OrbfeSsOGDbn//vtzXWfXrl2kp6cDMHr0aNq1axe5Wt+2bRsAX3/9NW+//TbXXntttvLMzEyGDh3KwIEDAVi3bh21a9fmnnvuoXv37ixbtowOHTowZcqUyDbffvstGzdupE2bNsyfP5/169dHyuXo6EpcRKQE+vjjjxk/fjxNmjQhOTkZgN/97nd8/fXXAAwcOJCVK1fSv39/zIzGjRszZsyYyPa9evVi586dlClThhEjRlChQgUAJkyYwIgRIwDo2bMnN998MwBvvfUW48ePp0yZMlStWpVHH32UihUrMnToUDp16kRmZmZkX23atGHUqFH07NmTzMxMqlSpwuzZswvvwylBil3r9BYtWviiRYuKOgwREZFCY2aL3b1FzvK4VaebWdlw8ICl4WABv8llnZPNbJKZrTWzz8ysZrziERERKWnieU/8IHCZuycBycDlZtYmxzq3Av919zrAcODZOMYjIiJSosQtiYdd2/aGL8uEj5x1992BceHzKUAHM7N4xSQiIlKSxLV1upmVNrNUYBsw290/y7FKdWATgLtnALuBs+IZk4iISEkR19bp7n4ISDazCsA7ZnaBu6840v2Y2e3A7QA1atQ4tkGKiJRgNYdML+oQCrThmSuKOoRiq1D6ibv7LmAecHmORVuAcwHMLAE4A9iZy/aj3L2Fu7eoXPnwoWNFRERORPFsnV45vALHzE4BOgKrcqw2DegfPu8NzPXi1udNRESkiMSzOv0cYJyZlSY4WXjL3f9hZk8SDOQ+DRgDjDeztcC3wDVxjEdERKREiVsSd/dlQLNcyn8d9fwA0CdeMYiIiJRkGjtdRESkmFISFxERKaaUxEVERIopJXEREZFiSklcRESkmFISFxERKaaUxEVERIopJXEREZFiSklcRESkmFISFxERKaaUxEVERIopJXEREZFiSklcRESkmFISFxERKaaUxEVERIopJXEREZFiSklcRESkmFISFxERKaaUxEVERIopJXEREZFiSklcRESkmFISFxERKaaUxEVERIopJXEREZFiSklcRESkmFISFxERKabilsTN7Fwzm2dmaWb2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Bg8ezHXXXUd6ejqHDh1i5cqVTJo0iY8//pgyZcrw85//nL/+9a906dKF2267jfnz51OrVq24X6QoiZcAR5skSpcuzZ///OfDys8+++xcf9hziq5myquKfPDgwQwePPiw8rySChTc733+/Pnce++9LFu2jIkTJ2ZLWl9//TUDBgxg06ZNmBkzZsygZs2aXHfddSxatIgyZcrQqlUr/vznP1OmTBl2797N9ddfz9dff01GRgYPPvggN998c4HHLiLHl5wNQ7Ns3bqVG264gXHjxlGqVCn+/e9/M3nyZD744IPD9jFhwgRuuukmHnjgAf71r39xww03sGLFClJSUnjqqafYvHkzPXv2pG7durz//vssXrw40gB0//79VKlShU8//ZR27dpRq1YtIP5tflSdLseVWPq916hRg7Fjx3Lttdcetv2NN97IQw89xMqVK1mwYEHk9sF1113HqlWrWL58Ofv372f06NFAMNtWo0aNWLp0KR988AEPPPAA6enp8T9QESnQj20Y+t1333HFFVfw1FNP0aZNMI7Y559/HmkHUrNmTb7//nvq1KkDBFfyP/vZz4Cg986BAwfYsWMH1157LdOmTeOUU06ha9euzJ07F3enf//+kYahX375JU888UQcP43cKYnLcSWWe2A1a9akadOmlCqV/eublpZGRkYGHTt2BILq+6x7ZV27dsXMMDNatWqVra/8nj17cHf27t1LxYoVSUhI0OAoIseBH9PmJz09nR49enDjjTdmq6274oor+M9//hNp23Pqqaeydu1aILhAeP/99wFYuXIlBw4coHLlyqxbt47atWtzzz330L17d5YtW0aHDh2YMmUK27ZtA4K2PRs3bqRNmzbMnz+f9evXR8rjSdXpclw50ntg0VavXk2FChXo2bMn69ev56c//SnPPPNMtuFif/jhB8aPH89LL70EwKBBg+jWrRvVqlVjz549TJo0iVKlSkUGR3nsscc4dOhQZMCVrMFRTjvtNJ599lmGDRvGkCFD6Nu3L5MmTaJly5Z89913+Q6OotbcIrH5MW1+3nrrLebPn8/OnTsjbW7Gjh1LcnJynu/3wgsvcNtttzF8+HDMjLFjx2JmvPXWW4wfP54yZcpQtWpVHn30USpWrMjQoUPp1KkTmZmZlClThhEjRtCmTRtGjRpFz549yczMpEqVKsyePTt+n1Hc9ixF5kRNEhkZGXz00Ud8/vnn1KhRg759+zJ27Nhs01H+/Oc/p127dpFudO+99x7JycnMnTuXr776io4dO3LxxRdrcBSR48TRtvm5/vrruf766wvcf1ZtGkCjRo34+OOPD1tnyJAhh7XNgWCMhqxJiaJ16dIl1wZ28aDqdDmuHOl81dESExNJTk6mdu3aJCQkcPXVV7NkyZLI8t/85jds376dYcOGRcpee+01evbsiZlRp04datWqxapVqzQ4iogUC0riclyJ5R5Yftvu2rUr0hd07ty5kUEhRo8ezXvvvceECROy3UuPvgf2zTff8OWXX1K7dm02btzI2WefzW233caAAQNYsmQJbdq04eOPP47cP9u3bx+rV6/ONjgKwJ49e8jIyDhmn4mISF6UxOW4EsvgKAsXLiQxMZHJkydzxx130LhxYyDoMvf888/ToUMHmjRpgrtz2223ATBw4EC++eYbUlJSSE5OjlTH/epXv+KTTz6hSZMmdOjQgWeffZZKlSppcBQRKRbiNp94vGg+8YIVh2M6kRtOlbS/T0k7npKmpP19StrxxKrQ5xMXERGR+FISF5ETTkEzYx08eJC+fftSp04dWrduHRmdcOfOnbRv355y5coxaNCgbNtcfvnlJCUl0bhxYwYOHBgZR3vp0qWkpKTQpEkTrrrqqsjY3Bs2bOCUU04hOTmZ5OTkAoc2FsmNkriInFBiGRVwzJgxnHnmmaxdu5b77ruPRx55BAjGs//tb3/L888/f9h+33rrLZYuXcqKFSvYvn07kydPBmDAgAE888wzLF++nB49ekQmqwE4//zzI70dRo4cGcejlpJKSVxETiixjAo4derUyNj+vXv35v3338fdOe200/jJT35C2bJlD9tv1vgAGRkZpKenY2ZAMAhRu3btAOjYsSN/+9vf8o3v0KFD3HTTTVxwwQU0adKE4cOHA/DVV19x+eWX07x5cy6++GJWrVoFBL0qevToQVJSEklJSZG55eXEoMFe5Lh3ojZkkfiIZVTA6HUSEhI444wz2LlzJ5UqVcp33507d2bBggV06dIlMtRn48aNmTp1KldffTWTJ0/ONg7C+vXradasGeXLl2fo0KFcfPHFpKamsmXLFlasWAHArl27ALj99tsZOXIkdevW5bPPPuPnP/85c+fO5Z577uGSSy7hnXfe4dChQ9kGL5GST1fiIiLH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\n",
"text/plain": [
"<Figure size 576x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# https://dajiro.com/entry/2020/06/06/113437\n",
"def autolabel(rects):\n",
" for rect in rects:\n",
" height = rect.get_height()\n",
" ax.annotate('{:.4g}sec'.format(height),\n",
" xy=(rect.get_x() + rect.get_width() / 2, height),\n",
" xytext=(0, 3),\n",
" textcoords=\"offset points\",\n",
" ha='center', va='bottom',\n",
" fontsize=10)\n",
"\n",
"fig, ax = plt.subplots(figsize = (8, 4))\n",
"label = [\"ABOD\", \"KNN\", \"LOF\", \"IForest\", \"OCSVM\", \"PCA\", \"KPCA\", \"KPCA(SP)\"]\n",
"time_ave = [time_df[\"ABOD\"].mean(), time_df[\"KNN\"].mean(), time_df[\"LOF\"].mean(), time_df[\"IForest\"].mean(), \n",
" time_df[\"OCSVM\"].mean(), time_df[\"PCA\"].mean(), time_df[\"KPCA\"].mean(), time_df[\"KPCA(SP)\"].mean()]\n",
"rect = ax.bar(label, time_ave, align=\"center\")\n",
"ax.set_ylabel(\"Time complexity (sec)\")\n",
"# ax.set_ylim(0, 9.0)\n",
"autolabel(rect)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Analyze the performance of ROC and Precision @ n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"ROC Performance\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Data</th>\n",
" <th>#Samples</th>\n",
" <th># Dimensions</th>\n",
" <th>Outlier Perc</th>\n",
" <th>ABOD</th>\n",
" <th>KNN</th>\n",
" <th>IForest</th>\n",
" <th>LOF</th>\n",
" <th>OCSVM</th>\n",
" <th>PCA</th>\n",
" <th>KPCA</th>\n",
" <th>KPCA(SP)</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>arrhythmia</td>\n",
" <td>452</td>\n",
" <td>274</td>\n",
" <td>14.6018</td>\n",
" <td>0.7687</td>\n",
" <td>0.782</td>\n",
" <td>0.8464</td>\n",
" <td>0.7619</td>\n",
" <td>0.7986</td>\n",
" <td>0.7997</td>\n",
" <td>0.7883</td>\n",
" <td>0.7775</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>cardio</td>\n",
" <td>1831</td>\n",
" <td>21</td>\n",
" <td>9.6122</td>\n",
" <td>0.5703</td>\n",
" <td>0.7435</td>\n",
" <td>0.9348</td>\n",
" <td>0.5193</td>\n",
" <td>0.9415</td>\n",
" <td>0.9543</td>\n",
" <td>0.8249</td>\n",
" <td>0.8095</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>glass</td>\n",
" <td>214</td>\n",
" <td>9</td>\n",
" <td>4.2056</td>\n",
" <td>0.7287</td>\n",
" <td>0.811</td>\n",
" <td>0.6067</td>\n",
" <td>0.7287</td>\n",
" <td>0.4116</td>\n",
" <td>0.5305</td>\n",
" <td>0.8201</td>\n",
" <td>0.6555</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>ionosphere</td>\n",
" <td>351</td>\n",
" <td>33</td>\n",
" <td>35.8974</td>\n",
" <td>0.8585</td>\n",
" <td>0.9407</td>\n",
" <td>0.8175</td>\n",
" <td>0.8648</td>\n",
" <td>0.7819</td>\n",
" <td>0.7505</td>\n",
" <td>0.9112</td>\n",
" <td>0.9456</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>letter</td>\n",
" <td>1600</td>\n",
" <td>32</td>\n",
" <td>6.25</td>\n",
" <td>0.9104</td>\n",
" <td>0.857</td>\n",
" <td>0.6048</td>\n",
" <td>0.896</td>\n",
" <td>0.5712</td>\n",
" <td>0.5146</td>\n",
" <td>0.8478</td>\n",
" <td>0.8102</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>mnist</td>\n",
" <td>7603</td>\n",
" <td>100</td>\n",
" <td>9.2069</td>\n",
" <td>0.7824</td>\n",
" <td>0.8506</td>\n",
" <td>0.7974</td>\n",
" <td>0.67</td>\n",
" <td>0.8543</td>\n",
" <td>0.8518</td>\n",
" <td>0.8588</td>\n",
" <td>0.8494</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>musk</td>\n",
" <td>3062</td>\n",
" <td>166</td>\n",
" <td>3.1679</td>\n",
" <td>0.2741</td>\n",
" <td>0.876</td>\n",
" <td>1</td>\n",
" <td>0.668</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0.7274</td>\n",
" <td>0.8434</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>optdigits</td>\n",
" <td>5216</td>\n",
" <td>64</td>\n",
" <td>2.8758</td>\n",
" <td>0.5204</td>\n",
" <td>0.3974</td>\n",
" <td>0.6907</td>\n",
" <td>0.5012</td>\n",
" <td>0.5125</td>\n",
" <td>0.5141</td>\n",
" <td>0.5284</td>\n",
" <td>0.5023</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>pendigits</td>\n",
" <td>6870</td>\n",
" <td>16</td>\n",
" <td>2.2707</td>\n",
" <td>0.6728</td>\n",
" <td>0.6995</td>\n",
" <td>0.955</td>\n",
" <td>0.4443</td>\n",
" <td>0.9293</td>\n",
" <td>0.9426</td>\n",
" <td>0.9207</td>\n",
" <td>0.9661</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>pima</td>\n",
" <td>768</td>\n",
" <td>8</td>\n",
" <td>34.8958</td>\n",
" <td>0.6614</td>\n",
" <td>0.6909</td>\n",
" <td>0.6504</td>\n",
" <td>0.5148</td>\n",
" <td>0.6184</td>\n",
" <td>0.6351</td>\n",
" <td>0.6696</td>\n",
" <td>0.6753</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>satellite</td>\n",
" <td>6435</td>\n",
" <td>36</td>\n",
" <td>31.6395</td>\n",
" <td>0.5645</td>\n",
" <td>0.6792</td>\n",
" <td>0.6967</td>\n",
" <td>0.5468</td>\n",
" <td>0.6607</td>\n",
" <td>0.5976</td>\n",
" <td>0.6878</td>\n",
" <td>0.6909</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>satimage-2</td>\n",
" <td>5803</td>\n",
" <td>36</td>\n",
" <td>1.2235</td>\n",
" <td>0.8464</td>\n",
" <td>0.9549</td>\n",
" <td>0.991</td>\n",
" <td>0.5507</td>\n",
" <td>0.995</td>\n",
" <td>0.9713</td>\n",
" <td>0.9841</td>\n",
" <td>0.9589</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>vertebral</td>\n",
" <td>240</td>\n",
" <td>6</td>\n",
" <td>12.5</td>\n",
" <td>0.5843</td>\n",
" <td>0.495</td>\n",
" <td>0.4246</td>\n",
" <td>0.503</td>\n",
" <td>0.495</td>\n",
" <td>0.3919</td>\n",
" <td>0.497</td>\n",
" <td>0.5694</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>vowels</td>\n",
" <td>1456</td>\n",
" <td>12</td>\n",
" <td>3.4341</td>\n",
" <td>0.956</td>\n",
" <td>0.9433</td>\n",
" <td>0.6669</td>\n",
" <td>0.9296</td>\n",
" <td>0.7211</td>\n",
" <td>0.4931</td>\n",
" <td>0.8834</td>\n",
" <td>0.8444</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>wbc</td>\n",
" <td>378</td>\n",
" <td>30</td>\n",
" <td>5.5556</td>\n",
" <td>0.9456</td>\n",
" <td>0.9619</td>\n",
" <td>0.9728</td>\n",
" <td>0.9361</td>\n",
" <td>0.966</td>\n",
" <td>0.9646</td>\n",
" <td>0.966</td>\n",
" <td>0.9524</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Data #Samples # Dimensions Outlier Perc ABOD KNN IForest \\\n",
"0 arrhythmia 452 274 14.6018 0.7687 0.782 0.8464 \n",
"0 cardio 1831 21 9.6122 0.5703 0.7435 0.9348 \n",
"0 glass 214 9 4.2056 0.7287 0.811 0.6067 \n",
"0 ionosphere 351 33 35.8974 0.8585 0.9407 0.8175 \n",
"0 letter 1600 32 6.25 0.9104 0.857 0.6048 \n",
"0 mnist 7603 100 9.2069 0.7824 0.8506 0.7974 \n",
"0 musk 3062 166 3.1679 0.2741 0.876 1 \n",
"0 optdigits 5216 64 2.8758 0.5204 0.3974 0.6907 \n",
"0 pendigits 6870 16 2.2707 0.6728 0.6995 0.955 \n",
"0 pima 768 8 34.8958 0.6614 0.6909 0.6504 \n",
"0 satellite 6435 36 31.6395 0.5645 0.6792 0.6967 \n",
"0 satimage-2 5803 36 1.2235 0.8464 0.9549 0.991 \n",
"0 vertebral 240 6 12.5 0.5843 0.495 0.4246 \n",
"0 vowels 1456 12 3.4341 0.956 0.9433 0.6669 \n",
"0 wbc 378 30 5.5556 0.9456 0.9619 0.9728 \n",
"\n",
" LOF OCSVM PCA KPCA KPCA(SP) \n",
"0 0.7619 0.7986 0.7997 0.7883 0.7775 \n",
"0 0.5193 0.9415 0.9543 0.8249 0.8095 \n",
"0 0.7287 0.4116 0.5305 0.8201 0.6555 \n",
"0 0.8648 0.7819 0.7505 0.9112 0.9456 \n",
"0 0.896 0.5712 0.5146 0.8478 0.8102 \n",
"0 0.67 0.8543 0.8518 0.8588 0.8494 \n",
"0 0.668 1 1 0.7274 0.8434 \n",
"0 0.5012 0.5125 0.5141 0.5284 0.5023 \n",
"0 0.4443 0.9293 0.9426 0.9207 0.9661 \n",
"0 0.5148 0.6184 0.6351 0.6696 0.6753 \n",
"0 0.5468 0.6607 0.5976 0.6878 0.6909 \n",
"0 0.5507 0.995 0.9713 0.9841 0.9589 \n",
"0 0.503 0.495 0.3919 0.497 0.5694 \n",
"0 0.9296 0.7211 0.4931 0.8834 0.8444 \n",
"0 0.9361 0.966 0.9646 0.966 0.9524 "
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"print('ROC Performance')\n",
"roc_df"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAD8CAYAAACYebj1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAArXElEQVR4nO3de7yVY/7/8denUhHJIdUu2qOjjlt2iMGQ3STG1FCKIR0wfs4zRgyRwyiqUcow6YzRCcVQ+KahMUTtUkinCZVDB0Ln2n1+f9z3vq19Xu322mu3ez8fj/XY677u02etvdb63Nd1X/d1m7sjIiICUCHZAYiISNmhpCAiIhElBRERiSgpiIhIRElBREQiSgoiIhJJWFIws7Fmtt7MPo4pO9rM3jSzFeHfo8JyM7PHzWylmS02szaJiktERAqWyJrCeKBjrrI7gdnu3giYHU4DXAA0Ch/XAk8mMC4RESlAwpKCu78DfJer+LfAhPD5BKBzTPlED7wP1DCzOomKTURE8leplPdXy92/Dp9/A9QKn9cF1sQstzYs+5pczOxagtoE1apVO6Vp06aJi1ZEpBxasGDBRnevmd+80k4KEXd3M9vnMTbcfRQwCiA9Pd3nz59f4rGJiJRnZvZFQfNKu/fRt9nNQuHf9WH5OuD4mOXqhWUiIlKKSjspvAz0DJ/3BGbElF8V9kI6HfghpplJRERKScKaj8zseeBXwLFmtha4DxgETDGzPsAXQLdw8deATsBKYBvQK1FxiYhIwRKWFNy9RwGz2uezrAM3JCoWERGJj65oFhGRiJKCiIhElBRERCSipCAiIhElBRERiSgpiIhIRElBREQiSgoiIhJRUhARkYiSgoiIRJQUREQkoqQgIiIRJQUREYkoKYiISERJQUREIkoKIiISUVIQEZGIkoKIiESUFEREJKKkICIiESUFERGJKCmIiEhESUFERCJKCiIiElFSEBGRiJKCiIhElBRERCSipCAiZc6yZctIS0uLHtWrV2fYsGF89NFHtGvXjpYtW/Kb3/yGH3/8scBtZGVlcfLJJ3PRRRflmXfzzTdz+OGHR9MjRoygRYsWdOrUiV27dgHwn//8h9tuu63kX1wZp6QgImVOkyZNWLRoEYsWLWLBggUcdthhdOnShb59+zJo0CCWLFlCly5dGDx4cIHbGD58OCeddFKe8vnz5/P999/nKHvuuedYvHgxZ5xxBq+//jruzoMPPkj//v3zrL+/CWvWrFk0adKEhg0bMmjQoKh85MiRNGzYEDNj48aNUfkLL7xA8+bNOeuss9i0aRMAq1at4rLLLiv8TSwudz9gH6eccoqLSPn2+uuv+xlnnOHu7tWrV/e9e/e6u/uXX37pJ510Ur7rrFmzxs877zyfPXu2X3jhhVH5nj17/Fe/+pV/9dVXXq1ataj81FNP9R07dvhdd93lM2fO9IkTJ/pjjz1WZGx79uzxWrVq+eeff+7p6en+73//293dx4wZ4/fcc0++y5944om+atUq37lzp7dq1co/+eQTd3fPzMz01atXe/369X3Dhg3ROuecc45v3brVn3nmGX/88cfd3b179+6+fPnyIuMrCDDfC/hdVU2hDCnoCOSyyy6LylJTU0lLS8t3/ccee4zmzZvTokULevTowY4dOwB46623aNOmDS1atKBnz57s2bMHSMIRiEgxTJo0iR49egDQvHlzZsyYAcDUqVNZs2ZNvuvceuutPProo1SokPMnbuTIkVx88cXUqVMnR/mNN97I6aefzpdffsmZZ57JuHHjuOGGG4qMbfbs2TRo0ID69euzfPlyzj77bAAyMjJ44YUX8iz/wQcf0LBhQ0488UQqV65M9+7do9dz8sknk5qammedChUqsHPnTrZt28YhhxzC3LlzqV27No0aNSoyvmIpKFscCI/yXFOIPQKJ9cc//tHvv//+PMuvXbvWU1NTfdu2be7u3rVrVx83bpxnZWV5vXr1fNmyZe7u3r9/fx89erS7J+YIJNk+++wzb926dfQ44ogj/LHHHvNu3bpFZfXr1/fWrVvHva67+x133OEtW7b0K6+8Mlr+mWeeietoUopv586dfswxx/g333zj7u5Lly71jIwMb9OmjQ8YMMCPPvroPOu88sorfv3117u7+5w5c6Kawrp16/zMM8/03bt3u7vnqCnEuv/++/2ll17yGTNm+CWXXOK33nqrZ2Vl5btsr169fMSIEe7u3q5dO3/ppZfc3X3o0KF++OGH51l+6tSp3qdPn2h64sSJfsMNN+RYJndN4Y033vA2bdr4RRdd5Js3b/aMjAzftGlTvvHEC9UUDjyxRyDZ3J0pU6ZER0257dmzh+3bt7Nnzx62bdtGSkoKmzZtonLlyjRu3BjIeQRT6kcgpaCgtujJkydH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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Show average ROC over data\n",
"\n",
"# https://dajiro.com/entry/2020/06/06/113437\n",
"def autolabel(rects):\n",
" for rect in rects:\n",
" height = rect.get_height()\n",
" ax.annotate('{:.4g}%'.format(height),\n",
" xy=(rect.get_x() + rect.get_width() / 2, height),\n",
" xytext=(0, 3),\n",
" textcoords=\"offset points\",\n",
" ha='center', va='bottom',\n",
" fontsize=10)\n",
"\n",
"fig, ax = plt.subplots(figsize = (6, 4))\n",
"label = [\"ABOD\", \"KNN\", \"LOF\", \"IForest\", \"OCSVM\", \"PCA\", \"KPCA\", \"KPCA(SP)\"]\n",
"roc = [roc_df[\"ABOD\"].mean(), roc_df[\"KNN\"].mean(), roc_df[\"LOF\"].mean(), roc_df[\"IForest\"].mean(), \n",
" roc_df[\"OCSVM\"].mean(), roc_df[\"PCA\"].mean(), roc_df[\"KPCA\"].mean(),roc_df[\"KPCA(SP)\"].mean()]\n",
"roc = np.array(roc) * 100\n",
"rect = ax.bar(label, roc, align=\"center\")\n",
"ax.set_ylabel(\"ROC Performance (%)\")\n",
"ax.set_ylim(0, 100.0)\n",
"autolabel(rect)\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Precision @ n Performance\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Data</th>\n",
" <th>#Samples</th>\n",
" <th># Dimensions</th>\n",
" <th>Outlier Perc</th>\n",
" <th>ABOD</th>\n",
" <th>KNN</th>\n",
" <th>IForest</th>\n",
" <th>LOF</th>\n",
" <th>OCSVM</th>\n",
" <th>PCA</th>\n",
" <th>KPCA</th>\n",
" <th>KPCA(SP)</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>arrhythmia</td>\n",
" <td>452</td>\n",
" <td>274</td>\n",
" <td>14.6018</td>\n",
" <td>0.3571</td>\n",
" <td>0.5</td>\n",
" <td>0.5714</td>\n",
" <td>0.4286</td>\n",
" <td>0.5</td>\n",
" <td>0.5</td>\n",
" <td>0.4643</td>\n",
" <td>0.5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>cardio</td>\n",
" <td>1831</td>\n",
" <td>21</td>\n",
" <td>9.6122</td>\n",
" <td>0.1923</td>\n",
" <td>0.3718</td>\n",
" <td>0.5641</td>\n",
" <td>0.1282</td>\n",
" <td>0.5769</td>\n",
" <td>0.6538</td>\n",
" <td>0.3846</td>\n",
" <td>0.4231</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>glass</td>\n",
" <td>214</td>\n",
" <td>9</td>\n",
" <td>4.2056</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>ionosphere</td>\n",
" <td>351</td>\n",
" <td>33</td>\n",
" <td>35.8974</td>\n",
" <td>0.7955</td>\n",
" <td>0.8182</td>\n",
" <td>0.5682</td>\n",
" <td>0.75</td>\n",
" <td>0.6364</td>\n",
" <td>0.5909</td>\n",
" <td>0.7955</td>\n",
" <td>0.8182</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>letter</td>\n",
" <td>1600</td>\n",
" <td>32</td>\n",
" <td>6.25</td>\n",
" <td>0.3953</td>\n",
" <td>0.3488</td>\n",
" <td>0.1163</td>\n",
" <td>0.4419</td>\n",
" <td>0.1628</td>\n",
" <td>0.093</td>\n",
" <td>0.2093</td>\n",
" <td>0.186</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>mnist</td>\n",
" <td>7603</td>\n",
" <td>100</td>\n",
" <td>9.2069</td>\n",
" <td>0.3611</td>\n",
" <td>0.4306</td>\n",
" <td>0.2604</td>\n",
" <td>0.3264</td>\n",
" <td>0.3854</td>\n",
" <td>0.3785</td>\n",
" <td>0.3958</td>\n",
" <td>0.3785</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>musk</td>\n",
" <td>3062</td>\n",
" <td>166</td>\n",
" <td>3.1679</td>\n",
" <td>0.0426</td>\n",
" <td>0.3404</td>\n",
" <td>1</td>\n",
" <td>0.2553</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0.4043</td>\n",
" <td>0.5106</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>optdigits</td>\n",
" <td>5216</td>\n",
" <td>64</td>\n",
" <td>2.8758</td>\n",
" <td>0.0312</td>\n",
" <td>0</td>\n",
" <td>0.0156</td>\n",
" <td>0.0781</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>pendigits</td>\n",
" <td>6870</td>\n",
" <td>16</td>\n",
" <td>2.2707</td>\n",
" <td>0.06</td>\n",
" <td>0.08</td>\n",
" <td>0.38</td>\n",
" <td>0.06</td>\n",
" <td>0.34</td>\n",
" <td>0.28</td>\n",
" <td>0.14</td>\n",
" <td>0.34</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>pima</td>\n",
" <td>768</td>\n",
" <td>8</td>\n",
" <td>34.8958</td>\n",
" <td>0.5048</td>\n",
" <td>0.5429</td>\n",
" <td>0.4857</td>\n",
" <td>0.3714</td>\n",
" <td>0.4762</td>\n",
" <td>0.4857</td>\n",
" <td>0.4952</td>\n",
" <td>0.5048</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>satellite</td>\n",
" <td>6435</td>\n",
" <td>36</td>\n",
" <td>31.6395</td>\n",
" <td>0.3882</td>\n",
" <td>0.4794</td>\n",
" <td>0.5656</td>\n",
" <td>0.3676</td>\n",
" <td>0.5244</td>\n",
" <td>0.464</td>\n",
" <td>0.5039</td>\n",
" <td>0.509</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>satimage-2</td>\n",
" <td>5803</td>\n",
" <td>36</td>\n",
" <td>1.2235</td>\n",
" <td>0.2647</td>\n",
" <td>0.4412</td>\n",
" <td>0.9118</td>\n",
" <td>0.0588</td>\n",
" <td>0.9412</td>\n",
" <td>0.8824</td>\n",
" <td>0.5</td>\n",
" <td>0.4118</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>vertebral</td>\n",
" <td>240</td>\n",
" <td>6</td>\n",
" <td>12.5</td>\n",
" <td>0.25</td>\n",
" <td>0.0833</td>\n",
" <td>0</td>\n",
" <td>0.0833</td>\n",
" <td>0.0833</td>\n",
" <td>0</td>\n",
" <td>0.0833</td>\n",
" <td>0.0833</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>vowels</td>\n",
" <td>1456</td>\n",
" <td>12</td>\n",
" <td>3.4341</td>\n",
" <td>0.4</td>\n",
" <td>0.35</td>\n",
" <td>0.1</td>\n",
" <td>0.25</td>\n",
" <td>0.15</td>\n",
" <td>0.1</td>\n",
" <td>0.2</td>\n",
" <td>0.2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>wbc</td>\n",
" <td>378</td>\n",
" <td>30</td>\n",
" <td>5.5556</td>\n",
" <td>0.2</td>\n",
" <td>0.4</td>\n",
" <td>0.6</td>\n",
" <td>0.2</td>\n",
" <td>0.4</td>\n",
" <td>0.4</td>\n",
" <td>0.4</td>\n",
" <td>0.2</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Data #Samples # Dimensions Outlier Perc ABOD KNN IForest \\\n",
"0 arrhythmia 452 274 14.6018 0.3571 0.5 0.5714 \n",
"0 cardio 1831 21 9.6122 0.1923 0.3718 0.5641 \n",
"0 glass 214 9 4.2056 0 0 0 \n",
"0 ionosphere 351 33 35.8974 0.7955 0.8182 0.5682 \n",
"0 letter 1600 32 6.25 0.3953 0.3488 0.1163 \n",
"0 mnist 7603 100 9.2069 0.3611 0.4306 0.2604 \n",
"0 musk 3062 166 3.1679 0.0426 0.3404 1 \n",
"0 optdigits 5216 64 2.8758 0.0312 0 0.0156 \n",
"0 pendigits 6870 16 2.2707 0.06 0.08 0.38 \n",
"0 pima 768 8 34.8958 0.5048 0.5429 0.4857 \n",
"0 satellite 6435 36 31.6395 0.3882 0.4794 0.5656 \n",
"0 satimage-2 5803 36 1.2235 0.2647 0.4412 0.9118 \n",
"0 vertebral 240 6 12.5 0.25 0.0833 0 \n",
"0 vowels 1456 12 3.4341 0.4 0.35 0.1 \n",
"0 wbc 378 30 5.5556 0.2 0.4 0.6 \n",
"\n",
" LOF OCSVM PCA KPCA KPCA(SP) \n",
"0 0.4286 0.5 0.5 0.4643 0.5 \n",
"0 0.1282 0.5769 0.6538 0.3846 0.4231 \n",
"0 0 0 0 0 0 \n",
"0 0.75 0.6364 0.5909 0.7955 0.8182 \n",
"0 0.4419 0.1628 0.093 0.2093 0.186 \n",
"0 0.3264 0.3854 0.3785 0.3958 0.3785 \n",
"0 0.2553 1 1 0.4043 0.5106 \n",
"0 0.0781 0 0 0 0 \n",
"0 0.06 0.34 0.28 0.14 0.34 \n",
"0 0.3714 0.4762 0.4857 0.4952 0.5048 \n",
"0 0.3676 0.5244 0.464 0.5039 0.509 \n",
"0 0.0588 0.9412 0.8824 0.5 0.4118 \n",
"0 0.0833 0.0833 0 0.0833 0.0833 \n",
"0 0.25 0.15 0.1 0.2 0.2 \n",
"0 0.2 0.4 0.4 0.4 0.2 "
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"print('Precision @ n Performance')\n",
"prn_df"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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aNfZNc2sv5ndZmZ3FjySHZxIInblx/fSSy+lUaNGZGZmMnjwYI477jiqVq0aLZ85cyZr1qxhy5YtzJ49G4AhQ4aQk5PD8OHDueOOO7jnnnt45pln6NOnD/fe+0vnwe+++y7Tpk2jadOm9OvXj9mzZ/O73/1ul15rbm4uixYtolOnTgD07duX9957b4d1vvnmGz788EN69erF8OHDeemll6hTpw6zZs3aYb2ff/6Zjh07kp6eztFHH81dd90FxK/IjpWfn8+AAQNo06YNrVq14oEHHoiWrV27lt69e9OyZUtatWrF+++/DwTFeWlpaVx88cXRui+88AKPPfbYLr0nUs7iVTbEPgj6PXoJGEIwXvNNwE2JbJvMhyqaxd196NCh3rBhQ2/SpIkfcsghvvfee3v//v29bt26np+f7+7u7733np966qml7uvYY4/1Tz75pMj8cePG+aBBg3aYt2DBAr/00kt9w4YN0b4vueQSX7ZsWZHt58yZU6TCuLSK5uK2y8/P97p16/qnn37q7u7PPPOMn3vuuTtsc+mll/r8+fPd3b1Dhw6+bds2v+eee3zq1Kk7rLd9+3b/6aef3N09Ly/PO3bs6O+//37ciuxYEyZM8L59+7q7+8aNG71Jkya+cuVKd3e/+OKLffTo0e4eVOT/+OOPvnbtWj/55JPd3T0rK8sXL17smzZt8m7dunleXl6J74GUP8qhormRu/d194fcfXjBIylZSmQnPfDAA6xevZpVq1YxadIkunXrxoQJE+jatStTpkwBYNy4cZx99tlFtt20aRMbN24E4K233qJatWq0bt2aDRs2sGbNGiCoU/jHP/5By5Ytd9j2jjvuYNiwYeTn57Nt2zYAqlSpwqZNm0qM989//jONGjVi9erVpKWlRfUg2dnZO1RId+nShfPPP59Zs2bRqFEjZs6cSbVq1Rg9ejTnnXce6enpjB8/nocffjjaZuHChQC0a9cOgP79+9OmTRveffddunfvvkMcZsa+++4LBGf++fn5mFnciuzC227cuJGtW7eyefNmatSowX777ce6deuYO3cuWVlZANSoUYM6dersdF2MpFC8bBH7AJ4G2iSybkU+dKUghcWeWa9YscI7dOjgzZo18969e/vPP//s7u6vv/6633HHHe7uvnLlSj/yyCO9ZcuWftJJJ/mqVavc3f3bb7/1zMxMb9Om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zjvv5MADD2Tq1KnUrVuXFStWcNttt5V4H7OIVG6768lbot1gjwEeBU4AOhCMg9AhKRElWbVq1Rg+fDhLly5l3rx5PP744yxdupQhQ4Zw1113kZOTwz333FNsGWKtWrV4/vnn+eSTT5gxYwaDBw9m7dq1bN++nQEDBjBp0iQ+/vhjmjRpwrhx44Cg+fxHH33ElVdeyYsvvgjA7bffrm4kRKRSSrT4aJ27v5HUSCpI/fr1o47lateuTatWrfj6668xM9avXw/AunXropGhYh155JHR8wYNGlCvXj1yc3PJz8+nRo0a0fJTTjmFBx54gKysLKpUqcKWLVuilpJvv/02hx56KC1atKiAVyvy67a7no1XZokmhTlm9jDwKkHHeAC4+4L4m1R+q1atYuHChXTq1InHHnuM0047jZtvvpnt27cXO1h5rA8//JC8vLyoT6GtW7eSnZ1NZmYmU6ZM4auvvgLg97//PSeffDINGjTghRde4Pzzz2fSpEkV8fJERHZaosVHnQiKjO4HhoePok31fkU2bNjAeeedx2OPPcZ+++3HE088wYgRI/jqq68YMWIEWVlZcbdds2YNF110EWPHjqVKlSqYGZMmTeKGG26gY8eO1K5dm6pVqwLBVcP8+fP529/+xuuvv06PHj1YtmwZvXv35vLLL1f/QiJSqSTaeG2nuseu7PLz8znvvPO48MILo14Sx40bx8iRIwE4//zzueyyy4rddv369Zxxxhncd999dO7cOZp/7LHH8vbbQQPvN998k2XLlu2w3aZNm3juueei/tBfffVVpkyZwoQJE7j88suT8TJFRHZaQlcKZra/mT1aMAymmQ03s/2THVwyuDtZWVm0atWKG2/8ZWygBg0a8K9//QsI7iQqrsw/Ly+Pc845h4svvpjevXvvsOz7778HYMuWLTz44IM7jJEM8PDDD3PddddRvXr1uC0lRURSLdHio2eBn4A+4WM9MDZZQSXTu+++y/jx45k9e3Y02Mb06dMZPXo0N910E+np6dx22208/fTTQDA2csFVw+TJk5k7dy7PPfdctG3BeAUPP/wwrVq1Ii0tjTPPPJNu3bpFx4ztTwWIOvJ68skn6d+/f4W+/rL66quv6Nq1K61bt+boo4+OrqruvvtuGjZsuMN7WVi8AVMg/qApFT0EoYgEEmrRbGY57p5R2ryKtru2aK6Md1ys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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# https://dajiro.com/entry/2020/06/06/113437\n",
"def autolabel(rects):\n",
" for rect in rects:\n",
" height = rect.get_height()\n",
" ax.annotate('{:.4g}%'.format(height),\n",
" xy=(rect.get_x() + rect.get_width() / 2, height),\n",
" xytext=(0, 3),\n",
" textcoords=\"offset points\",\n",
" ha='center', va='bottom',\n",
" fontsize=10)\n",
"\n",
"fig, ax = plt.subplots(figsize = (6, 4))\n",
"label = [\"ABOD\", \"KNN\", \"LOF\", \"IForest\", \"OCSVM\", \"PCA\", \"KPCA\", \"KPCA(SP)\"]\n",
"prn = [prn_df[\"ABOD\"].mean(), prn_df[\"KNN\"].mean(), prn_df[\"LOF\"].mean(), prn_df[\"IForest\"].mean(), \n",
" prn_df[\"OCSVM\"].mean(), prn_df[\"PCA\"].mean(), prn_df[\"KPCA\"].mean(), prn_df[\"KPCA(SP)\"].mean()]\n",
"prn = np.array(prn) * 100\n",
"rect = ax.bar(label, prn, align=\"center\")\n",
"ax.set_ylabel(\"Precision @ n Performance (%)\")\n",
"ax.set_ylim(0, 100.0)\n",
"autolabel(rect)\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.9"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment