{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "predictive_maintenance_grid_search_atds_v4_nov2021.ipynb", "provenance": [], "collapsed_sections": [] }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "language_info": { "name": "python" } }, "cells": [ { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "id": "xipxpNzPAl8f", "outputId": "774200e0-fe4c-4a48-bab6-f9719f204236" }, "source": [ "\n", "!pip install -I numpy==1.19.2\n", "!pip install snowflake-connector-python\n", "import warnings\n", "warnings.filterwarnings(\"ignore\")\n", "!pip install -I pyarrow==5.0.0\n", "!pip install git+https://github.com/pattersonconsulting/ml_tools.git" ], "execution_count": 1, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Collecting numpy==1.19.2\n", " Downloading numpy-1.19.2-cp37-cp37m-manylinux2010_x86_64.whl (14.5 MB)\n", "\u001b[K |████████████████████████████████| 14.5 MB 10.8 MB/s \n", "\u001b[?25hInstalling collected packages: numpy\n", "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", "datascience 0.10.6 requires folium==0.2.1, but you have folium 0.8.3 which is incompatible.\n", "albumentations 0.1.12 requires imgaug<0.2.7,>=0.2.5, but you have imgaug 0.2.9 which is incompatible.\u001b[0m\n", "Successfully installed numpy-1.19.5\n" ] }, { "output_type": "display_data", "data": { "application/vnd.colab-display-data+json": { "pip_warning": { "packages": [ "numpy" ] } } }, "metadata": {} }, { "output_type": "stream", "name": "stdout", "text": [ "Collecting snowflake-connector-python\n", " Downloading snowflake_connector_python-2.7.1-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (14.9 MB)\n", "\u001b[K |████████████████████████████████| 14.9 MB 12.4 MB/s \n", "\u001b[?25hCollecting asn1crypto<2.0.0,>0.24.0\n", " Downloading asn1crypto-1.4.0-py2.py3-none-any.whl (104 kB)\n", "\u001b[K |████████████████████████████████| 104 kB 73.7 MB/s \n", "\u001b[?25hCollecting oscrypto<2.0.0\n", " Downloading oscrypto-1.2.1-py2.py3-none-any.whl (192 kB)\n", "\u001b[K |████████████████████████████████| 192 kB 85.6 MB/s \n", "\u001b[?25hRequirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.7/dist-packages (from snowflake-connector-python) (2.10)\n", "Collecting pyOpenSSL<21.0.0,>=16.2.0\n", " Downloading pyOpenSSL-20.0.1-py2.py3-none-any.whl (54 kB)\n", "\u001b[K |████████████████████████████████| 54 kB 2.2 MB/s \n", "\u001b[?25hRequirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from snowflake-connector-python) (2021.10.8)\n", "Requirement already satisfied: setuptools>34.0.0 in /usr/local/lib/python3.7/dist-packages (from snowflake-connector-python) (57.4.0)\n", "Collecting pycryptodomex!=3.5.0,<4.0.0,>=3.2\n", " Downloading pycryptodomex-3.11.0-cp35-abi3-manylinux2010_x86_64.whl (1.9 MB)\n", "\u001b[K |████████████████████████████████| 1.9 MB 66.5 MB/s \n", "\u001b[?25hRequirement already satisfied: charset-normalizer~=2.0.0 in /usr/local/lib/python3.7/dist-packages (from snowflake-connector-python) (2.0.7)\n", "Collecting cryptography<4.0.0,>=3.1.0\n", " Downloading cryptography-3.4.8-cp36-abi3-manylinux_2_24_x86_64.whl (3.0 MB)\n", "\u001b[K |████████████████████████████████| 3.0 MB 16.3 MB/s \n", "\u001b[?25hRequirement already satisfied: requests<3.0.0 in /usr/local/lib/python3.7/dist-packages (from snowflake-connector-python) (2.23.0)\n", "Collecting pyjwt<3.0.0\n", " Downloading PyJWT-2.3.0-py3-none-any.whl (16 kB)\n", "Requirement already satisfied: cffi<2.0.0,>=1.9 in /usr/local/lib/python3.7/dist-packages (from snowflake-connector-python) (1.15.0)\n", "Requirement already satisfied: pytz in /usr/local/lib/python3.7/dist-packages (from snowflake-connector-python) (2018.9)\n", "Requirement already satisfied: pycparser in /usr/local/lib/python3.7/dist-packages (from cffi<2.0.0,>=1.9->snowflake-connector-python) (2.21)\n", "Requirement already satisfied: six>=1.5.2 in /usr/local/lib/python3.7/dist-packages (from pyOpenSSL<21.0.0,>=16.2.0->snowflake-connector-python) (1.15.0)\n", "Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests<3.0.0->snowflake-connector-python) (3.0.4)\n", "Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests<3.0.0->snowflake-connector-python) (1.24.3)\n", "Installing collected packages: cryptography, asn1crypto, pyOpenSSL, pyjwt, pycryptodomex, oscrypto, snowflake-connector-python\n", "Successfully installed asn1crypto-1.4.0 cryptography-3.4.8 oscrypto-1.2.1 pyOpenSSL-20.0.1 pycryptodomex-3.11.0 pyjwt-2.3.0 snowflake-connector-python-2.7.1\n", "Collecting pyarrow==5.0.0\n", " Downloading pyarrow-5.0.0-cp37-cp37m-manylinux2014_x86_64.whl (23.6 MB)\n", "\u001b[K |████████████████████████████████| 23.6 MB 1.2 MB/s \n", "\u001b[?25hCollecting numpy>=1.16.6\n", " Downloading numpy-1.21.4-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (15.7 MB)\n", "\u001b[K |████████████████████████████████| 15.7 MB 48.4 MB/s \n", "\u001b[?25hInstalling collected packages: numpy, pyarrow\n", "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", "yellowbrick 1.3.post1 requires numpy<1.20,>=1.16.0, but you have numpy 1.21.4 which is incompatible.\n", "datascience 0.10.6 requires folium==0.2.1, but you have folium 0.8.3 which is incompatible.\n", "albumentations 0.1.12 requires imgaug<0.2.7,>=0.2.5, but you have imgaug 0.2.9 which is incompatible.\u001b[0m\n", "Successfully installed numpy-1.21.4 pyarrow-5.0.0\n" ] }, { "output_type": "display_data", "data": { "application/vnd.colab-display-data+json": { "pip_warning": { "packages": [ "numpy" ] } } }, "metadata": {} }, { "output_type": "stream", "name": "stdout", "text": [ "Collecting git+https://github.com/pattersonconsulting/ml_tools.git\n", " Cloning https://github.com/pattersonconsulting/ml_tools.git to /tmp/pip-req-build-pxdcfi1a\n", " Running command git clone -q https://github.com/pattersonconsulting/ml_tools.git /tmp/pip-req-build-pxdcfi1a\n", "Requirement already satisfied: pandas in /usr/local/lib/python3.7/dist-packages (from ml-valuation==0.0.1) (1.1.5)\n", "Requirement already satisfied: sklearn in /usr/local/lib/python3.7/dist-packages (from ml-valuation==0.0.1) (0.0)\n", "Requirement already satisfied: matplotlib in /usr/local/lib/python3.7/dist-packages (from ml-valuation==0.0.1) (3.2.2)\n", "Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from ml-valuation==0.0.1) (1.21.4)\n", "Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib->ml-valuation==0.0.1) (2.8.2)\n", "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/dist-packages (from matplotlib->ml-valuation==0.0.1) (0.11.0)\n", "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib->ml-valuation==0.0.1) (1.3.2)\n", "Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib->ml-valuation==0.0.1) (3.0.6)\n", "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.7/dist-packages (from python-dateutil>=2.1->matplotlib->ml-valuation==0.0.1) (1.15.0)\n", "Requirement already satisfied: pytz>=2017.2 in /usr/local/lib/python3.7/dist-packages (from pandas->ml-valuation==0.0.1) (2018.9)\n", "Requirement already satisfied: scikit-learn in /usr/local/lib/python3.7/dist-packages (from sklearn->ml-valuation==0.0.1) (1.0.1)\n", "Requirement already satisfied: threadpoolctl>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from scikit-learn->sklearn->ml-valuation==0.0.1) (3.0.0)\n", "Requirement already satisfied: joblib>=0.11 in /usr/local/lib/python3.7/dist-packages (from scikit-learn->sklearn->ml-valuation==0.0.1) (1.1.0)\n", "Requirement already satisfied: scipy>=1.1.0 in /usr/local/lib/python3.7/dist-packages (from scikit-learn->sklearn->ml-valuation==0.0.1) (1.4.1)\n", "Building wheels for collected packages: ml-valuation\n", " Building wheel for ml-valuation (setup.py) ... \u001b[?25l\u001b[?25hdone\n", " Created wheel for ml-valuation: filename=ml_valuation-0.0.1-py3-none-any.whl size=8800 sha256=206661f3f75698901c0c074a57ff1b75fa5768e41e87d9ec538fe360c980cb6a\n", " Stored in directory: /tmp/pip-ephem-wheel-cache-y8az2rma/wheels/ce/52/e8/5f5de6a3a97eca5d2f9e453ecafb0f88f99054a1f2601f637e\n", "Successfully built ml-valuation\n", "Installing collected packages: ml-valuation\n", "Successfully installed ml-valuation-0.0.1\n" ] } ] }, { "cell_type": "code", "metadata": { "id": "L0MjBet4Ravf" }, "source": [ "# import basic data science libraries\n", "\n", "import pandas as pd\n", "import numpy as np\n", "from matplotlib import pyplot as plt\n", "import seaborn as sns\n", "from matplotlib.patches import Patch\n", "from matplotlib.lines import Line2D\n", "%matplotlib inline" ], "execution_count": 2, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "l2Nkk0_xAPYU" }, "source": [ "import sklearn_pandas\n", "from sklearn_pandas import DataFrameMapper, cross_val_score" ], "execution_count": 3, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "U3i_PN8URs-h", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "51bc12a7-e88e-426e-9288-098bd776ea73" }, "source": [ "\n", "# import required machine learning libraries\n", "\n", "from sklearn.linear_model import LogisticRegression\n", "from sklearn.discriminant_analysis import LinearDiscriminantAnalysis\n", "from sklearn.svm import SVC\n", "from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier\n", "from sklearn.model_selection import KFold, cross_val_score, GridSearchCV, train_test_split\n", "from sklearn.metrics import accuracy_score, classification_report, confusion_matrix\n", "from sklearn.metrics import average_precision_score\n", "from sklearn.metrics import precision_recall_curve\n", "from sklearn.metrics import plot_precision_recall_curve\n", "from sklearn.metrics import roc_curve, auc, confusion_matrix\n", "\n", "\n", "import sklearn.preprocessing, sklearn.decomposition, sklearn.linear_model, sklearn.pipeline, sklearn.metrics\n", "from sklearn.preprocessing import Normalizer, StandardScaler\n", "\n", "!pip install scikit-plot\n", "import scikitplot as skplt\n", "\n", "# classifiers\n", "from sklearn.ensemble import GradientBoostingClassifier\n", "from xgboost import XGBClassifier\n", "import lightgbm as lgb\n", "\n", "import warnings\n", "from sklearn.exceptions import DataConversionWarning\n", "warnings.filterwarnings(action='ignore', category=DataConversionWarning)\n", "\n", "import ml_valuation\n", "\n", "from ml_valuation import model_valuation\n", "from ml_valuation import model_visualization" ], "execution_count": 4, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Collecting scikit-plot\n", " Downloading scikit_plot-0.3.7-py3-none-any.whl (33 kB)\n", "Requirement already satisfied: joblib>=0.10 in /usr/local/lib/python3.7/dist-packages (from scikit-plot) (1.1.0)\n", "Requirement already satisfied: scipy>=0.9 in /usr/local/lib/python3.7/dist-packages (from scikit-plot) (1.4.1)\n", "Requirement already satisfied: matplotlib>=1.4.0 in /usr/local/lib/python3.7/dist-packages (from scikit-plot) (3.2.2)\n", "Requirement already satisfied: scikit-learn>=0.18 in /usr/local/lib/python3.7/dist-packages (from scikit-plot) (1.0.1)\n", "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib>=1.4.0->scikit-plot) (1.3.2)\n", "Requirement already satisfied: numpy>=1.11 in /usr/local/lib/python3.7/dist-packages (from matplotlib>=1.4.0->scikit-plot) (1.21.4)\n", "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/dist-packages (from matplotlib>=1.4.0->scikit-plot) (0.11.0)\n", "Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib>=1.4.0->scikit-plot) (3.0.6)\n", "Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib>=1.4.0->scikit-plot) (2.8.2)\n", "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.7/dist-packages (from python-dateutil>=2.1->matplotlib>=1.4.0->scikit-plot) (1.15.0)\n", "Requirement already satisfied: threadpoolctl>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from scikit-learn>=0.18->scikit-plot) (3.0.0)\n", "Installing collected packages: scikit-plot\n", "Successfully installed scikit-plot-0.3.7\n" ] } ] }, { "cell_type": "code", "metadata": { "id": "SxcPzQwFR9Pk" }, "source": [ "#df = pd.read_csv(\"https://archive.ics.uci.edu/ml/machine-learning-databases/00601/ai4i2020.csv\")\n", "#print( df.head() )\n", "\n", "#print( df.info() )\n", "import snowflake.connector\n", "import getpass\n", "\n", "# using a simpler way to use your login info without embedding it in the notebook \n", "# other enterprise connection patterns (e.g., SSO) are in the Snowflake docs: https://docs.snowflake.com/en/user-guide/python-connector-example.html\n", "snowflake_username = getpass.getpass(\"Enter Snowflake Username\")\n", "snowflake_pwd = getpass.getpass(\"Enter Snowflake Password\")\n", "snowflake_acct = 'nna57244.us-east-1'\n", "\n", "print(snowflake_username)\n", "print(snowflake_acct)\n" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "tOUWxQAy9iqH", "outputId": "bcae8571-4ca2-4b5c-b550-b078e9cf755a" }, "source": [ "\n", "ctx = snowflake.connector.connect(\n", " user=snowflake_username,\n", " password=snowflake_pwd,\n", " account=snowflake_acct\n", " )\n", "cs = ctx.cursor()\n", "try:\n", "\tcs.execute(\"SELECT current_version()\")\n", "\tone_row = cs.fetchone()\n", "\tprint(one_row[0])\n", "\n", "\n", "\n", "\t#cs.cursor().execute(\"USE WAREHOUSE tiny_warehouse_mg\")\n", "\tcs.execute(\"USE DATABASE PREDICTIVE_MAINTENANCE\") \n", "\n", "\n", "\t#cs.execute(\"SELECT count(TYPE) from RAW_DEVICE_DATA where MACHINE_FAILURE = 1;\")\n", "\t#one_row = cs.fetchone()\n", "\t#print(\"Records with Failures: \" + str(one_row[0]))\n", "\n", "\tquery_output = cs.execute( \"select TYPE, AIR_TEMPERATURE, PROCESS_TEMPERATURE, ROTATIONAL_SPEED, TORQUE, TOOL_WEAR, MACHINE_FAILURE from SUMMARY_SENSOR_DATA;\" )\n", "\n", "\tdf = query_output.fetch_pandas_all() #.to_csv(\"/path/to/write/table.csv\")\t\n", "\t#df.to_csv(\"./data/full_snowflake_dataset.csv\", index=False)\t\n", "\n", "\tprint( df )\n", "\n", "\n", "finally:\n", " cs.close()\n", "\n", "\n", "\n", "ctx.close()" ], "execution_count": 6, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "5.41.1\n", " TYPE AIR_TEMPERATURE ... TOOL_WEAR MACHINE_FAILURE\n", "0 M 298.1 ... 0.0 0\n", "1 L 298.2 ... 3.0 0\n", "2 L 298.1 ... 5.0 0\n", "3 L 298.2 ... 7.0 0\n", "4 L 298.2 ... 9.0 0\n", "... ... ... ... ... ...\n", "5245 M 298.8 ... 14.0 0\n", "5246 H 298.9 ... 17.0 0\n", "5247 M 299.0 ... 22.0 0\n", "5248 H 299.0 ... 25.0 0\n", "5249 M 299.0 ... 30.0 0\n", "\n", "[10000 rows x 7 columns]\n" ] } ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 204 }, "id": "gKMs7_wySFaD", "outputId": "cb7b48b2-69d4-4bb7-8395-b52527381581" }, "source": [ "# map categorical variable 'diagnosis' into numeric\n", "\n", "df[\"TYPE\"] = df[\"TYPE\"].map({'H': 2, 'M': 1, 'L': 0})\n", "\n", "df.head()\n", "\n" ], "execution_count": 7, "outputs": [ { "output_type": "execute_result", "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", "
TYPEAIR_TEMPERATUREPROCESS_TEMPERATUREROTATIONAL_SPEEDTORQUETOOL_WEARMACHINE_FAILURE
01298.1308.61551.042.80.00
10298.2308.71408.046.33.00
20298.1308.51498.049.45.00
30298.2308.61433.039.57.00
40298.2308.71408.040.09.00
\n", "
" ], "text/plain": [ " TYPE AIR_TEMPERATURE ... TOOL_WEAR MACHINE_FAILURE\n", "0 1 298.1 ... 0.0 0\n", "1 0 298.2 ... 3.0 0\n", "2 0 298.1 ... 5.0 0\n", "3 0 298.2 ... 7.0 0\n", "4 0 298.2 ... 9.0 0\n", "\n", "[5 rows x 7 columns]" ] }, "metadata": {}, "execution_count": 7 } ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "IdTkpvu-S1_Z", "outputId": "6cef503b-764c-47fe-ca3c-ddd29ae8ef45" }, "source": [ "df['MACHINE_FAILURE'].value_counts(normalize=True) * 100\n" ], "execution_count": 8, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "0 96.61\n", "1 3.39\n", "Name: MACHINE_FAILURE, dtype: float64" ] }, "metadata": {}, "execution_count": 8 } ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "R9RKqWEvY354", "outputId": "aa951427-ce25-406f-89d3-ea70f256dc18" }, "source": [ "train_ratio = 0.75\n", "validation_ratio = 0.15\n", "test_ratio = 0.10\n", "\n", "df_full = df.copy()\n", "\n", "y_train_full = df_full.pop(\"MACHINE_FAILURE\")\n", "\n", "y_train_full = pd.DataFrame(y_train_full)\n", "\n", "column_types = { \"TYPE\": \"categorical\", \"AIR_TEMPERATURE\" : \"numerical\", \"PROCESS_TEMPERATURE\" : \"numerical\", \"ROTATIONAL_SPEED\" : \"numerical\", \"TORQUE\" : \"numerical\", \"TOOL_WEAR\" : \"numerical\" }\n", "numerical_cols = [\n", " 'AIR_TEMPERATURE', 'PROCESS_TEMPERATURE', 'ROTATIONAL_SPEED', 'TORQUE', 'TOOL_WEAR'\n", "]\n", "categorical_cols = [\n", " 'TYPE'\n", "]\n", "\n", "x_train_mapper = DataFrameMapper([\n", " ('TYPE', sklearn.preprocessing.LabelBinarizer()),\n", " (['AIR_TEMPERATURE'], sklearn.preprocessing.StandardScaler()),\n", " (['PROCESS_TEMPERATURE'], sklearn.preprocessing.StandardScaler()),\n", " (['ROTATIONAL_SPEED'], sklearn.preprocessing.StandardScaler()),\n", " (['TORQUE'], sklearn.preprocessing.StandardScaler()),\n", " (['TOOL_WEAR'], sklearn.preprocessing.StandardScaler())\n", " ], df_out=True)\n", "\n", "df_full_scaled = x_train_mapper.fit_transform(df_full.copy())\n", "\n", "x_train_scaled, x_test_scaled, y_train_scaled, y_test_scaled = train_test_split(df_full_scaled, y_train_full, test_size=1 - train_ratio)\n", "\n", "#x_val_scaled, x_test_scaled, y_val_scaled, y_test_scaled = train_test_split(x_test_scaled, y_test_scaled, test_size=test_ratio/(test_ratio + validation_ratio)) \n", "\n", "\n", "# train is now 75% of the entire data set\n", "# the _junk suffix means that we drop that variable completely\n", "#x_train, x_test, y_train, y_test = train_test_split(df_full, y_train_full, test_size=1 - train_ratio)\n", "\n", "# test is now 10% of the initial data set\n", "# validation is now 15% of the initial data set\n", "#x_val, x_test, y_val, y_test = train_test_split(x_test, y_test, test_size=test_ratio/(test_ratio + validation_ratio)) \n", "\n", "print(\"original dataset \")\n", "print(df_full.head())\n", "\n", "print(\"df_full_scaled dataset \")\n", "print(df_full_scaled.head())\n", "\n", "#print(\"x_train dataset \")\n", "#print(x_train.head())\n", "\n", "print(\"x_train_scaled:\")\n", "print(x_train_scaled.head())\n", "\n", "#print(x_train, x_val, x_test)\n", "\n", "#print(y_train, y_val, y_test)" ], "execution_count": 9, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "original dataset \n", " TYPE AIR_TEMPERATURE ... TORQUE TOOL_WEAR\n", "0 1 298.1 ... 42.8 0.0\n", "1 0 298.2 ... 46.3 3.0\n", "2 0 298.1 ... 49.4 5.0\n", "3 0 298.2 ... 39.5 7.0\n", "4 0 298.2 ... 40.0 9.0\n", "\n", "[5 rows x 6 columns]\n", "df_full_scaled dataset \n", " TYPE_0 TYPE_1 TYPE_2 ... ROTATIONAL_SPEED TORQUE TOOL_WEAR\n", "0 0 1 0 ... 0.068185 0.282200 -1.695984\n", "1 1 0 0 ... -0.729472 0.633308 -1.648852\n", "2 1 0 0 ... -0.227450 0.944290 -1.617430\n", "3 1 0 0 ... -0.590021 -0.048845 -1.586009\n", "4 1 0 0 ... -0.729472 0.001313 -1.554588\n", "\n", "[5 rows x 8 columns]\n", "x_train_scaled:\n", " TYPE_0 TYPE_1 TYPE_2 ... ROTATIONAL_SPEED TORQUE TOOL_WEAR\n", "268 0 1 0 ... 0.453068 -0.339763 -0.439129\n", "1249 1 0 0 ... -0.400368 -0.319700 1.697523\n", "1661 0 1 0 ... -0.712737 0.723593 0.943411\n", "2282 1 0 0 ... 1.027604 -0.901537 -0.549104\n", "2038 1 0 0 ... -0.517507 0.322326 1.838920\n", "\n", "[5 rows x 8 columns]\n" ] } ] }, { "cell_type": "markdown", "metadata": { "id": "fF0D90SzwEhD" }, "source": [ "Let's make a Dummy Classifier that always chooses the Majority Class to baseline against" ] }, { "cell_type": "code", "metadata": { "id": "bmBR4WqqrTkv" }, "source": [ "def calculate_cv_standard_error_ci(cv, model, X, y, k, top_N_predictions):\n", "\n", " stats = list()\n", "\n", " for i, (train_index, test_index) in enumerate(cv.split(X, y)):\n", "\n", " # convert the data indexes into references\n", " Xtrain, Xtest = X.iloc[train_index], X.iloc[test_index]\n", " ytrain, ytest = y.iloc[train_index], y.iloc[test_index]\n", "\n", " print(\"Running CV Fold-\" + str(i))\n", "\n", " # fit the model on the training data (Xtrain) and labels (ytrain)\n", " model.fit( Xtrain, ytrain.values.ravel() )\n", "\n", " # now get the probabilites of the predictions for the text input (data: Xtest, labels: ytest)\n", " probas_ = model.predict_proba( Xtest )\n", " prediction_est_prob = probas_[:, 1]\n", "\n", " scmtrx_lr_full_testset = model_valuation.standard_confusion_matrix_for_n_ranked_instances(ytest, prediction_est_prob, 0.1, top_N_predictions)\n", "\n", " [[tp, fp], [fn, tn]] = scmtrx_lr_full_testset\n", "\n", " total_predictions = (tp + tn + fp + fn)\n", "\n", " acc_top_N_predictions = (tp + tn) / (tp + tn + fp + fn)\n", "\n", " stats.append(acc_top_N_predictions)\n", " \n", " ''' \n", " print(\"Logistic Regression (full test set): \")\n", " print(\"total_predictions: \" + str(total_predictions))\n", " print(\"TP: \" + str(tp))\n", " print(\"TN: \" + str(tn))\n", " print(\"FP: \" + str(fp))\n", " print(\"FN: \" + str(fn))\n", " '''\n", "\n", " mean_score = np.mean(stats)\n", " std_dev_score = np.std(stats)\n", " standard_error_score = (1/np.sqrt(k)) * std_dev_score\n", "\n", " # https://en.wikipedia.org/wiki/Standard_error#:~:text=Assumptions%20and%20usage%5Bedit%5D\n", " # https://en.wikipedia.org/wiki/1.96\n", " # 95% of values will lie within ±1.96\n", " ci_95 = 1.96 * standard_error_score\n", " #print(\"CI Ranges 95%:\")\n", "\n", " low_end_range = mean_score - ci_95\n", " high_end_range = mean_score + ci_95\n", "\n", " return mean_score, std_dev_score, standard_error_score, ci_95, low_end_range, high_end_range\n" ], "execution_count": 10, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "aQhOApxXUiyP" }, "source": [ "from sklearn.dummy import DummyClassifier\n", "from sklearn.model_selection import KFold, train_test_split, RandomizedSearchCV, StratifiedKFold\n", "\n", "\n", "k = 10\n", "cv = StratifiedKFold( n_splits=k )\n", "\n", "top_N_accuracy = 18\n", "\n", "min_topN_accuracy = 0.61\n", "target_topN_accuracy = 0.78\n", "\n", "X = df_full_scaled\n", "y = y_train_full\n" ], "execution_count": 11, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "KheuxJawwLm1" }, "source": [ "so notice we have high accuracy with this model? its because it always predicts the majority class (no failure), but never captures a TP\n", "\n", "This is a great example of how accuracy in some contexts can be misleading.\n", "\n", "Now let's move on and try a better baseline model with Logistic Regression." ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "qZhzZLcptVM-", "outputId": "1f58f184-6265-4038-99f8-c18248d1996f" }, "source": [ "dummy_model = DummyClassifier(strategy='most_frequent',random_state=0)\n", "\n", "\n", "# test method for cv-se-ci\n", "mean_score2, std_dev_score2, standard_error_score2, ci_95_2, low_end_range2, high_end_range2 = calculate_cv_standard_error_ci(cv, dummy_model, X, y, k, top_N_accuracy)\n", "\n", "print(\"\\n\\navg top 18 acc: \" + str(\"{:.4f}\".format(mean_score2)))\n", "print(\"\\n\\nSTD DEV: \" + str(std_dev_score2))\n", "print(\"\\n\\nStandard Error (Accuracy) Across All Folds: ( \" + str(\"{:.4f}\".format(standard_error_score2)) + \")\")" ], "execution_count": 12, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Running CV Fold-0\n", "Running CV Fold-1\n", "Running CV Fold-2\n", "Running CV Fold-3\n", "Running CV Fold-4\n", "Running CV Fold-5\n", "Running CV Fold-6\n", "Running CV Fold-7\n", "Running CV Fold-8\n", "Running CV Fold-9\n", "\n", "\n", "avg top 18 acc: 0.9444\n", "\n", "\n", "STD DEV: 0.07856742013183862\n", "\n", "\n", "Standard Error (Accuracy) Across All Folds: ( 0.0248)\n" ] } ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "fWfcyOx-uqg3", "outputId": "be7852dc-2877-4aee-8c2c-fba4f6848c07" }, "source": [ "classifier_kfold_LR = LogisticRegression(solver='lbfgs')\n", "\n", "# test method for cv-se-ci\n", "mean_score_lr, std_dev_score_lr, standard_error_score_lr, ci_95_lr, low_end_range_lr, high_end_range_lr = calculate_cv_standard_error_ci(cv, classifier_kfold_LR, X, y, k, top_N_accuracy)\n", "\n", "print(\"\\n\\navg top \" + str(top_N_accuracy) + \" acc: \" + str(\"{:.4f}\".format(mean_score_lr)))\n", "print(\"\\n\\nSTD DEV: \" + str(std_dev_score_lr))\n", "print(\"\\n\\nStandard Error (Accuracy) Across All Folds: ( \" + str(\"{:.4f}\".format(standard_error_score_lr)) + \")\")\n", "print(\"High: \" + str(high_end_range_lr))\n", "print(\"Low : \" + str(low_end_range_lr))\n" ], "execution_count": 13, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Running CV Fold-0\n", "Running CV Fold-1\n", "Running CV Fold-2\n", "Running CV Fold-3\n", "Running CV Fold-4\n", "Running CV Fold-5\n", "Running CV Fold-6\n", "Running CV Fold-7\n", "Running CV Fold-8\n", "Running CV Fold-9\n", "\n", "\n", "avg top 18 acc: 0.6667\n", "\n", "\n", "STD DEV: 0.20637972912229677\n", "\n", "\n", "Standard Error (Accuracy) Across All Folds: ( 0.0653)\n", "High: 0.7945821480220148\n", "Low : 0.5387511853113187\n" ] } ] }, { "cell_type": "markdown", "metadata": { "id": "Xi4vnpoKQ0Ba" }, "source": [ "So we're looking for a minumum 61% consistently as our top-18 prediction accuracy goal.\n", "\n", "Unfortunately, our next baseline didnt quite meet that metric as we can see that while the model's mean top-18 accuracy is 67% correct, but the 95% CI low end can be as low as 53.8% (bad). We need a model that will perform above 61% at least 95% of the time, so our low-end CI needs to clear our target score.\n", "\n", "Imbalanced data problems can be tough as shown with scores with this wide of variance.\n", "\n", "At this point we know we're going to have to put a little more effort into modeling to get closer to our minimum pilot goal, so let's look at doing some light grid search across a few different model architectures that have been known to perform well.\n", "\n", "So far we haven't plotted a model evaluation graph (because there was nothing to compare).\n", "\n", "To show relative model performance towards classifying the rare class we're use a Precision Recall Curve.\n", "\n", "Once we identify the most promising top 3 models, we'll evaluate their performance with our top-18 prediction test to see which ones can survive a 95% confidence interval." ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "id": "AXQe2KXpdYHv", "outputId": "a31453ca-a471-4cad-94b2-e8f2093e3d94" }, "source": [ "import datetime\n", "\n", "SVM_params = {'C':[0.001, 0.1, 10, 100], 'kernel':['rbf' ,'linear', 'poly', 'sigmoid'], 'gamma':['auto']}\n", "LR_params = {'C':[0.001, 0.1, 1, 10, 100], 'solver':['liblinear']}\n", "LDA_params = {'n_components':[None, 1,2,3], 'solver':['svd'], 'shrinkage':[None]}\n", "RF_params = {'n_estimators':[10,50,100], 'random_state':[42]}\n", "GBC_params = {'n_estimators':[10, 50, 100], 'random_state':[42]}\n", "\n", "\"\"\"\n", "XGB_params = {\n", " 'max_depth': range (2, 10, 1),\n", " 'n_estimators': range(60, 220, 40),\n", " 'learning_rate': [0.1, 0.01, 0.05]\n", "}\n", "\"\"\"\n", "XGB_params = {\n", " 'max_depth': range (2, 10, 4),\n", " 'n_estimators': range(60, 220, 80),\n", " 'learning_rate': [0.1] #, 0.01]\n", "}\n", "\n", "xgb_estimator = XGBClassifier(\n", " kvargs={'tree_method':'gpu_hist', 'gpu_id':'0'},\n", " objective= 'binary:logistic',\n", " nthread=4,\n", " seed=42\n", ")\n", "\n", "# LightGBM\n", "\n", "params_lightGBM_ctor = {\n", " 'application': 'binary', # for binary classification\n", "# 'num_class' : 1, # used for multi-classes\n", " 'boosting': 'gbdt', # traditional gradient boosting decision tree\n", " 'num_iterations': 100, \n", " 'learning_rate': 0.05,\n", " 'num_leaves': 62,\n", " 'device': 'cpu', # you can use GPU to achieve faster learning\n", " 'max_depth': -1, # <0 means no limit\n", " 'max_bin': 510, # Small number of bins may reduce training accuracy but can deal with over-fitting\n", " 'lambda_l1': 5, # L1 regularization\n", " 'lambda_l2': 10, # L2 regularization\n", " 'metric' : 'binary_error',\n", " 'subsample_for_bin': 200, # number of samples for constructing bins\n", " 'subsample': 1, # subsample ratio of the training instance\n", " 'colsample_bytree': 0.8, # subsample ratio of columns when constructing the tree\n", " 'min_split_gain': 0.5, # minimum loss reduction required to make further partition on a leaf node of the tree\n", " 'min_child_weight': 1, # minimum sum of instance weight (hessian) needed in a leaf\n", " 'min_child_samples': 5# minimum number of data needed in a leaf\n", "}\n", "\n", "# Initiate classifier to use\n", "lightGBM_mdl = lgb.LGBMClassifier(boosting_type= 'gbdt', \n", " objective = 'binary', \n", " n_jobs = 5, \n", " silent = True,\n", " #max_depth = params_lightGBM_ctor['max_depth'],\n", " max_bin = params_lightGBM_ctor['max_bin'], \n", " subsample_for_bin = params_lightGBM_ctor['subsample_for_bin'],\n", " subsample = params_lightGBM_ctor['subsample'], \n", " min_split_gain = params_lightGBM_ctor['min_split_gain'], \n", " min_child_weight = params_lightGBM_ctor['min_child_weight'], \n", " min_child_samples = params_lightGBM_ctor['min_child_samples'])\n", "\n", "lgbm_gs_params = {\n", " 'max_depth': range (2, 10, 4)\n", " #'n_estimators': range(60, 220, 80),\n", " #'learning_rate': [0.1] #, 0.01]\n", "}\n", "\n", "models_opt = []\n", "\n", "models_opt.append(('Logistic Regression', LogisticRegression(), LR_params))\n", "#models_opt.append(('LDA', LinearDiscriminantAnalysis(), LDA_params))\n", "models_opt.append(('Random Forest Classifiers', RandomForestClassifier(), RF_params))\n", "#models_opt.append(('SVM', SVC(), SVM_params))\n", "models_opt.append(('Gradient Boosting Decision Trees', GradientBoostingClassifier(), GBC_params))\n", "\n", "# commented out for now, takes too long during testing!\n", "models_opt.append(('XGBoost', xgb_estimator, XGB_params))\n", "\n", "models_opt.append(('LGBMClassifier', lightGBM_mdl, lgbm_gs_params))\n", "\n", "\n", "# now set up Cross Validation parameters\n", "\n", "results = []\n", "names = []\n", "best_models = []\n", "best_params = {}\n", "#k = 10\n", "\n", "#model_data_tuples = []\n", "\n", "plt.figure(1)\n", "fig_pr, ax_pr = plt.subplots(1,1,figsize = (12,12))\n", "\n", "\n", "# now let's run Grid Search for each model listed in model_opts\n", "for name, model, params in models_opt:\n", "\n", " start_time = datetime.datetime.now()\n", "\n", " print(\"\\nRunning Grid Search for: \" + name)\n", " model_grid = GridSearchCV(model, params, cv=cv, scoring='average_precision') # \n", " model_grid.fit(x_train_scaled, y_train_scaled)\n", "\n", " best_model_best_mean_score = model_grid.best_score_\n", " best_model_best_score_stdev = model_grid.cv_results_['std_test_score'][model_grid.best_index_]\n", "\n", " #print(model_grid.cv_results_.keys())\n", "\n", " print( 'Best [Training] AP (Mean cross-validated) score: %0.3f' % model_grid.best_score_)\n", "\n", " msg = \"[Training] Cross Validation AP (Mean) {} AP: {:.3f} SD: {:.3f}\".format(name, best_model_best_mean_score, best_model_best_score_stdev)\n", " print(msg)\n", "\n", " names.append(name)\n", " #print(name)\n", "\n", " # now let's use the test data\n", "\n", " predictions = model_grid.best_estimator_.predict(x_test_scaled)\n", "\n", " proba = model_grid.best_estimator_.predict_proba(x_test_scaled)\n", "\n", " #model_data_tuples.append(tuple((y_test_scaled, proba[:, 1], name))) \n", "\n", " precision, recall, _ = precision_recall_curve(y_test_scaled, proba[:, 1])\n", "\n", " ap_test_for_model = average_precision_score(y_test_scaled, proba[:, 1])\n", "\n", " # Plotting each individual PR Curve\n", " plt.plot(recall, precision, lw=1, alpha=ap_test_for_model, label='' + name + '[Test] (Mean AP = %0.3f)' % ( ap_test_for_model ) )\n", "\n", "\n", " cm = model_valuation.standard_confusion_matrix(y_test_scaled, predictions) \n", "\n", " print(cm)\n", " # 'predictions': predictions,\n", " best_models.append( { 'name': name, 'model_grid': model_grid, 'best_model_test_mean_ap': ap_test_for_model } )\n", " #best_params[ name ] = model_grid.best_params_\n", "\n", " end_time = datetime.datetime.now()\n", "\n", " time_diff = (end_time - start_time)\n", " print(\"Model execution time: \" + str(time_diff.total_seconds() ) )\n", "\n", "\n", "#plot_precision_recall_curve(model_grid.best_estimator_, X_test_norm, y_test)\n", "plt.xlabel('Recall')\n", "plt.ylabel('Precision')\n", "plt.title(\"PR Curve\")\n", "plt.legend(loc=\"lower right\")\n", "plt.show()\n", "\n", "\n", " " ], "execution_count": 14, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "\n", "Running Grid Search for: Logistic Regression\n", "Best [Training] AP (Mean cross-validated) score: 0.461\n", "[Training] Cross Validation AP (Mean) Logistic Regression AP: 0.461 SD: 0.117\n", "[[ 14 2]\n", " [ 70 2414]]\n", "Model execution time: 0.761327\n", "\n", "Running Grid Search for: Random Forest Classifiers\n", "Best [Training] AP (Mean cross-validated) score: 0.779\n", "[Training] Cross Validation AP (Mean) Random Forest Classifiers AP: 0.779 SD: 0.092\n", "[[ 49 9]\n", " [ 35 2407]]\n", "Model execution time: 10.155729\n", "\n", "Running Grid Search for: Gradient Boosting Decision Trees\n", "Best [Training] AP (Mean cross-validated) score: 0.800\n", "[Training] Cross Validation AP (Mean) Gradient Boosting Decision Trees AP: 0.800 SD: 0.095\n", "[[ 58 8]\n", " [ 26 2408]]\n", "Model execution time: 13.897241\n", "\n", "Running Grid Search for: XGBoost\n", "Best [Training] AP (Mean cross-validated) score: 0.839\n", "[Training] Cross Validation AP (Mean) XGBoost AP: 0.839 SD: 0.077\n", "[[ 61 7]\n", " [ 23 2409]]\n", "Model execution time: 13.311851\n", "\n", "Running Grid Search for: LGBMClassifier\n", "Best [Training] AP (Mean cross-validated) score: 0.748\n", "[Training] Cross Validation AP (Mean) LGBMClassifier AP: 0.748 SD: 0.066\n", "[[ 45 14]\n", " [ 39 2402]]\n", "Model execution time: 3.715916\n" ] }, { "output_type": "display_data", "data": { "text/plain": [ "
" ] }, "metadata": {} }, { "output_type": "display_data", "data": { "image/png": "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zCbLspa/8XxN4RARmYQOHz5MUVERM2bMUJGQSaU7kqC00KO/92er9zB4/FBQesqhzr0dlM2owMpYZLMDH1Yme/z3UFDkxunMv8kPlmXR1dXF4cOHaWhoGNY1+fdViIhIzsXjccrLy1UiRGRk/JUQ7YJsZtDDfR0xIr0J4pEU6WQGywKny0E2nSWbyc9ZD8YYysvLR/SOnEagRUQmKZVnERkxlxc8AYh1D5Tp1/EmOwg0VAz6vSUZH7xw54uRfj/UCLSIiIiIDF9hOcR6IZN6wwFr0vzDXAVaRERsEQgEzvk5Nm7cyO23337a4/v37+e///u/h33+G11yySXMnTuXxYsXs2LFCjZv3nxOeUfT+vXr+drXTr8r3Jn8+c9/JhgM8ta3vpWtW7fS3NxMc3MzZWVlNDQ00NzczKWXXjrs5/vNb37D9u3bT3x+xx13UFNTw1133TXo+R/72Md4/PHHgYE/4+nTp/P6RQ2uu+66Ufn7MRzXXXcdq1evPumxf/zHf6S2tpbm5mYWLlzI+vXrz/l1Nm3axKJFi5g9eza33347Z1rE4fnnn8flcvHLX/7yxGP33HMPjY2NNDY2cs899wDQ399/4r9dc3MzFRUVfOxjHwPge9/7Hnffffc55x6U0w0FQYh25ub5xwPLssbVx7JlyywRETk327dvtzuC5ff7c/4aGzZssK666qqzvn7NmjXW888/b1mWZd19993WpZdeOiq50un0qDzP2Trdn8stt9xi/eIXvxjx8w123Re/+EXrG9/4xinndnZ2WqtWrTrx+Zo1a6xFixZZTzzxhGVZltXT02OtXLkyZ38/usJxK5vNnnituro6a968edaePXsGzb59+3arvLzcymQy5/S6K1assJ555hkrm81a69ats/7whz8Mel46nbbe/OY3W1deeeWJP9Ouri6roaHB6urqsrq7u62Ghgaru7v7lGuXLl1qPfbYY5ZlWVYkErGam5vPKfMZZdKW1dliWcnYiYf6drx82tP7umJWMmHv3/uhDPZ9EdhoDdJHNQItIiJ5Y/PmzaxevZqmpiauv/56enp6gIERuaamJpqbm7njjjtYuHAhMDCSevXVVwPw2GOPnRiJW7JkCf39/dx555088cQTNDc38+1vf/uk88PhMLfddhuLFi2iqamJ++6774zZzj//fFpbWwGIRCL89V//NStXrmTJkiX89re/BSAajfKOd7yD+fPnc/3117Nq1SpeXXo1EAjwyU9+ksWLF/PMM8/wk5/8hJUrV9Lc3MwHPvABMpkMmUyGW2+9lYULF7Jo0SK+/e1vA/Cv//qvzJ8/n6amJt75zncC8J//+Z985CMfAQZG2teuXUtTUxNvectbOHjwIAC33nort99+OxdccAEzZ848aURzKA899BDnn38+S5cu5aabbiIcHtiA5M477zyR5VOf+hRPP/0069ev54477qC5uZk9e/ac8Xnvu+8+1q1bd9Jj73znO7n33nsB+NWvfsUNN9xw0vFvfOMbrFixgqamJr74xS+eePy6665j2bJlLFiwgB/96EcnHg8EAnzuc59j8eLFrF69mra2tkGz/OpXv+Jtb3vbSa//Rueddx4ul4vOzrMfbT169Ch9fX2sXr0aYwzvfe97+c1vfjPoud/97ne58cYbqaqqOvHYgw8+yGWXXUZZWRmlpaVcdtllPPDAAyddt3v3btrb27nooosAKCwsZMaMGTz33HNnnfuMHM6BqRzRDhhnSyKPBt1EKCIi/OQvB0b9Od+zun7E17z3ve/lu9/9LmvWrOELX/gCX/rSl/jOd77Dbbfdxo9//GPOP/987rzzzkGvveuuu/j+97/PhRdeSDgcxufz8bWvfY277rqL3/3ud8BA4X7Vl7/8ZYLBIFu3bgU4UdZP54EHHuC6664D4Ctf+Qpr167l7rvvJhQKsXLlSi699FJ+8IMfUFpayvbt23n55Zdpbm4+cX0kEmHVqlV885vfZMeOHXz961/nqaeewu1286EPfYif/vSnLFiwgNbWVl5++WUAQqEQAF/72tfYt28fXq/3xGOv9/d///fccsst3HLLLdx9993cfvvtJwra0aNHefLJJ9m5cyfXXHMNb3/724f879DZ2ck///M/8/DDD+P3+/n617/Ot771LT784Q/z61//mp07d2KMIRQKUVJSwjXXXMPVV189rOd+6qmnTjnvLW95C+9///vJZDLce++9/OhHP+LLX/4yMFDkX3nlFZ577jksy+Kaa67h8ccf5+KLL+buu++mrKyMWCzGihUruPHGGykvLycSibB69Wq+8pWv8L//9//mxz/+MZ///OdPyfKzn/2ML3zhC1RXV3PjjTfy2c9+9pRznn32WRwOB5WVJ98wt2HDBj7+8Y+fcn5hYSFPP/30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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" } } ] }, { "cell_type": "markdown", "metadata": { "id": "n0OOHRxaWUod" }, "source": [ "At this point we can see that 3 models standout\n", "* XGBoost\n", "* Gradient Boosting Decision Trees\n", "* Random Forests\n", "\n", "We know that the Precision-Recall curve shows us which classifiers are better picking up on the rare class (e.g., imbalanced datasets)\n", "\n", "Now let's take these top 3 models, and compare their cross-validation Standard Error confidence intervals to see which model is going to hold up \"enough of the time\" to meet our minimum viable performance criteria set forth by the line of business." ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 1000 }, "id": "r13SrVxBbT0B", "outputId": "b28b5aa9-1b29-4398-b48e-495c6a236b32" }, "source": [ "# for each of the top-3 models surfaced via grid search\n", "\n", "#model_labels = np.zeros(3)\n", "#model_scores = np.zeros(3)\n", "\n", "\n", "fig, ax = plt.subplots(1,1,figsize = (12,12))\n", "labels = []\n", "\n", "\n", "# get top 3 based on mean CV AP score:\n", "top_3_model_keys = sorted(best_models, key=lambda rec:rec['best_model_test_mean_ap'], reverse=True)[:3]\n", "\n", "for model_index in range(3):\n", " print( top_3_model_keys[ model_index ]['name'] + ': ' + str(top_3_model_keys[ model_index]['best_model_test_mean_ap']) )\n", "\n", " labels.append(top_3_model_keys[ model_index ]['name'])\n", "\n", " # get best model\n", " model_grid = top_3_model_keys[ model_index ]['model_grid']\n", " best_model_best_score_stdev = model_grid.cv_results_['std_test_score'][model_grid.best_index_]\n", " best_model_best_mean_score = model_grid.best_score_\n", " #print(\"STD DEV: \" + str(best_model_best_score_stdev) )\n", "\n", "\n", " # NOW: we know our AP for each model\n", " # what we want is the accuracy on the Top-18 predictions and the error variance\n", " # now we re-run CV(k=10) and re-compute the score but now for Top-18-accuracy\n", " # we collect the variances to compute CV-SE-CIs per model\n", "\n", " mean_score2, std_dev_score2, standard_error_score2, ci_95_2, low_end_range2, high_end_range2 = calculate_cv_standard_error_ci( cv, model_grid.best_estimator_, X, y, k, top_N_accuracy )\n", "\n", " print(\"\\n\\navg top \" + str(top_N_accuracy) + \" acc: \" + str(\"{:.4f}\".format(mean_score2)))\n", " print(\"\\n\\nSTD DEV: \" + str(std_dev_score2))\n", " print(\"\\n\\nStandard Error (Accuracy) Across All Folds: ( \" + str(\"{:.4f}\".format(standard_error_score2)) + \")\")\n", " print(\"High: \" + str(high_end_range2))\n", " print(\"Low : \" + str(low_end_range2)) \n", "\n", " ax.bar(model_index, mean_score2,\n", " yerr=ci_95_2,\n", " align='center',\n", " alpha=0.5,\n", " ecolor='black',\n", " capsize=10)\n", " \n", " print(\"-----\\n\")\n", "\n", "\n", "# add logistic regression for comparison\n", "# mean_score_lr, std_dev_score_lr, standard_error_score_lr, ci_95_lr, low_end_range_lr, high_end_range_lr\n", "labels.append(\"Logistic Regression\")\n", "\n", "ax.bar(3, mean_score_lr,\n", " yerr=ci_95_lr,\n", " align='center',\n", " alpha=0.5,\n", " ecolor='black',\n", " capsize=10)\n", "\n", "# draw min line\n", "ax.axhline(min_topN_accuracy, 0, 1, linestyle = ':', color = 'r',label = 'Minimum Top18 Accuracy')\n", "\n", "# draw target line\n", "ax.axhline(target_topN_accuracy, 0, 1, linestyle = ':', color = 'b',label = 'Minimum Top18 Accuracy')\n", "\n", "\n", "x_pos = np.arange(len(labels))\n", "ax.set_ylabel('Avg Top 18 Accuracy')\n", "ax.set_yticks(np.arange(0, 1.0, 0.05))\n", "ax.set_xticks(x_pos)\n", "ax.set_xticklabels(labels)\n", "ax.set_title('Comparison of Models\\' Top18 Accuracy and 95% Confidence Intervals')\n", "ax.yaxis.grid(True)\n", "\n", "# Save the figure and show\n", "#plt.tight_layout()\n", "#plt.savefig('bar_plot_with_error_bars.png')\n", "plt.show()\n", "\n", " \n", "\n", "\n", "# based on the variances from the top-20-ranked-predictions, calculate the CV-SE-CI (Standard Error Confidence Intervals at 95%)" ], "execution_count": 15, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "XGBoost: 0.836809956740349\n", "Running CV Fold-0\n", "Running CV Fold-1\n", "Running CV Fold-2\n", "Running CV Fold-3\n", "Running CV Fold-4\n", "Running CV Fold-5\n", "Running CV Fold-6\n", "Running CV Fold-7\n", "Running CV Fold-8\n", "Running CV Fold-9\n", "\n", "\n", "avg top 18 acc: 0.8889\n", "\n", "\n", "STD DEV: 0.09622504486493763\n", "\n", "\n", "Standard Error (Accuracy) Across All Folds: ( 0.0304)\n", "High: 0.948529789595007\n", "Low : 0.8292479881827709\n", "-----\n", "\n", "Gradient Boosting Decision Trees: 0.8105641840791915\n", "Running CV Fold-0\n", "Running CV Fold-1\n", "Running CV Fold-2\n", "Running CV Fold-3\n", "Running CV Fold-4\n", "Running CV Fold-5\n", "Running CV Fold-6\n", "Running CV Fold-7\n", "Running CV Fold-8\n", "Running CV Fold-9\n", "\n", "\n", "avg top 18 acc: 0.8056\n", "\n", "\n", "STD DEV: 0.15957118462605632\n", "\n", "\n", "Standard Error (Accuracy) Across All Folds: ( 0.0505)\n", "High: 0.9044588004560737\n", "Low : 0.7066523106550376\n", "-----\n", "\n", "Random Forest Classifiers: 0.7830730925169579\n", "Running CV Fold-0\n", "Running CV Fold-1\n", "Running CV Fold-2\n", "Running CV Fold-3\n", "Running CV Fold-4\n", "Running CV Fold-5\n", "Running CV Fold-6\n", "Running CV Fold-7\n", "Running CV Fold-8\n", "Running CV Fold-9\n", "\n", "\n", "avg top 18 acc: 0.7833\n", "\n", "\n", "STD DEV: 0.1520436909267112\n", "\n", "\n", "Standard Error (Accuracy) Across All Folds: ( 0.0481)\n", "High: 0.8775709893020021\n", "Low : 0.6890956773646648\n", "-----\n", "\n" ] }, { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" } } ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "8Hr87sEJwwhe", "outputId": "7dd453c0-6020-45df-d6f6-8050a7dd3fdc" }, "source": [ "top_1_model_keys = sorted(best_models, key=lambda rec:rec['best_model_test_mean_ap'], reverse=True)[:1]\n", "\n", "#top_model_key = top_1_model_keys[0]\n", "\n", "print( top_1_model_keys[ 0 ]['name'] + ': ' + str(top_1_model_keys[ 0 ]['best_model_test_mean_ap']) )\n", "\n", "\n", "# get best model\n", "model_grid = top_1_model_keys[ 0 ]['model_grid']\n", "best_model_best_score_stdev = model_grid.cv_results_['std_test_score'][model_grid.best_index_]\n", "best_model_best_mean_score = model_grid.best_score_\n", "\n", "best_estimator = model_grid.best_estimator_\n", "\n", "print(best_estimator)\n", "\n", "predictions_final = best_estimator.predict(x_test_scaled)\n", "\n", "print( predictions_final )\n" ], "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "XGBoost: 0.8993044875085507\n", "XGBClassifier(kvargs={'gpu_id': '0', 'tree_method': 'gpu_hist'}, max_depth=6,\n", " n_estimators=60, nthread=4, seed=42)\n", "[0 0 0 ... 1 0 0]\n" ] } ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "E4co6vBh0m_v", "outputId": "ec1b02e9-a379-4a56-dd02-05b9211ec47f" }, "source": [ "from google.colab import drive\n", "drive.mount('/gdrive')\n", "%cd /gdrive\n", "\n" ], "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Mounted at /gdrive\n", "/gdrive\n" ] } ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "wkN0MKiJ1fsM", "outputId": "b0c082eb-baa0-44a9-d1e4-d41c7acb06f0" }, "source": [ "\n", "%ls -la \"./MyDrive/machine_learning/predictive_maintenance/models/\"" ], "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "total 0\n" ] } ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "mK7FfxcRzNsg", "outputId": "af7b785a-7830-49ad-d90d-fe6381aee40c" }, "source": [ "!pip install sklearn2pmml\n" ], "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Collecting sklearn2pmml\n", " Downloading sklearn2pmml-0.76.1.tar.gz (6.0 MB)\n", "\u001b[K |████████████████████████████████| 6.0 MB 28.0 MB/s \n", "\u001b[?25hRequirement already satisfied: joblib>=0.13.0 in /usr/local/lib/python3.7/dist-packages (from sklearn2pmml) (1.1.0)\n", "Requirement already satisfied: scikit-learn>=0.18.0 in /usr/local/lib/python3.7/dist-packages (from sklearn2pmml) (1.0.1)\n", "Requirement already satisfied: sklearn-pandas>=0.0.10 in /usr/local/lib/python3.7/dist-packages (from sklearn2pmml) (1.8.0)\n", "Requirement already satisfied: numpy>=1.14.6 in /usr/local/lib/python3.7/dist-packages (from scikit-learn>=0.18.0->sklearn2pmml) (1.21.4)\n", "Requirement already satisfied: scipy>=1.1.0 in /usr/local/lib/python3.7/dist-packages (from scikit-learn>=0.18.0->sklearn2pmml) (1.4.1)\n", "Requirement already satisfied: threadpoolctl>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from scikit-learn>=0.18.0->sklearn2pmml) (3.0.0)\n", "Requirement already satisfied: pandas>=0.11.0 in /usr/local/lib/python3.7/dist-packages (from sklearn-pandas>=0.0.10->sklearn2pmml) (1.1.5)\n", "Requirement already satisfied: python-dateutil>=2.7.3 in /usr/local/lib/python3.7/dist-packages (from pandas>=0.11.0->sklearn-pandas>=0.0.10->sklearn2pmml) (2.8.2)\n", "Requirement already satisfied: pytz>=2017.2 in /usr/local/lib/python3.7/dist-packages (from pandas>=0.11.0->sklearn-pandas>=0.0.10->sklearn2pmml) (2018.9)\n", "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.7/dist-packages (from python-dateutil>=2.7.3->pandas>=0.11.0->sklearn-pandas>=0.0.10->sklearn2pmml) (1.15.0)\n", "Building wheels for collected packages: sklearn2pmml\n", " Building wheel for sklearn2pmml (setup.py) ... \u001b[?25l\u001b[?25hdone\n", " Created wheel for sklearn2pmml: filename=sklearn2pmml-0.76.1-py3-none-any.whl size=5985321 sha256=2f2ddc4223f4152af2db6cfbf9b04059e58c7985b06ed7d366d414729c293d8a\n", " Stored in directory: /root/.cache/pip/wheels/56/e3/4a/84bc2cf69826abbd14368ed4d287d71891614891bb87fde2d4\n", "Successfully built sklearn2pmml\n", "Installing collected packages: sklearn2pmml\n", "Successfully installed sklearn2pmml-0.76.1\n" ] } ] }, { "cell_type": "code", "metadata": { "id": "G83dRzZgzQZv" }, "source": [ "from sklearn2pmml import sklearn2pmml\n", "from sklearn2pmml.pipeline import PMMLPipeline\n", "\n", "'''\n", "sklearn2pmml(estimator=best_estimator, \n", " mapper=x_train_mapper, \n", " pmml=\"./MyDrive/machine_learning/predictive_maintenance/models/pm_sklearn_gscv_xgb_20211123.pmml\")\n", "'''\n", "pipeline = PMMLPipeline([\n", "\t(\"mapper\", x_train_mapper),\n", "\t(\"classifier\", best_estimator)\n", "])" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "0ilr7Uem2gdf" }, "source": [ "sklearn2pmml(pipeline, \"./MyDrive/machine_learning/predictive_maintenance/models/pm_sklearn_gscv_xgb_20211123.pmml\", with_repr = True)\n" ], "execution_count": null, "outputs": [] } ] }