{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## New features in Isolation Forest: contamination ratio and using validation frame" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We will demonstrate how to use contamination parameter to get predicted labels out of an Isolation Forest model. We will also experiment with a new feature added the algorithm - using a validation frame to check quality of the model and do early stopping.\n", "\n", "Using validation frame is still an experimental feauture in active development. Please send us your feedback and we will try to incorporate your comments!\n", "\n", "Please also be careful about your conclusions based on experiments with this notebook. The notebook is intentionally not seeded and we encourage you to rerun the experiments several times to see how different random inputs changes the performance of the model." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import sys\n", "import h2o\n", "from h2o.frame import H2OFrame\n", "import numpy as np\n", "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Checking whether there is an H2O instance running at http://localhost:54321 . connected.\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
H2O_cluster_uptime:52 mins 37 secs
H2O_cluster_timezone:America/New_York
H2O_data_parsing_timezone:UTC
H2O_cluster_version:3.31.0.99999
H2O_cluster_version_age:53 minutes
H2O_cluster_name:mkurka
H2O_cluster_total_nodes:1
H2O_cluster_free_memory:3.276 Gb
H2O_cluster_total_cores:8
H2O_cluster_allowed_cores:8
H2O_cluster_status:locked, healthy
H2O_connection_url:http://localhost:54321
H2O_connection_proxy:{\"http\": null, \"https\": null}
H2O_internal_security:False
H2O_API_Extensions:Algos, AutoML, Core V3, TargetEncoder, Core V4
Python_version:2.7.14 final
" ], "text/plain": [ "-------------------------- ----------------------------------------------\n", "H2O_cluster_uptime: 52 mins 37 secs\n", "H2O_cluster_timezone: America/New_York\n", "H2O_data_parsing_timezone: UTC\n", "H2O_cluster_version: 3.31.0.99999\n", "H2O_cluster_version_age: 53 minutes\n", "H2O_cluster_name: mkurka\n", "H2O_cluster_total_nodes: 1\n", "H2O_cluster_free_memory: 3.276 Gb\n", "H2O_cluster_total_cores: 8\n", "H2O_cluster_allowed_cores: 8\n", "H2O_cluster_status: locked, healthy\n", "H2O_connection_url: http://localhost:54321\n", "H2O_connection_proxy: {\"http\": null, \"https\": null}\n", "H2O_internal_security: False\n", "H2O_API_Extensions: Algos, AutoML, Core V3, TargetEncoder, Core V4\n", "Python_version: 2.7.14 final\n", "-------------------------- ----------------------------------------------" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "h2o.init(strict_version_check=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Generate some synthetic data" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "N = 1000\n", "cont = 0.05 # ratio of outliers/anomalies" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "regular_data = np.random.normal(0, 0.5, (int(N*(1-cont)), 2))\n", "anomaly_data = np.column_stack((np.random.normal(-1.5, 1, int(N*cont)), np.random.normal(1.5, 1, int(N*cont))))" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.scatter(anomaly_data[:,0], anomaly_data[:,1])\n", "plt.scatter(regular_data[:,0], regular_data[:,1])\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": true }, "outputs": [], "source": [ "regular_pd = pd.DataFrame({'x': regular_data[:, 0], 'y': regular_data[:, 1], 'label': np.zeros(regular_data.shape[0])})\n", "anomaly_pd = pd.DataFrame({'x': anomaly_data[:, 0], 'y': anomaly_data[:, 1], 'label': np.ones(anomaly_data.shape[0])})" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Parse progress: |█████████████████████████████████████████████████████████| 100%\n" ] } ], "source": [ "dataset = H2OFrame(regular_pd.append(anomaly_pd).sample(frac=1))" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": true }, "outputs": [], "source": [ "train_with_label, test = dataset.split_frame([0.8])" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
label Count
0 756
1 39
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train_with_label[\"label\"].table()" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
label Count
0 194
1 11
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "test[\"label\"].table()" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": true }, "outputs": [], "source": [ "train = train_with_label.drop([\"label\"])\n", "test[\"label\"] = test[\"label\"].asfactor()" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from h2o.estimators.isolation_forest import H2OIsolationForestEstimator" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Train Isolation Forest with a validation set" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We will use validation frame and enable early stopping. The observations of validation frame are labeled and anomalies/outliers are marked with label \"1\", regular observations with \"0\". This lets us use binomial classification metrics to do early stopping. The model will calculate binomial metrics on the validation frame and use early stopping based on the performance observed on the validation data." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "isolationforest Model Build progress: |███████████████████████████████████| 100%\n" ] } ], "source": [ "if_model = H2OIsolationForestEstimator(seed=12, ntrees=200,\n", " score_tree_interval=7, stopping_rounds=3, stopping_metric=\"mean_per_class_error\",\n", " validation_response_column=\"label\")\n", "if_model.train(training_frame=train, validation_frame=test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The trained model will have different kind of metrics for training and validation frame. For training - where we don't have labeled data - anomaly metrics will be returned. For validation frame we will see binomial model metrics." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Model Details\n", "=============\n", "H2OIsolationForestEstimator : Isolation Forest\n", "Model Key: IsolationForest_model_python_1593529508000_107\n", "\n", "\n", "Model Summary: \n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
number_of_treesnumber_of_internal_treesmodel_size_in_bytesmin_depthmax_depthmean_depthmin_leavesmax_leavesmean_leaves
056.056.039085.08.08.08.025.078.050.767857
\n", "
" ], "text/plain": [ " number_of_trees number_of_internal_trees model_size_in_bytes \\\n", "0 56.0 56.0 39085.0 \n", "\n", " min_depth max_depth mean_depth min_leaves max_leaves mean_leaves \n", "0 8.0 8.0 8.0 25.0 78.0 50.767857 " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", "ModelMetricsAnomaly: isolationforest\n", "** Reported on train data. **\n", "\n", "Anomaly Score: 6.77065108782\n", "Normalized Anomaly Score: 0.0467037784801\n", "\n", "ModelMetricsBinomial: isolationforest\n", "** Reported on validation data. **\n", "\n", "MSE: 0.0547974682524\n", "RMSE: 0.234088590607\n", "LogLoss: 0.188428153792\n", "Mean Per-Class Error: 0.157919400187\n", "AUC: 0.832474226804\n", "AUCPR: 0.256449326499\n", "Gini: 0.664948453608\n", "\n", "Confusion Matrix (Act/Pred) for max f1 @ threshold = 0.145454545455: \n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
01ErrorRate
00184.010.00.0515(10.0/194.0)
114.07.00.3636(4.0/11.0)
2Total188.017.00.0683(14.0/205.0)
\n", "
" ], "text/plain": [ " 0 1 Error Rate\n", "0 0 184.0 10.0 0.0515 (10.0/194.0)\n", "1 1 4.0 7.0 0.3636 (4.0/11.0)\n", "2 Total 188.0 17.0 0.0683 (14.0/205.0)" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "Maximum Metrics: Maximum metrics at their respective thresholds\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
metricthresholdvalueidx
0max f10.1454550.50000013.0
1max f20.1454550.57377013.0
2max f0point50.1672730.47619010.0
3max accuracy0.7781820.9414630.0
4max precision0.1672730.46153810.0
5max recall0.0036361.00000046.0
6max specificity0.7781820.9948450.0
7max absolute_mcc0.1454550.47787513.0
8max min_per_class_accuracy0.0800000.81818225.0
9max mean_per_class_accuracy0.0800000.84208125.0
10max tns0.778182193.0000000.0
11max fns0.77818211.0000000.0
12max fps0.000000194.00000047.0
13max tps0.00363611.00000046.0
14max tnr0.7781820.9948450.0
15max fnr0.7781821.0000000.0
16max fpr0.0000001.00000047.0
17max tpr0.0036361.00000046.0
\n", "
" ], "text/plain": [ " metric threshold value idx\n", "0 max f1 0.145455 0.500000 13.0\n", "1 max f2 0.145455 0.573770 13.0\n", "2 max f0point5 0.167273 0.476190 10.0\n", "3 max accuracy 0.778182 0.941463 0.0\n", "4 max precision 0.167273 0.461538 10.0\n", "5 max recall 0.003636 1.000000 46.0\n", "6 max specificity 0.778182 0.994845 0.0\n", "7 max absolute_mcc 0.145455 0.477875 13.0\n", "8 max min_per_class_accuracy 0.080000 0.818182 25.0\n", "9 max mean_per_class_accuracy 0.080000 0.842081 25.0\n", "10 max tns 0.778182 193.000000 0.0\n", "11 max fns 0.778182 11.000000 0.0\n", "12 max fps 0.000000 194.000000 47.0\n", "13 max tps 0.003636 11.000000 46.0\n", "14 max tnr 0.778182 0.994845 0.0\n", "15 max fnr 0.778182 1.000000 0.0\n", "16 max fpr 0.000000 1.000000 47.0\n", "17 max tpr 0.003636 1.000000 46.0" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "Scoring History: \n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
timestampdurationnumber_of_treesmean_tree_path_lengthmean_anomaly_score
02020-06-30 11:57:470.001 sec0.0NaNNaN
12020-06-30 11:57:470.031 sec7.06.7779280.044414
22020-06-30 11:57:470.062 sec14.06.7644690.048492
32020-06-30 11:57:470.097 sec21.06.7690090.047557
42020-06-30 11:57:470.124 sec28.06.7634260.049805
52020-06-30 11:57:470.152 sec35.06.7705000.045900
62020-06-30 11:57:470.179 sec42.06.7725850.045267
72020-06-30 11:57:470.211 sec49.06.7705470.046268
82020-06-30 11:57:470.229 sec56.06.7706510.046704
\n", "
" ], "text/plain": [ " timestamp duration number_of_trees mean_tree_path_length \\\n", "0 2020-06-30 11:57:47 0.001 sec 0.0 NaN \n", "1 2020-06-30 11:57:47 0.031 sec 7.0 6.777928 \n", "2 2020-06-30 11:57:47 0.062 sec 14.0 6.764469 \n", "3 2020-06-30 11:57:47 0.097 sec 21.0 6.769009 \n", "4 2020-06-30 11:57:47 0.124 sec 28.0 6.763426 \n", "5 2020-06-30 11:57:47 0.152 sec 35.0 6.770500 \n", "6 2020-06-30 11:57:47 0.179 sec 42.0 6.772585 \n", "7 2020-06-30 11:57:47 0.211 sec 49.0 6.770547 \n", "8 2020-06-30 11:57:47 0.229 sec 56.0 6.770651 \n", "\n", " mean_anomaly_score \n", "0 NaN \n", "1 0.044414 \n", "2 0.048492 \n", "3 0.047557 \n", "4 0.049805 \n", "5 0.045900 \n", "6 0.045267 \n", "7 0.046268 \n", "8 0.046704 " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "if_model" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "isolationforest prediction progress: |████████████████████████████████████| 100%\n" ] }, { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
predict score mean_length
00.123636 6.39286
00 7
00.0145455 6.92857
10.421818 4.92857
00.0509091 6.75
00.0181818 6.91071
00 7
00.00727273 6.96429
00.134545 6.33929
00 7
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "predicted = if_model.predict(train)\n", "predicted.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The output incudes predicted class of the observation not anomaly/anomaly. This is accomplished by using the validation frame. In current implementation we pick the threshold to maximize the F1 score." ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": true }, "outputs": [], "source": [ "predicted_train_labels = predicted[\"predict\"].as_data_frame(use_pandas=True)\n", "train_pd = train.as_data_frame(use_pandas=True)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.scatter(train_pd[\"x\"], train_pd[\"y\"], c=predicted_train_labels[\"predict\"])\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "ModelMetricsBinomial: isolationforest\n", "** Reported on test data. **\n", "\n", "MSE: 0.0436448796715\n", "RMSE: 0.20891356986\n", "LogLoss: 0.138389352082\n", "Mean Per-Class Error: 0.105667480667\n", "AUC: 0.936440103107\n", "AUCPR: 0.348593089161\n", "Gini: 0.872880206214\n", "\n", "Confusion Matrix (Act/Pred) for max f1 @ threshold = 0.0909090909091: \n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
01ErrorRate
00692.064.00.0847(64.0/756.0)
118.031.00.2051(8.0/39.0)
2Total700.095.00.0906(72.0/795.0)
\n", "
" ], "text/plain": [ " 0 1 Error Rate\n", "0 0 692.0 64.0 0.0847 (64.0/756.0)\n", "1 1 8.0 31.0 0.2051 (8.0/39.0)\n", "2 Total 700.0 95.0 0.0906 (72.0/795.0)" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "Maximum Metrics: Maximum metrics at their respective thresholds\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
metricthresholdvalueidx
0max f10.0909090.46268753.0
1max f20.0763640.62977156.0
2max f0point50.1381820.40636041.0
3max accuracy0.9272730.9534591.0
4max precision1.0000001.0000000.0
5max recall0.0181821.00000072.0
6max specificity1.0000001.0000000.0
7max absolute_mcc0.0763640.47627356.0
8max min_per_class_accuracy0.0654550.87179559.0
9max mean_per_class_accuracy0.0436360.89433365.0
10max tns1.000000756.0000000.0
11max fns1.00000038.0000000.0
12max fps0.000000756.00000077.0
13max tps0.01818239.00000072.0
14max tnr1.0000001.0000000.0
15max fnr1.0000000.9743590.0
16max fpr0.0000001.00000077.0
17max tpr0.0181821.00000072.0
\n", "
" ], "text/plain": [ " metric threshold value idx\n", "0 max f1 0.090909 0.462687 53.0\n", "1 max f2 0.076364 0.629771 56.0\n", "2 max f0point5 0.138182 0.406360 41.0\n", "3 max accuracy 0.927273 0.953459 1.0\n", "4 max precision 1.000000 1.000000 0.0\n", "5 max recall 0.018182 1.000000 72.0\n", "6 max specificity 1.000000 1.000000 0.0\n", "7 max absolute_mcc 0.076364 0.476273 56.0\n", "8 max min_per_class_accuracy 0.065455 0.871795 59.0\n", "9 max mean_per_class_accuracy 0.043636 0.894333 65.0\n", "10 max tns 1.000000 756.000000 0.0\n", "11 max fns 1.000000 38.000000 0.0\n", "12 max fps 0.000000 756.000000 77.0\n", "13 max tps 0.018182 39.000000 72.0\n", "14 max tnr 1.000000 1.000000 0.0\n", "15 max fnr 1.000000 0.974359 0.0\n", "16 max fpr 0.000000 1.000000 77.0\n", "17 max tpr 0.018182 1.000000 72.0" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "if_model.model_performance(train_with_label)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Train Isolation Forest using contamination parameter" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/mkurka/git/h2o/h2o-3/h2o-py/h2o/estimators/estimator_base.py:200: RuntimeWarning: Stopping tolerance is ignored for _stopping_rounds=0.\n", " warnings.warn(mesg[\"message\"], RuntimeWarning)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "isolationforest Model Build progress: |███████████████████████████████████| 100%\n", "Model Details\n", "=============\n", "H2OIsolationForestEstimator : Isolation Forest\n", "Model Key: IsolationForest_model_python_1593529508000_108\n", "\n", "\n", "Model Summary: \n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
number_of_treesnumber_of_internal_treesmodel_size_in_bytesmin_depthmax_depthmean_depthmin_leavesmax_leavesmean_leaves
050.050.034937.08.08.08.025.078.050.84
\n", "
" ], "text/plain": [ " number_of_trees number_of_internal_trees model_size_in_bytes \\\n", "0 50.0 50.0 34937.0 \n", "\n", " min_depth max_depth mean_depth min_leaves max_leaves mean_leaves \n", "0 8.0 8.0 8.0 25.0 78.0 50.84 " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", "ModelMetricsAnomaly: isolationforest\n", "** Reported on train data. **\n", "\n", "Anomaly Score: 6.77064148276\n", "Normalized Anomaly Score: 0.0458717034484\n", "\n", "Scoring History: \n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
timestampdurationnumber_of_treesmean_tree_path_lengthmean_anomaly_score
02020-06-30 11:57:480.003 sec0.0NaNNaN
12020-06-30 11:57:480.012 sec1.06.8645040.019357
22020-06-30 11:57:480.034 sec2.06.8513710.027023
32020-06-30 11:57:480.057 sec3.06.8204790.029920
42020-06-30 11:57:480.080 sec4.06.8050210.038996
52020-06-30 11:57:480.092 sec5.06.8077120.035609
62020-06-30 11:57:480.100 sec6.06.7831650.043367
72020-06-30 11:57:480.108 sec7.06.7779280.044414
82020-06-30 11:57:480.115 sec8.06.7764960.048325
92020-06-30 11:57:480.127 sec9.06.7825950.044469
102020-06-30 11:57:480.142 sec10.06.7838530.043229
112020-06-30 11:57:480.151 sec11.06.7831530.045006
122020-06-30 11:57:480.161 sec12.06.7856370.042873
132020-06-30 11:57:480.171 sec13.06.7736680.046703
142020-06-30 11:57:480.180 sec14.06.7644690.048492
152020-06-30 11:57:480.188 sec15.06.7664260.046715
162020-06-30 11:57:480.197 sec16.06.7691730.045039
172020-06-30 11:57:480.204 sec17.06.7637070.048397
182020-06-30 11:57:480.212 sec18.06.7687590.046248
192020-06-30 11:57:480.221 sec19.06.7699600.048030
\n", "
" ], "text/plain": [ " timestamp duration number_of_trees mean_tree_path_length \\\n", "0 2020-06-30 11:57:48 0.003 sec 0.0 NaN \n", "1 2020-06-30 11:57:48 0.012 sec 1.0 6.864504 \n", "2 2020-06-30 11:57:48 0.034 sec 2.0 6.851371 \n", "3 2020-06-30 11:57:48 0.057 sec 3.0 6.820479 \n", "4 2020-06-30 11:57:48 0.080 sec 4.0 6.805021 \n", "5 2020-06-30 11:57:48 0.092 sec 5.0 6.807712 \n", "6 2020-06-30 11:57:48 0.100 sec 6.0 6.783165 \n", "7 2020-06-30 11:57:48 0.108 sec 7.0 6.777928 \n", "8 2020-06-30 11:57:48 0.115 sec 8.0 6.776496 \n", "9 2020-06-30 11:57:48 0.127 sec 9.0 6.782595 \n", "10 2020-06-30 11:57:48 0.142 sec 10.0 6.783853 \n", "11 2020-06-30 11:57:48 0.151 sec 11.0 6.783153 \n", "12 2020-06-30 11:57:48 0.161 sec 12.0 6.785637 \n", "13 2020-06-30 11:57:48 0.171 sec 13.0 6.773668 \n", "14 2020-06-30 11:57:48 0.180 sec 14.0 6.764469 \n", "15 2020-06-30 11:57:48 0.188 sec 15.0 6.766426 \n", "16 2020-06-30 11:57:48 0.197 sec 16.0 6.769173 \n", "17 2020-06-30 11:57:48 0.204 sec 17.0 6.763707 \n", "18 2020-06-30 11:57:48 0.212 sec 18.0 6.768759 \n", "19 2020-06-30 11:57:48 0.221 sec 19.0 6.769960 \n", "\n", " mean_anomaly_score \n", "0 NaN \n", "1 0.019357 \n", "2 0.027023 \n", "3 0.029920 \n", "4 0.038996 \n", "5 0.035609 \n", "6 0.043367 \n", "7 0.044414 \n", "8 0.048325 \n", "9 0.044469 \n", "10 0.043229 \n", "11 0.045006 \n", "12 0.042873 \n", "13 0.046703 \n", "14 0.048492 \n", "15 0.046715 \n", "16 0.045039 \n", "17 0.048397 \n", "18 0.046248 \n", "19 0.048030 " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "See the whole table with table.as_data_frame()\n" ] }, { "data": { "text/plain": [] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "if_model_cont = H2OIsolationForestEstimator(seed=12, contamination=cont)\n", "if_model_cont.train(training_frame=train)\n", "if_model_cont" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "isolationforest prediction progress: |████████████████████████████████████| 100%\n" ] } ], "source": [ "predicted_train_labels_cont = if_model_cont.predict(train)[\"predict\"].as_data_frame(use_pandas=True)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.scatter(train_pd[\"x\"], train_pd[\"y\"], c=predicted_train_labels_cont[\"predict\"])\n", "plt.show()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.14" } }, "nbformat": 4, "nbformat_minor": 2 }