{ "cells": [ { "attachments": {}, "cell_type": "markdown", "id": "81e0620e", "metadata": {}, "source": [ "Last updated: 16 Feb 2023\n", "\n", "# 👋 PyCaret Multiclass Classification Tutorial\n", "\n", "PyCaret is an open-source, low-code machine learning library in Python that automates machine learning workflows. It is an end-to-end machine learning and model management tool that exponentially speeds up the experiment cycle and makes you more productive.\n", "\n", "Compared with the other open-source machine learning libraries, PyCaret is an alternate low-code library that can be used to replace hundreds of lines of code with a few lines only. This makes experiments exponentially fast and efficient. PyCaret is essentially a Python wrapper around several machine learning libraries and frameworks, such as scikit-learn, XGBoost, LightGBM, CatBoost, spaCy, Optuna, Hyperopt, Ray, and a few more.\n", "\n", "The design and simplicity of PyCaret are inspired by the emerging role of citizen data scientists, a term first used by Gartner. Citizen Data Scientists are power users who can perform both simple and moderately sophisticated analytical tasks that would previously have required more technical expertise.\n" ] }, { "attachments": {}, "cell_type": "markdown", "id": "8116e19d", "metadata": {}, "source": [ "# 💻 Installation\n", "\n", "PyCaret is tested and supported on the following 64-bit systems:\n", "- Python 3.7 – 3.10\n", "- Python 3.9 for Ubuntu only\n", "- Ubuntu 16.04 or later\n", "- Windows 7 or later\n", "\n", "You can install PyCaret with Python's pip package manager:\n", "\n", "`pip install pycaret`\n", "\n", "PyCaret's default installation will not install all the extra dependencies automatically. For that you will have to install the full version:\n", "\n", "`pip install pycaret[full]`\n", "\n", "or depending on your use-case you may install one of the following variant:\n", "\n", "- `pip install pycaret[analysis]`\n", "- `pip install pycaret[models]`\n", "- `pip install pycaret[tuner]`\n", "- `pip install pycaret[mlops]`\n", "- `pip install pycaret[parallel]`\n", "- `pip install pycaret[test]`" ] }, { "cell_type": "code", "execution_count": 1, "id": "d7142a33", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'3.0.0'" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# check installed version\n", "import pycaret\n", "pycaret.__version__" ] }, { "attachments": {}, "cell_type": "markdown", "id": "fb66e98d", "metadata": {}, "source": [ "# 🚀 Quick start" ] }, { "attachments": {}, "cell_type": "markdown", "id": "00347d44", "metadata": {}, "source": [ "PyCaret’s Classification Module is a supervised machine learning module that is used for classifying elements into groups. The goal is to predict the categorical class labels which are discrete and unordered. \n", "\n", "Some common use cases include predicting customer default (Yes or No), predicting customer churn (customer will leave or stay), the disease found (positive or negative). \n", "\n", "This module can be used for binary or multiclass problems. It provides several pre-processing features that prepare the data for modeling through the setup function. It has over 18 ready-to-use algorithms and several plots to analyze the performance of trained models.\n", "\n", "A typical workflow in PyCaret consist of following 5 steps in this order:\n", "\n", "## **Setup** ➡️ **Compare Models** ➡️ **Analyze Model** ➡️ **Prediction** ➡️ **Save Model**" ] }, { "cell_type": "code", "execution_count": 2, "id": "956dfdab", "metadata": {}, "outputs": [ { "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", "
sepal_lengthsepal_widthpetal_lengthpetal_widthspecies
05.13.51.40.2Iris-setosa
14.93.01.40.2Iris-setosa
24.73.21.30.2Iris-setosa
34.63.11.50.2Iris-setosa
45.03.61.40.2Iris-setosa
\n", "
" ], "text/plain": [ " sepal_length sepal_width petal_length petal_width species\n", "0 5.1 3.5 1.4 0.2 Iris-setosa\n", "1 4.9 3.0 1.4 0.2 Iris-setosa\n", "2 4.7 3.2 1.3 0.2 Iris-setosa\n", "3 4.6 3.1 1.5 0.2 Iris-setosa\n", "4 5.0 3.6 1.4 0.2 Iris-setosa" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# loading sample dataset from pycaret dataset module\n", "from pycaret.datasets import get_data\n", "data = get_data('iris')" ] }, { "attachments": {}, "cell_type": "markdown", "id": "c00f6a4a", "metadata": {}, "source": [ "## Setup\n", "This function initializes the training environment and creates the transformation pipeline. Setup function must be called before executing any other function in PyCaret. It only has two required parameters i.e. `data` and `target`. All the other parameters are optional." ] }, { "cell_type": "code", "execution_count": 3, "id": "97f2c6c6", "metadata": {}, "outputs": [ { "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", "
 DescriptionValue
0Session id123
1Targetspecies
2Target typeMulticlass
3Target mappingIris-setosa: 0, Iris-versicolor: 1, Iris-virginica: 2
4Original data shape(150, 5)
5Transformed data shape(150, 5)
6Transformed train set shape(105, 5)
7Transformed test set shape(45, 5)
8Numeric features4
9PreprocessTrue
10Imputation typesimple
11Numeric imputationmean
12Categorical imputationmode
13Fold GeneratorStratifiedKFold
14Fold Number10
15CPU Jobs-1
16Use GPUFalse
17Log ExperimentFalse
18Experiment Nameclf-default-name
19USI8d38
\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# import pycaret classification and init setup\n", "from pycaret.classification import *\n", "s = setup(data, target = 'species', session_id = 123)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "3c583864", "metadata": {}, "source": [ "Once the setup has been successfully executed it shows the information grid containing experiment level information. \n", "\n", "- **Session id:** A pseudo-random number distributed as a seed in all functions for later reproducibility. If no `session_id` is passed, a random number is automatically generated that is distributed to all functions.
\n", "
\n", "- **Target type:** Binary, Multiclass, or Regression. The Target type is automatically detected.
\n", "
\n", "- **Label Encoding:** When the Target variable is of type string (i.e. 'Yes' or 'No') instead of 1 or 0, it automatically encodes the label into 1 and 0 and displays the mapping (0 : No, 1 : Yes) for reference. In this tutorial, no label encoding is required since the target variable is of numeric type.
\n", "
\n", "- **Original data shape:** Shape of the original data prior to any transformations.
\n", "
\n", "- **Transformed train set shape :** Shape of transformed train set
\n", "
\n", "- **Transformed test set shape :** Shape of transformed test set
\n", "
\n", "- **Numeric features :** The number of features considered as numerical.
\n", "
\n", "- **Categorical features :** The number of features considered as categorical.
" ] }, { "attachments": {}, "cell_type": "markdown", "id": "ada19398", "metadata": {}, "source": [ "PyCaret has two set of API's that you can work with. (1) Functional (as seen above) and (2) Object Oriented API.\n", "\n", "With Object Oriented API instead of executing functions directly you will import a class and execute methods of class." ] }, { "cell_type": "code", "execution_count": 4, "id": "32ee91c9", "metadata": {}, "outputs": [], "source": [ "# import ClassificationExperiment and init the class\n", "from pycaret.classification import ClassificationExperiment\n", "exp = ClassificationExperiment()" ] }, { "cell_type": "code", "execution_count": 5, "id": "3ead9fb5", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "pycaret.classification.oop.ClassificationExperiment" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# check the type of exp\n", "type(exp)" ] }, { "cell_type": "code", "execution_count": 6, "id": "f05b8590", "metadata": {}, "outputs": [ { "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", "
 DescriptionValue
0Session id123
1Targetspecies
2Target typeMulticlass
3Target mappingIris-setosa: 0, Iris-versicolor: 1, Iris-virginica: 2
4Original data shape(150, 5)
5Transformed data shape(150, 5)
6Transformed train set shape(105, 5)
7Transformed test set shape(45, 5)
8Numeric features4
9PreprocessTrue
10Imputation typesimple
11Numeric imputationmean
12Categorical imputationmode
13Fold GeneratorStratifiedKFold
14Fold Number10
15CPU Jobs-1
16Use GPUFalse
17Log ExperimentFalse
18Experiment Nameclf-default-name
19USI42d4
\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# init setup on exp\n", "exp.setup(data, target = 'species', session_id = 123)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "77213120", "metadata": {}, "source": [ "You can use any of the two method i.e. Functional or OOP and even switch back and forth between two set of API's. The choice of method will not impact the results and has been tested for consistency." ] }, { "attachments": {}, "cell_type": "markdown", "id": "f98dd435", "metadata": {}, "source": [ "## Compare Models\n", "\n", "This function trains and evaluates the performance of all the estimators available in the model library using cross-validation. The output of this function is a scoring grid with average cross-validated scores. Metrics evaluated during CV can be accessed using the `get_metrics` function. Custom metrics can be added or removed using `add_metric` and `remove_metric` function." ] }, { "cell_type": "code", "execution_count": 7, "id": "65a19df4", "metadata": {}, "outputs": [ { "data": { "text/html": [], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
 ModelAccuracyAUCRecallPrec.F1KappaMCCTT (Sec)
lrLogistic Regression0.97180.99710.97180.97800.97120.95730.96090.9190
knnK Neighbors Classifier0.97180.98300.97180.97800.97120.95730.96090.0370
qdaQuadratic Discriminant Analysis0.97180.99740.97180.97800.97120.95730.96090.0300
ldaLinear Discriminant Analysis0.97181.00000.97180.97800.97120.95730.96090.0330
lightgbmLight Gradient Boosting Machine0.95360.99350.95360.96340.95280.92980.93560.3150
nbNaive Bayes0.94450.98680.94450.95250.94380.91610.92070.0300
etExtra Trees Classifier0.94450.99350.94450.95860.94260.91610.92460.0880
catboostCatBoost Classifier0.94450.99220.94450.95860.94260.91610.92460.1220
gbcGradient Boosting Classifier0.93550.97920.93550.94160.93250.90230.90830.1360
xgboostExtreme Gradient Boosting0.93550.98680.93550.94400.93430.90230.90770.0710
dtDecision Tree Classifier0.92640.94290.92640.95020.92010.88860.90400.0270
rfRandom Forest Classifier0.92640.99090.92640.93430.92320.88860.89560.0900
adaAda Boost Classifier0.91550.99470.91550.94010.90970.87200.88730.0580
ridgeRidge Classifier0.82270.00000.82270.84370.81860.73200.74540.0220
svmSVM - Linear Kernel0.76180.00000.76180.66550.68880.63330.70480.0300
dummyDummy Classifier0.28640.50000.28640.08220.12770.00000.00000.0490
\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Processing: 0%| | 0/69 [00:00" ] }, "metadata": {}, "output_type": "display_data" }, { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
 ModelAccuracyAUCRecallPrec.F1KappaMCCTT (Sec)
lrLogistic Regression0.97180.99710.97180.97800.97120.95730.96090.0430
knnK Neighbors Classifier0.97180.98300.97180.97800.97120.95730.96090.0520
qdaQuadratic Discriminant Analysis0.97180.99740.97180.97800.97120.95730.96090.0420
ldaLinear Discriminant Analysis0.97181.00000.97180.97800.97120.95730.96090.0550
lightgbmLight Gradient Boosting Machine0.95360.99350.95360.96340.95280.92980.93560.0550
nbNaive Bayes0.94450.98680.94450.95250.94380.91610.92070.0380
etExtra Trees Classifier0.94450.99350.94450.95860.94260.91610.92460.1430
catboostCatBoost Classifier0.94450.99220.94450.95860.94260.91610.92460.0480
gbcGradient Boosting Classifier0.93550.97920.93550.94160.93250.90230.90830.1850
xgboostExtreme Gradient Boosting0.93550.98680.93550.94400.93430.90230.90770.0600
dtDecision Tree Classifier0.92640.94290.92640.95020.92010.88860.90400.0370
rfRandom Forest Classifier0.92640.99090.92640.93430.92320.88860.89560.1440
adaAda Boost Classifier0.91550.99470.91550.94010.90970.87200.88730.0850
ridgeRidge Classifier0.82270.00000.82270.84370.81860.73200.74540.0330
svmSVM - Linear Kernel0.76180.00000.76180.66550.68880.63330.70480.0320
dummyDummy Classifier0.28640.50000.28640.08220.12770.00000.00000.0430
\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Processing: 0%| | 0/69 [00:00#sk-container-id-1 {color: black;background-color: white;}#sk-container-id-1 pre{padding: 0;}#sk-container-id-1 div.sk-toggleable {background-color: white;}#sk-container-id-1 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-1 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-1 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-1 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-1 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-1 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-1 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-1 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-1 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-1 div.sk-item {position: relative;z-index: 1;}#sk-container-id-1 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-1 div.sk-item::before, #sk-container-id-1 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-1 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-1 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-1 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-1 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-1 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-1 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-1 div.sk-label-container {text-align: center;}#sk-container-id-1 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-1 div.sk-text-repr-fallback {display: none;}
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
       "                   intercept_scaling=1, l1_ratio=None, max_iter=1000,\n",
       "                   multi_class='auto', n_jobs=None, penalty='l2',\n",
       "                   random_state=123, solver='lbfgs', tol=0.0001, verbose=0,\n",
       "                   warm_start=False)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n", " intercept_scaling=1, l1_ratio=None, max_iter=1000,\n", " multi_class='auto', n_jobs=None, penalty='l2',\n", " random_state=123, solver='lbfgs', tol=0.0001, verbose=0,\n", " warm_start=False)" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# compare models using OOP\n", "exp.compare_models()" ] }, { "attachments": {}, "cell_type": "markdown", "id": "340de1e2", "metadata": {}, "source": [ "Notice that the output between functional and OOP API is consistent. Rest of the functions in this notebook will only be shown using functional API only. " ] }, { "attachments": {}, "cell_type": "markdown", "id": "6a77ec0c", "metadata": {}, "source": [ "## Analyze Model" ] }, { "attachments": {}, "cell_type": "markdown", "id": "595ea108", "metadata": {}, "source": [ "You can use the `plot_model` function to analyzes the performance of a trained model on the test set. It may require re-training the model in certain cases." ] }, { "cell_type": "code", "execution_count": 9, "id": "0ec7fad6", "metadata": {}, "outputs": [ { "data": { "text/html": [], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxAAAAIWCAYAAADH12tUAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAA9hAAAPYQGoP6dpAABGLElEQVR4nO3dd3hO9+P/8dedJUJE7NnYoQhJEao1gpbQoTNEVbVGULM1qkap3ZqhRkMoLVq6laJoqVna2qryqaRG1IgRGZL794df7m8jwTskuW/6fFxXr4tzzn3u14mcz+e87vN+n9titVqtAgAAAAADTvYOAAAAAODeQYEAAAAAYIwCAQAAAMAYBQIAAACAMQoEAAAAAGMUCAAAAADGKBAAAAAAjFEgAAAAABijQAD4z+J7NIE7x/kD/HdRIADkiJdeekkvvfRSrrxXTEyMfH19tXLlSuPXzJo1SxEREba/z5gxQ76+vsavX7lypXx9fTP85+fnp6CgII0aNUqXL1/O0nHcC3Lz3zXN3r179eabb6pJkyby8/NT8+bNNWzYMEVHR+fYe0ZGRqphw4by8/PTrFmzsmWf27dvl6+vr7Zv354t+zN5L19fX23evDnTbf7880/bNjExMcb7TkpK0tixY/X111/fdltfX1/NmDHDeN8A7g0u9g4AAHerWLFiWrZsmR544AHj10ybNk29evWy/f3555/Xo48+muX3Dg8PV9GiRW1/j4uL008//aSPPvpI586d09SpU7O8T0c2YsSIXH2/JUuWaOzYsQoMDNSAAQNUrFgx/fXXX4qIiND333+vhQsXqmrVqtn6npcvX9aECRPUpEkTde7cWWXKlMmW/VavXl3Lli1TpUqVsmV/JpycnLR69Wo98sgjGdatWrXqjvYZGxurhQsXaty4cbfddtmyZSpRosQdvQ8Ax0WBAHDPc3NzU+3ate9qHyVKlLijC51q1apluMBs3Lixzp49q++++05XrlxRvnz57iqbI8nNi99ffvlFY8aMUWhoqIYOHWpbHhgYqObNm+vpp5/WW2+9laU7Tybi4uKUmpqq5s2bq27dutm23/z589/172lWBQQEaO3atRo5cqRcXNL/X/6qVatUrVo1HTx4MMfeP7ePF0DuYAgTALvasmWL2rdvr4ceesj2KfPJkyfTbbNnzx6Fhoaqdu3aatKkiRYuXKhOnTpp8ODBkjIOYUpNTdWUKVMUFBSkGjVqKCgoSO+//76Sk5MlyTZUKTw83PbnzIYwffHFF2rbtq1q1aqlJk2a6P3331dSUpLRcXl6espischisdiW7dq1Sx06dFCtWrVUr149DRo0SOfOnbujY12wYIFatmypWrVqacWKFZKkI0eOqFu3bgoICFBAQIB69uyZYZjPwoUL1bJlS9WsWVOPPvqoRo4cmW6o1ZYtW/TCCy/I399fdevWVVhYmP7880/b+huHMCUmJmrmzJm2fT722GOaO3euUlNT071m6NChmjt3rpo0aaKaNWsqJCREv//++y1/hhEREfL09FT//v0zrCtUqJAGDx6sZs2aKT4+XpKUkpKiJUuW6IknnpCfn5+aNGmi9957T4mJibbXDR48WJ06ddKKFSv0+OOPq0aNGnrqqaf0448/Sro+NC0oKEiS9NZbb9l+J4KCgmz/BmnShrGlDf9JSEjQyJEj1ahRI9WoUUMtW7ZMN0wusyFMe/fu1auvvqrAwEAFBASoe/fu+uOPPzK8ZuvWrercubNq1aqlhg0batKkSUpJSbnlz0+SgoODdeHCBW3bti3d8kOHDul///ufWrVqleE169atU/v27eXv7287jiVLlki6/vvXrFkzSdKQIUNsP6vBgwfr5Zdf1ogRIxQQEKDg4GClpKSkG8LUq1cv1axZU8eOHbO914wZM1StWjXt2LHjtscCwHFQIADYzRdffKHOnTurZMmSmjx5soYMGaI9e/boxRdf1NmzZyVdH6fdqVMnSdLkyZP1+uuva+7cufrll19uut958+bpk08+Uc+ePTV//ny1a9dOERER+uCDDyRdH1YhSc8995ztzzdasmSJBg0apOrVqys8PFxdu3bVRx99pHfffTfddqmpqbp27ZquXbum5ORknT17Vp999pk+//xztWjRQh4eHpKknTt3qlOnTnJ3d9fUqVP11ltvaceOHerYsaMSEhKyfKwzZsxQly5dNHHiRDVs2FBRUVEKCQnR2bNnNWHCBI0ZM0bR0dFq166d7Wf5zTffaNKkSQoNDVVERIR69uypL7/8UqNHj5YkRUdHq0ePHqpRo4Y++OADjRkzRlFRUeratWu6QpDGarWqe/fu+vDDD/X8889r9uzZatmypaZOnZphqNOaNWu0fv16vf3225o8ebL++ecfvf766ze9CLZardq8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+6tr1662Y01JSdH8+fP122+/qUePHnd8rGl69OihkJAQdevWTe3atVOePHm0bNkyrVu3TtOnT5d0fQ7EiBEjNGHCBDVq1EgXL15UeHi4ypUrp6pVq8rV1VXvvfeeevbsqQ4dOsjZ2VlLly6Vm5ubmjZtmuE9GzVqpMDAQL399ts6ffq0qlatqh07dmjevHlq27btXX9nRO3atdWnTx9NnTpVf/75p55++ml5e3vrjz/+UEREhBITE23lolKlSmrbtq2mT5+uq1evqm7dujp48KDCw8MVGBh4R18S+G9NmzbVnDlzNGfOHNWqVUs//PBDukejuru7257Y5erqKl9fX0VFRenzzz/X448/nuk+BwwYoFdffVVdu3ZV+/btlZycrLlz5yopKclW9LJL2bJlVbNmTc2ZMyfd08Fu5Ofnp6+//lrVq1dXiRIltHv3bs2dO1cWi8U2RyTtYQRbt25VxYoVVatWLaMMO3bs0OLFi9WvXz+VK1dOffv21dq1azV48GAtXbr0rooJgNxFgQCQY44fP57pt9U+99xzevjhh/XMM88oX758mjNnjnr27Kn8+fPr0UcfVf/+/W1j2X18fBQREaGJEyeqd+/eKly4sLp166YPPvjgpmOu+/TpIzc3N61YsUIzZ86Up6engoKCNGDAANs23bt316xZs9SlS5dM5w2EhobKw8NDERERtm/T7dKli7p06WJ07G+//baeeeYZjRo1Sp9++qkeeeQRRUREKDw8XL1795arq6uqV6+uBQsW2J70cyfHmqZq1apasmSJpkyZooEDB8pqtapKlSqaOXOm7dPmkJAQJScna+nSpfr444/l7u6uBg0a6M0335Srq6uqVq2q2bNna+bMmerfv79SUlJUo0YNzZ8/P9MhVBaLRXPmzNH06dMVGRmpc+fOqUyZMurfv3+mQ6nuRFhYmB588EHbN1LHxcWpZMmSatKkibp3766SJUvath0zZox8fHy0YsUKzZs3T8WKFVPHjh3Vo0ePW95xMtGtWzedO3dOERERSk5OVpMmTTRmzBiFhYXZthk1apSmTp2q+fPn68yZMypcuLCee+65mz5lqEGDBlqwYIGmT5+u/v37y83NTXXq1NGECRNsT6/KTsHBwdq7d2+mw+jSjB8/3jZ/Q5LKlSund955R1999ZV27dol6frdmFdeeUXLli3Tpk2bbA8B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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# plot confusion matrix\n", "plot_model(best, plot = 'confusion_matrix')" ] }, { "cell_type": "code", "execution_count": 10, "id": "9fc4b9b1", "metadata": {}, "outputs": [ { "data": { "text/html": [], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# plot AUC\n", "plot_model(best, plot = 'auc')" ] }, { "cell_type": "code", "execution_count": 11, "id": "bbc790e4", "metadata": {}, "outputs": [ { "data": { "text/html": [], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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jh49quPHjys2NlbS9aedFIQbgT8vdeXFjUAtSaVLl5YkNWjQwLrsRrC+ePFitu2CgoKs31ssFnXs2FHh4eG6cuWKoqOjVbFixWz7lqRnn31W//73v7Vv3z61bt06x/u7neDgYGsNR44c0a+//mqdOvTX83zzMW+E3BvThfbs2SMHB4dsU23s7Oy0bNkySdLWrVt15coVtWvXLtv5vdH+p59+umNgX7lypVauXJltWbFixdSxY0e9//77t9wmOjpafn5+1rB+w7PPPquQkBAdOXJEXl5etz0mAPMgsANAAXJ0dJSvr+9t11+4cEGSNH78eI0fPz7H+tOnT0uSzp07p/fff18bN26UxWKRp6en/P39JRXcM7NdXFzyXFdeuLq65ljm7Ox81+3+Oi2jdOnSMgxDFy9e1B9//CEPD48c25QpU0ZS9vB/8/u7nePHj2vs2LHavn27HBwcVL16ddWqVUtSzvPs5OSU7bWdnZ21zYULF+Tu7i47u1vPNL1xfgcMGHDL9Xc7v23btrX+1MFiscjZ2VkVK1bMUdPN/vjjj1tOlbnVuQJgbgR2AChEJUqUkCSNHDnylo/SK1mypCRpxIgROnLkiBYuXCg/Pz85OjoqLS1NX3311V2P8debGHNz02hu6yoMFy5csIZK6fpcbHt7e7m7u6tkyZL69ddfc2xz5swZSdLf/va3XB8nKytLAwYMkIODg/7973+rdu3aKlasmBISErRq1ao81ezm5qYLFy7IMAxZLBbr8ri4OBmGYT2/YWFht3y8583v91bc3d3v+EHwVkqWLGk9LzfLz7kCULS46RQAClH16tVVunRpJSUlydfX1/r16KOPasaMGYqLi5N0fYrF448/rmbNmsnR0VHS9WkV0vWgKUn29vY59u/q6prjJs49e/YUWF2FYePGjdbvDcPQ999/r8aNG8vR0VFNmjRRcnKyYmJism2zevVqOTg4qH79+rfd71/P1/nz53X06FF169ZNvr6+Klbs+hjWX89zbvj7+ysjI8O67Y3aQ0JCNH/+fDVo0EAODg5KSUnJdn6LFSummTNn3penszRp0kQxMTFKTk7Otnz16tXy8PCQp6enJN32pwIAzIMRdgAoRPb29nrzzTc1duxY2dvbq23btrp48aIiIiKUkpJivWG1fv36WrNmjerWraty5cpp7969+uijj2SxWJSWlibp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2EmVL19ejzzySKEcE4UvPT1dp06dop8fcvSz7aCvbQP9fHtV5abl2+7ernEtL9W+DyPsCQkJuW5rqsDeqFEj6/f16tXTuXPnFBMTo99++03Lly+3rsvIyFBAQECO7S0Wi1588UWtW7dOe/fu1dGjR7V//35lZWXdU12JiYm6cOFCtmk1WVlZunLlis6fPy9JKl26tFxdXa3rXV1dde3aNUlSfHx8tg8NJUuWVLVq1e54zCpVqli/d3NzU3p63n6MZbFY5OLikqdt7kVJXZWnu0uhHhOFKzXVXqmn6OeHHf1sO+hr20A/3161Uq4au35fjhtOb+ZVxk0dat+fOex52aepAruDg4P1+xsh29nZWf3791dgYGC2tjdGpW+WlZWlfv366eLFi+rUqZPatWunjIwMDR069J7qunbtmqpXr66IiIgc69zc3CTd+kcaN24mtbe3z3Fj6d1uNLWze+Af4AMAAGBaFotFU59ppB6Ltt7yxlM7i0X/7NyoyG84lUz2WMeb51zv379fZcuWVY0aNZSUlCRPT0/r1/Lly7V161ZJ2T+dJCQkaNeuXVq4cKEGDRqkNm3a6PTp05Lu7Uks1apV08mTJ1WqVClrDUlJSZo9e3auOtHLy0sHDhywvr58+bJ+/fVX62sz/EUAAACwNUG+VfRVn8fkVcYt23KvMm76qs9jCvKtcpstC5epRthDQ0M1adIkXbp0SR988IFefvllNW/eXD179pSvr6/atGmjzZs3a+HChVq0aJGk6yPwp0+fVlJSkkqUKCE7Ozt98803ateunWJjY603o169ejXfdQUEBKhixYp655139Oabb+rSpUsaM2aM/v73v8ve3v6u2/fq1Uvvv/++atWqpRo1auiDDz5QamqqNag7Ozvr8OHDSklJ0aOPPprvOgEAAJA3Qb5VFFivsn48clqnLqapQklnBVTjN53eVqdOnTRw4EC99dZb6t69uwYMGKCGDRtq2rRp+vLLL9WpUyd99dVXmjFjhpo0aSJJ6tixo7KysvT000/LwcFB48aN08cff6zOnTvro48+0ujRo1WsWDHFxcXluy57e3vNmzdPWVlZ6tGjh9544w21bt1ao0ePztX2Tz/9tPr166f3339f3bt3V8WKFVWxYkXrFKDnnntOR48e1bPPPvtQPJMdAADgQWKxWPRYjUf1vF9Vtar+qKnCuiRZ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j49PrtuHh4erXbt2d2zj4+OjqKiofNWTn5oK0/nz5xUZGVnUZQCwUQR2ADCpbt266cCBA0pMTMyxLj09Xd9++626deuWr3136tRJ27Ztu9cSbca0adO0evXqoi4DgI0isAOAST3xxBNyc3PTmjVrcqzbuHGj0tLSFBgYmK99Ozk5ycPD4x4rtB2GYRR1CQBsGIEdAEzKyclJTz/9tNauXZtj3YoVK9S6dWt5eHjol19+0cCBA9WkSRPVq1dP7du314IFC6xtw8PD9fLLL+vNN99Uo0aNNHHixBzTT+62jxvmzp2rZs2aqVGjRhoxYoQuXLhw2/p/+OEHdenSRfXr11fHjh31r3/9S1evXs31+w8ODtbIkSM1adIk+fv7q2nTppo9e7YSExP10ksvqX79+nrmmWe0b98+6zY+Pj5asmSJevToIV9fXz3zzDPatGlTtv3+5z//UY8ePeTn56eAgABNmTJFV65cybaP2bNnq23btgoICNDbb7+tFStWKDo62nrO/vjjD40ePVqtWrVS3bp11aJFC40ePVppaWmSpJ07d6pOnTrasmWLOnfurHr16unJJ5/Uxo0brccxDEOLFi3SE088ofr16+fo65SUFL355pvy9/dXs2bNNGjQIB07dizX5w/Aw4PADgAm1rVrV504cUIxMTHWZWfOnNHPP/+s7t27Ky0tTf369ZO7u7uWLVumtWvX6sknn9TUqVN18OBB6za7du1SmTJltGrVKvXq1SvbMXK7j+TkZO3YsUOfffaZPvzwQ8XGxiokJOSWdW/dulXDhw9Xjx49tHbtWr3//vtav3693nnnnTy9/3Xr1sne3l5RUVHq27ev5s6dq0GDBunVV19VZGSkHnnkEY0fPz7bNmFhYXruuee0atUqtW7dWkOHDtXevXslSRs2bNDgwYPVpk0bRUVFafz48Vq3bp3eeuutbPv48ssvNXv2bM2ZM0fjxo3TU089JT8/P+s0ouDgYMXFxWnOnDn67rvvFBISopUrV2r58uXWfWRmZmr69Ol67733tHbtWnl7e2vUqFH6888/JUmffPKJZs2apddee01r167VCy+8oJEjR2rHjh1KTU219tMXX3yhzz//XH/729/Uo0cPpaSk5OkcAngIGAAAU+vcubMxfvx46+tPPvnECAgIMK5du2acPXvWmD9/vnH58mXr+itXrhje3t7G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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# plot feature importance\n", "plot_model(best, plot = 'feature')" ] }, { "cell_type": "code", "execution_count": 12, "id": "da718984", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Help on function plot_model in module pycaret.classification.functional:\n", "\n", "plot_model(estimator, plot: str = 'auc', scale: float = 1, save: bool = False, fold: Union[int, Any, NoneType] = None, fit_kwargs: Union[dict, NoneType] = None, plot_kwargs: Union[dict, NoneType] = None, groups: Union[str, Any, NoneType] = None, verbose: bool = True, display_format: Union[str, NoneType] = None) -> Union[str, NoneType]\n", " This function analyzes the performance of a trained model on holdout set.\n", " It may require re-training the model in certain cases.\n", " \n", " Example\n", " -------\n", " >>> from pycaret.datasets import get_data\n", " >>> juice = get_data('juice')\n", " >>> from pycaret.classification import *\n", " >>> exp_name = setup(data = juice, target = 'Purchase')\n", " >>> lr = create_model('lr')\n", " >>> plot_model(lr, plot = 'auc')\n", " \n", " \n", " estimator: scikit-learn compatible object\n", " Trained model object\n", " \n", " \n", " plot: str, default = 'auc'\n", " List of available plots (ID - Name):\n", " \n", " * 'pipeline' - Schematic drawing of the preprocessing pipeline\n", " * 'auc' - Area Under the Curve\n", " * 'threshold' - Discrimination Threshold\n", " * 'pr' - Precision Recall Curve\n", " * 'confusion_matrix' - Confusion Matrix\n", " * 'error' - Class Prediction Error\n", " * 'class_report' - Classification Report\n", " * 'boundary' - Decision Boundary\n", " * 'rfe' - Recursive Feature Selection\n", " * 'learning' - Learning Curve\n", " * 'manifold' - Manifold Learning\n", " * 'calibration' - Calibration Curve\n", " * 'vc' - Validation Curve\n", " * 'dimension' - Dimension Learning\n", " * 'feature' - Feature Importance\n", " * 'feature_all' - Feature Importance (All)\n", " * 'parameter' - Model Hyperparameter\n", " * 'lift' - Lift Curve\n", " * 'gain' - Gain Chart\n", " * 'tree' - Decision Tree\n", " * 'ks' - KS Statistic Plot\n", " \n", " \n", " scale: float, default = 1\n", " The resolution scale of the figure.\n", " \n", " \n", " save: bool, default = False\n", " When set to True, plot is saved in the current working directory.\n", " \n", " \n", " fold: int or scikit-learn compatible CV generator, default = None\n", " Controls cross-validation. If None, the CV generator in the ``fold_strategy``\n", " parameter of the ``setup`` function is used. When an integer is passed,\n", " it is interpreted as the 'n_splits' parameter of the CV generator in the\n", " ``setup`` function.\n", " \n", " \n", " fit_kwargs: dict, default = {} (empty dict)\n", " Dictionary of arguments passed to the fit method of the model.\n", " \n", " \n", " plot_kwargs: dict, default = {} (empty dict)\n", " Dictionary of arguments passed to the visualizer class.\n", " - pipeline: fontsize -> int\n", " \n", " \n", " groups: str or array-like, with shape (n_samples,), default = None\n", " Optional group labels when GroupKFold is used for the cross validation.\n", " It takes an array with shape (n_samples, ) where n_samples is the number\n", " of rows in training dataset. When string is passed, it is interpreted as\n", " the column name in the dataset containing group labels.\n", " \n", " \n", " verbose: bool, default = True\n", " When set to False, progress bar is not displayed.\n", " \n", " \n", " display_format: str, default = None\n", " To display plots in Streamlit (https://www.streamlit.io/), set this to 'streamlit'.\n", " Currently, not all plots are supported.\n", " \n", " \n", " Returns:\n", " Path to saved file, if any.\n", " \n", " \n", " Warnings\n", " --------\n", " - Estimators that does not support 'predict_proba' attribute cannot be used for\n", " 'AUC' and 'calibration' plots.\n", " \n", " - When the target is multiclass, 'calibration', 'threshold', 'manifold' and 'rfe'\n", " plots are not available.\n", " \n", " - When the 'max_features' parameter of a trained model object is not equal to\n", " the number of samples in training set, the 'rfe' plot is not available.\n", "\n" ] } ], "source": [ "# check docstring to see available plots \n", "help(plot_model)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "6bd66179", "metadata": {}, "source": [ "An alternate to `plot_model` function is `evaluate_model`. It can only be used in Notebook since it uses ipywidget." ] }, { "cell_type": "code", "execution_count": 13, "id": "c75f07a8", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "012aa1cc546c4300b75a6d5dda58eb14", "version_major": 2, "version_minor": 0 }, "text/plain": [ "interactive(children=(ToggleButtons(description='Plot Type:', icons=('',), options=(('Pipeline Plot', 'pipelin…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "evaluate_model(best)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "954cbeff", "metadata": {}, "source": [ "## Prediction\n", "The `predict_model` function returns `prediction_label` and `prediction_score` (probability of the predicted class) as new columns in dataframe. When data is `None` (default), it uses the test set (created during the setup function) for scoring." ] }, { "cell_type": "code", "execution_count": 14, "id": "87c1a007", "metadata": {}, "outputs": [ { "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", "
 ModelAccuracyAUCRecallPrec.F1KappaMCC
0Logistic Regression0.97780.99850000.96670.9674
\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# predict on test set\n", "holdout_pred = predict_model(best)" ] }, { "cell_type": "code", "execution_count": 15, "id": "5c01ac77", "metadata": {}, "outputs": [ { "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", "
sepal_lengthsepal_widthpetal_lengthpetal_widthspeciesprediction_labelprediction_score
1056.32.54.91.5Iris-versicolorIris-versicolor0.5204
1067.23.26.01.8Iris-virginicaIris-virginica0.9503
1075.52.43.81.1Iris-versicolorIris-versicolor0.9334
1086.73.14.71.5Iris-versicolorIris-versicolor0.7321
1097.73.86.72.2Iris-virginicaIris-virginica0.9952
\n", "
" ], "text/plain": [ " sepal_length sepal_width petal_length petal_width species \\\n", "105 6.3 2.5 4.9 1.5 Iris-versicolor \n", "106 7.2 3.2 6.0 1.8 Iris-virginica \n", "107 5.5 2.4 3.8 1.1 Iris-versicolor \n", "108 6.7 3.1 4.7 1.5 Iris-versicolor \n", "109 7.7 3.8 6.7 2.2 Iris-virginica \n", "\n", " prediction_label prediction_score \n", "105 Iris-versicolor 0.5204 \n", "106 Iris-virginica 0.9503 \n", "107 Iris-versicolor 0.9334 \n", "108 Iris-versicolor 0.7321 \n", "109 Iris-virginica 0.9952 " ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# show predictions df\n", "holdout_pred.head()" ] }, { "attachments": {}, "cell_type": "markdown", "id": "d4baf825", "metadata": {}, "source": [ "The same function works for predicting the labels on unseen dataset. Let's create a copy of original data and drop the `Class variable`. We can then use the new data frame without labels for scoring." ] }, { "cell_type": "code", "execution_count": 16, "id": "fb1cb86d", "metadata": {}, "outputs": [ { "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", "
sepal_lengthsepal_widthpetal_lengthpetal_width
05.13.51.40.2
14.93.01.40.2
24.73.21.30.2
34.63.11.50.2
45.03.61.40.2
\n", "
" ], "text/plain": [ " sepal_length sepal_width petal_length petal_width\n", "0 5.1 3.5 1.4 0.2\n", "1 4.9 3.0 1.4 0.2\n", "2 4.7 3.2 1.3 0.2\n", "3 4.6 3.1 1.5 0.2\n", "4 5.0 3.6 1.4 0.2" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# copy data and drop Class variable\n", "\n", "new_data = data.copy()\n", "new_data.drop('species', axis=1, inplace=True)\n", "new_data.head()" ] }, { "cell_type": "code", "execution_count": 17, "id": "c5803df9", "metadata": {}, "outputs": [ { "data": { "text/html": [], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "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", "
sepal_lengthsepal_widthpetal_lengthpetal_widthprediction_labelprediction_score
05.13.51.40.2Iris-setosa0.9775
14.93.01.40.2Iris-setosa0.9678
24.73.21.30.2Iris-setosa0.9820
34.63.11.50.2Iris-setosa0.9719
45.03.61.40.2Iris-setosa0.9813
\n", "
" ], "text/plain": [ " sepal_length sepal_width petal_length petal_width prediction_label \\\n", "0 5.1 3.5 1.4 0.2 Iris-setosa \n", "1 4.9 3.0 1.4 0.2 Iris-setosa \n", "2 4.7 3.2 1.3 0.2 Iris-setosa \n", "3 4.6 3.1 1.5 0.2 Iris-setosa \n", "4 5.0 3.6 1.4 0.2 Iris-setosa \n", "\n", " prediction_score \n", "0 0.9775 \n", "1 0.9678 \n", "2 0.9820 \n", "3 0.9719 \n", "4 0.9813 " ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# predict model on new_data\n", "predictions = predict_model(best, data = new_data)\n", "predictions.head()" ] }, { "attachments": {}, "cell_type": "markdown", "id": "e4384735", "metadata": {}, "source": [ "## Save Model" ] }, { "attachments": {}, "cell_type": "markdown", "id": "cd63f053", "metadata": {}, "source": [ "Finally, you can save the entire pipeline on disk for later use, using pycaret's `save_model` function." ] }, { "cell_type": "code", "execution_count": 18, "id": "4181de41", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Transformation Pipeline and Model Successfully Saved\n" ] }, { "data": { "text/plain": [ "(Pipeline(memory=FastMemory(location=C:\\Users\\owner\\AppData\\Local\\Temp\\joblib),\n", " steps=[('label_encoding',\n", " TransformerWrapperWithInverse(exclude=None, include=None,\n", " transformer=LabelEncoder())),\n", " ('numerical_imputer',\n", " TransformerWrapper(exclude=None,\n", " include=['sepal_length', 'sepal_width',\n", " 'petal_length', 'petal_width'],\n", " transformer=SimpleImputer(add_indicator=F...\n", " fill_value=None,\n", " missing_values=nan,\n", " strategy='most_frequent',\n", " verbose='deprecated'))),\n", " ('trained_model',\n", " LogisticRegression(C=1.0, class_weight=None, dual=False,\n", " fit_intercept=True, intercept_scaling=1,\n", " l1_ratio=None, max_iter=1000,\n", " multi_class='auto', n_jobs=None,\n", " penalty='l2', random_state=123,\n", " solver='lbfgs', tol=0.0001, verbose=0,\n", " warm_start=False))],\n", " verbose=False),\n", " 'my_first_pipeline.pkl')" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# save pipeline\n", "save_model(best, 'my_first_pipeline')" ] }, { "cell_type": "code", "execution_count": 19, "id": "40ed5152", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Transformation Pipeline and Model Successfully Loaded\n" ] }, { "data": { "text/html": [ "
Pipeline(memory=FastMemory(location=C:\\Users\\owner\\AppData\\Local\\Temp\\joblib),\n",
       "         steps=[('label_encoding',\n",
       "                 TransformerWrapperWithInverse(exclude=None, include=None,\n",
       "                                               transformer=LabelEncoder())),\n",
       "                ('numerical_imputer',\n",
       "                 TransformerWrapper(exclude=None,\n",
       "                                    include=['sepal_length', 'sepal_width',\n",
       "                                             'petal_length', 'petal_width'],\n",
       "                                    transformer=SimpleImputer(add_indicator=F...\n",
       "                                                              fill_value=None,\n",
       "                                                              missing_values=nan,\n",
       "                                                              strategy='most_frequent',\n",
       "                                                              verbose='deprecated'))),\n",
       "                ('trained_model',\n",
       "                 LogisticRegression(C=1.0, class_weight=None, dual=False,\n",
       "                                    fit_intercept=True, intercept_scaling=1,\n",
       "                                    l1_ratio=None, max_iter=1000,\n",
       "                                    multi_class='auto', n_jobs=None,\n",
       "                                    penalty='l2', random_state=123,\n",
       "                                    solver='lbfgs', tol=0.0001, verbose=0,\n",
       "                                    warm_start=False))],\n",
       "         verbose=False)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "Pipeline(memory=FastMemory(location=C:\\Users\\owner\\AppData\\Local\\Temp\\joblib),\n", " steps=[('label_encoding',\n", " TransformerWrapperWithInverse(exclude=None, include=None,\n", " transformer=LabelEncoder())),\n", " ('numerical_imputer',\n", " TransformerWrapper(exclude=None,\n", " include=['sepal_length', 'sepal_width',\n", " 'petal_length', 'petal_width'],\n", " transformer=SimpleImputer(add_indicator=F...\n", " fill_value=None,\n", " missing_values=nan,\n", " strategy='most_frequent',\n", " verbose='deprecated'))),\n", " ('trained_model',\n", " LogisticRegression(C=1.0, class_weight=None, dual=False,\n", " fit_intercept=True, intercept_scaling=1,\n", " l1_ratio=None, max_iter=1000,\n", " multi_class='auto', n_jobs=None,\n", " penalty='l2', random_state=123,\n", " solver='lbfgs', tol=0.0001, verbose=0,\n", " warm_start=False))],\n", " verbose=False)" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# load pipeline\n", "loaded_best_pipeline = load_model('my_first_pipeline')\n", "loaded_best_pipeline" ] }, { "attachments": {}, "cell_type": "markdown", "id": "b2c7d62e", "metadata": {}, "source": [ "# 👇 Detailed function-by-function overview" ] }, { "attachments": {}, "cell_type": "markdown", "id": "e05937f5", "metadata": {}, "source": [ "## ✅ Setup\n", "This function initializes the experiment in PyCaret and creates the transformation pipeline based on all the parameters passed in the function. Setup function must be called before executing any other function. It takes two required parameters: `data` and `target`. All the other parameters are optional and are used for configuring data preprocessing pipeline." ] }, { "cell_type": "code", "execution_count": 20, "id": "24e503be", "metadata": {}, "outputs": [ { "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", "
 DescriptionValue
0Session id123
1Targetspecies
2Target typeMulticlass
3Target mappingIris-setosa: 0, Iris-versicolor: 1, Iris-virginica: 2
4Original data shape(150, 5)
5Transformed data shape(150, 5)
6Transformed train set shape(105, 5)
7Transformed test set shape(45, 5)
8Numeric features4
9PreprocessTrue
10Imputation typesimple
11Numeric imputationmean
12Categorical imputationmode
13Fold GeneratorStratifiedKFold
14Fold Number10
15CPU Jobs-1
16Use GPUFalse
17Log ExperimentFalse
18Experiment Nameclf-default-name
19USI35bc
\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "s = setup(data, target = 'species', session_id = 123)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "924d198b", "metadata": {}, "source": [ "To access all the variables created by the setup function such as transformed dataset, random_state, etc. you can use `get_config` method." ] }, { "cell_type": "code", "execution_count": 21, "id": "76128b08", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'USI',\n", " 'X',\n", " 'X_test',\n", " 'X_test_transformed',\n", " 'X_train',\n", " 'X_train_transformed',\n", " 'X_transformed',\n", " '_available_plots',\n", " '_ml_usecase',\n", " 'data',\n", " 'dataset',\n", " 'dataset_transformed',\n", " 'exp_id',\n", " 'exp_name_log',\n", " 'fix_imbalance',\n", " 'fold_generator',\n", " 'fold_groups_param',\n", " 'fold_shuffle_param',\n", " 'gpu_n_jobs_param',\n", " 'gpu_param',\n", " 'html_param',\n", " 'idx',\n", " 'is_multiclass',\n", " 'log_plots_param',\n", " 'logging_param',\n", " 'memory',\n", " 'n_jobs_param',\n", " 'pipeline',\n", " 'seed',\n", " 'target_param',\n", " 'test',\n", " 'test_transformed',\n", " 'train',\n", " 'train_transformed',\n", " 'variable_and_property_keys',\n", " 'variables',\n", " 'y',\n", " 'y_test',\n", " 'y_test_transformed',\n", " 'y_train',\n", " 'y_train_transformed',\n", " 'y_transformed'}" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# check all available config\n", "get_config()" ] }, { "cell_type": "code", "execution_count": 22, "id": "dbc43292", "metadata": {}, "outputs": [ { "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", "
sepal_lengthsepal_widthpetal_lengthpetal_width
05.02.03.51.0
15.43.91.30.4
25.63.04.11.3
37.42.86.11.9
44.63.41.40.3
...............
1006.62.94.61.3
1014.52.31.30.3
1024.83.01.40.1
1035.43.41.70.2
1046.23.45.42.3
\n", "

105 rows × 4 columns

\n", "
" ], "text/plain": [ " sepal_length sepal_width petal_length petal_width\n", "0 5.0 2.0 3.5 1.0\n", "1 5.4 3.9 1.3 0.4\n", "2 5.6 3.0 4.1 1.3\n", "3 7.4 2.8 6.1 1.9\n", "4 4.6 3.4 1.4 0.3\n", ".. ... ... ... ...\n", "100 6.6 2.9 4.6 1.3\n", "101 4.5 2.3 1.3 0.3\n", "102 4.8 3.0 1.4 0.1\n", "103 5.4 3.4 1.7 0.2\n", "104 6.2 3.4 5.4 2.3\n", "\n", "[105 rows x 4 columns]" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# lets access X_train_transformed\n", "get_config('X_train_transformed')" ] }, { "cell_type": "code", "execution_count": 23, "id": "ef9cd061", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The current seed is: 123\n", "The new seed is: 786\n" ] } ], "source": [ "# another example: let's access seed\n", "print(\"The current seed is: {}\".format(get_config('seed')))\n", "\n", "# now lets change it using set_config\n", "set_config('seed', 786)\n", "print(\"The new seed is: {}\".format(get_config('seed')))" ] }, { "attachments": {}, "cell_type": "markdown", "id": "7afbe41d", "metadata": {}, "source": [ "All the preprocessing configurations and experiment settings/parameters are passed into the `setup` function. To see all available parameters, check the docstring:" ] }, { "cell_type": "code", "execution_count": 24, "id": "2885a14f", "metadata": {}, "outputs": [], "source": [ "# help(setup)" ] }, { "cell_type": "code", "execution_count": 25, "id": "34ae0fce", "metadata": {}, "outputs": [ { "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", "
 DescriptionValue
0Session id123
1Targetspecies
2Target typeMulticlass
3Target mappingIris-setosa: 0, Iris-versicolor: 1, Iris-virginica: 2
4Original data shape(150, 5)
5Transformed data shape(150, 5)
6Transformed train set shape(105, 5)
7Transformed test set shape(45, 5)
8Numeric features4
9PreprocessTrue
10Imputation typesimple
11Numeric imputationmean
12Categorical imputationmode
13NormalizeTrue
14Normalize methodminmax
15Fold GeneratorStratifiedKFold
16Fold Number10
17CPU Jobs-1
18Use GPUFalse
19Log ExperimentFalse
20Experiment Nameclf-default-name
21USI3b39
\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# init setup with normalize = True\n", "\n", "s = setup(data, target = 'species', session_id = 123,\n", " normalize = True, normalize_method = 'minmax')" ] }, { "cell_type": "code", "execution_count": 26, "id": "04204ae7", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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bfJDSyNiaaXHAAA+xp1MAADSiUwAANKJTAAA0olMAADSiUwAANKJTAAA0olMAADSiUwAANKJTAAA0olMAADSiUwAANKJTAAA0olMAADSiUwAANKJTAAA0olMAADSiUwAANKJTAAA0olMAADSiUwAANKJTAAA0olMAADSiUwAANKJTAAA0olMAADSiUwAANKJTAAA0olMAADSiUwAANKJTAAA0olMAADSiUwAANKJTAAA0olMAADSiUwAANKJTAAA0olMAADSiUwAANKJTAAA0olMAADSiUwAANKJTAAA0olMAADSiUwAANKJTAAA0olMAADSiUwAANKJTAAA0olMAADSiUwAANKJTAAA0olMAADS9av0AJU0+aGlEbG00mMA0IP1nfVApUfoVgunj6v0CPRS7mQCAJBOZAIAkE5kAgCQTmQCAJBOZAIAkE5kAgCQTmQCAJBOZAIAkE5kAgCQTmQCAJBOZAIAkC41Mp955pnYa6+9Or3NnDkz8xIAAFSBfpkP1tjYGIccckhcffXVHccGDBiQeQkAAKpAamSuXLkyxowZE8OGDct8WAAAqkzqy+UrV66MkSNHZj4kAABVKC0yi6KIN998M1588cU44ogj4rDDDosbbrgh2tvbsy4BAECVSHu5fPXq1dHa2hq1tbVx8803xzvvvBPXXHNNrFu3Li677LIuPUZRFNHS0pI10la1traW5ToA0NP5M7F6bdpduXZYFEXU1NR06dy0yNx9991jwYIF8fnPfz5qampi7NixsXHjxrj44otj9uzZ0bdv3099jPXr18eyZcuyRgIAuqCpqanSI/AZlXOHtbW1XTov9S/+DBkypNP7e+yxR7S1tcU///nP2GmnnT714/v37x+jR4/OHGmL/lv8S8tyLQDoyUaOHBl1dXWVHoNt0NraGk1NTWXbYWNjY5fPTYvMP/zhD3HRRRfFCy+80PGbXLZsWQwZMqRLgRkRUVNTE4MGDcoaCQDogrq6On/+Vrly7bCrL5VHJP7Fn/r6+hgwYEBcdtll8cYbb8Tvfve7uP766+PMM8/MugQAAFUi7U7m4MGD45577onvf//7ccIJJ8TnPve5mDZtmsgEANgOpX5N5p577hn33Xdf5kMCAFCFUr8ZOwAARIhMAAC6gcgEACCdyAQAIJ3IBAAgncgEACCdyAQAIJ3IBAAgncgEACCdyAQAIJ3IBAAgXerPLgcAqsvkh5ZGxNJKj9Gt/vOj/6n0CNsldzIBAEgnMgEASCcyAQBIJzIBAEgnMgEASCcyAQBIJzIBAEgnMgEASCcyAQBIJzIBAEgnMgEASCcyAQBIJzIBAEgnMgEASCcyAQBIJzIBAEgnMgEASCcyAQBIJzIBAEgnMgEASCcyAQBIJzIBAEgnMgEASCcyAQBIJzIBAEgnMgEASCcyAQBIJzIBAEgnMgEASCcyAQBIJzIBAEgnMgEASCcyAQBIJzIBAEjXr9IDAAB0p76zHqj0CN1q4fRxlR7hE7mTCQBAOpEJAEA6kQkAQDqRCQBAOpEJAEA6kQkAQDqRCQBAOpEJAEA6kQkAQDqRCQBAOpEJAEA6kQkAQDqRCQBAOpEJAEA6kQkAQDqRCQBAOpEJAEA6kQkAQDqRCQBAOpEJAEA6kQkAQDqRCQBAOpEJAEA6kQkAQDqRCQBAOpEJAEA6kQkAQDqRCQBAOpEJAEC61Mhsa2uLSy+9NA444IA46KCD4t577818eAAAqkS/zAe7/vrr47XXXov7778/Vq9eHZdccknstttuceSRR2ZeBgCAHi4tMltaWuLxxx+Pu+++O/bZZ5/YZ599oqGhIR588EGRCQCwnUl7uXz58uWxYcOGqK+v7zg2adKkWLx4cWzcuDHrMgAAVIG0O5nNzc2x4447Rm1tbcexoUOHRltbW7z//vux0047bfXj169fH0VRxJIlS7JG2qqiKOL/fn10Wa4FANCdGhoaoqamptuvs379+i5fJy0yW1tbOwVmRHS8397e/qkfv2ngcvwL2nSd/7PT4LJcCwCgN6ipqSl/ZA4YMGCzmNz0/sCBAz/14z/6MjsAANUt7Wsyhw8fHmvXro0NGzZ0HGtubo6BAwfGDjvskHUZAACqQFpkjh07Nvr16xevvvpqx7FFixbF+PHjo08f3/MdAGB7klZ/dXV1cdxxx8VVV10VS5YsiWeffTbuvffeOO2007IuAQBAlagpiqLIerDW1ta46qqr4umnn47BgwfHGWecETNmzMh6eAAAqkRqZAIAQETyzy4HAIAIkQkAQDcQmQAApOvVkdnW1haXXnppHHDAAXHQQQfFvffeu8Vzly5dGt/4xjdiwoQJccIJJ8Rrr71WxknZklJ2+MILL8SUKVOivr4+jj322HjuuefKOClbUsoON3nnnXeivr4+FixYUIYJ+TSl7HDFihVx8sknx3777RfHHntszJ8/v4yT8klK2d8zzzwTRx11VNTX18fJJ58cr7/+ehkn5dO0t7fHMcccs9XPjT2pZ3p1ZF5//fXx2muvxf333x9XXnll3HrrrfGb3/xms/NaWlri7LPPjgMOOCCeeOKJqK+vj3POOSdaWloqMDUf1dUdLl++PM4777w44YQT4sknn4xp06bFBRdcEMuXL6/A1HxUV3f4UVdddZXnXw/S1R1+8MEHcfrpp8fo0aPj17/+dRx++OFx3nnnxd///vcKTM0mXd1fQ0NDzJo1K84555x46qmnYuzYsXHOOedEa2trBabm49ra2uLCCy+MhoaGLZ7T43qm6KX+/e9/F+PHjy/mz5/fcey2224rTj311M3Offzxx4uvfe1rxcaNG4uiKIqNGzcWhx9+eDFv3ryyzcvmStnhnDlzijPOOKPTsdNPP7248cYbu31OtqyUHW7y1FNPFdOmTSvGjBnT6eOojFJ2eP/99xeHHXZYsWHDho5jxx9/fPHCCy+UZVY2V8r+7rvvvmLq1Kkd73/wwQfFmDFjiiVLlpRlVrasoaGh+PrXv14ce+yxW/3c2NN6ptfeyVy+fHls2LCh089EnzRpUixevDg2btzY6dzFixfHpEmTOn7ge01NTey///6dfnoR5VfKDqdOnRoXXXTRZo/xwQcfdPucbFkpO4yIWLt2bcyZMye+973vlXNMtqKUHS5cuDAOPfTQ6Nu3b8exefPmxVe/+tWyzUtnpexvyJAh0djYGIsWLYqNGzfGE088EYMHD44vfvGL5R6bj1m4cGEceOCB8eijj271vJ7WM/0qctUyaG5ujh133DFqa2s7jg0dOjTa2tri/fffj5122qnTuaNHj+708TvvvPNWb0nT/UrZ4R577NHpYxsaGuKll16KadOmlW1eNlfKDiMifvjDH8bUqVNjzz33LPeobEEpO1y1alXst99+cfnll8fzzz8fu+++e1xyySUxadKkSoxOlLa/o48+Op5//vmYPn169O3bN/r06RN33nlnfP7zn6/E6HzE9OnTu3ReT+uZXnsns7W1tdOTKiI63m9vb+/SuR8/j/IqZYcf9Y9//CPOP//82H///ePQQw/t1hnZulJ2+Kc//SkWLVoU3/72t8s2H5+ulB22tLTEXXfdFcOGDYu77747vvSlL8UZZ5wRf/vb38o2L52Vsr+1a9dGc3NzXHHFFfHYY4/FlClTYvbs2b6mtor0tJ7ptZE5YMCAzf6lbnp/4MCBXTr34+dRXqXscJM1a9bEN7/5zSiKIn784x9Hnz699j/xqtDVHa5bty6uuOKKuPLKKz3vephSnod9+/aNsWPHxsyZM2PcuHFx8cUXx8iRI+Opp54q27x0Vsr+brjhhhgzZkyccsopse+++8bVV18ddXV1MW/evLLNy2fT03qm1/4JPHz48Fi7dm1s2LCh41hzc3MMHDgwdthhh83OXbNmTadja9asiV122aUss/LJStlhRMR7770Xp5xySrS3t8cvfvGLzV6Kpfy6usMlS5bEqlWrYubMmVFfX9/x9WNnnXVWXHHFFWWfm/+vlOfhsGHDYtSoUZ2OjRw50p3MCiplf6+//nrsvffeHe/36dMn9t5771i9enXZ5uWz6Wk902sjc+zYsdGvX79OX+y6aNGiGD9+/GZ3tyZMmBCvvPJKFP/7Y9yLooi//OUvMWHChHKOzMeUssOWlpY488wzo0+fPjF37twYPnx4maflk3R1h/vtt188/fTT8eSTT3a8RURcc801ccEFF5R5aj6qlOfhxIkTY8WKFZ2OvfHGG7H77ruXY1Q+QSn722WXXWLlypWdjr355pvxhS98oRyjkqCn9Uyvjcy6uro47rjj4qqrroolS5bEs88+G/fee2+cdtppEfHf/5Nbt25dREQceeSR8a9//SuuvfbaaGxsjGuvvTZaW1vjqKOOquRvYbtXyg7vvPPOePvtt+O6667r+LXm5mZ/u7zCurrDgQMHxogRIzq9Rfz3/8p33nnnSv4WtnulPA+nTZsWK1asiJ/85Cfx1ltvxS233BKrVq2KKVOmVPK3sF0rZX8nnXRSPPbYY/Hkk0/GW2+9FTfccEOsXr06pk6dWsnfAp+iR/dMRb5xUpm0tLQU3/nOd4qJEycWBx10UHHfffd1/NqYMWM6fd+oxYsXF8cdd1wxfvz44sQTTyxef/31CkzMx3V1h0cccUQxZsyYzd4uueSSCk3OJqU8Dz/K98nsOUrZ4Z///Odi6tSpxb777ltMmTKlWLhwYQUm5qNK2d9jjz1WHHnkkcXEiROLk08+uXjttdcqMDFb8/HPjT25Z2qK4n/vqQIAQJJe+3I5AACVIzIBAEgnMgEASCcyAQBIJzIBAEgnMgEASCcyAQBIJzIBAEgnMgEASCcyAQBIJzIBAEgnMgEASPf/AN5dpEp0fYMIAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# lets check the X_train_transformed to see effect of params passed\n", "get_config('X_train_transformed')['sepal_length'].hist()" ] }, { "attachments": {}, "cell_type": "markdown", "id": "d28a3e4e", "metadata": {}, "source": [ "Notice that all the values are between 0 and 1 - that is because we passed `normalize=True` in the `setup` function. If you don't remember how it compares to actual data, no problem - we can also access non-transformed values using `get_config` and then compare. See below and notice the range of values on x-axis and compare it with histogram above." ] }, { "cell_type": "code", "execution_count": 27, "id": "68cc1c63", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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AADSiUwAANKJTAAA0olMAADSiUwAANKJTAAA0olMAADSiUwAANKJTAAA0olMAADSiUwAANKJTAAA0olMAADSiUwAANKJTAAA0olMAADSiUwAANKJTAAA0olMAADSiUwAANKJTAAA0olMAADSiUwAANKJTAAA0olMAADSiUwAANKJTAAA0olMAADSiUwAANKJTAAA0olMAADSiUwAANKJTAAA0olMAADSiUwAANKJTAAA0olMAADSiUwAANKJTAAA0olMAADSiUwAANKJTAAA0olMAADSiUwAANKJTAAA0olMAADSiUwAANKJTAAA0olMAADSiUwAANKJTAAA0olMAADSiUwAANKJTAAA0olMAADSiUwAANKJTAAA0olMAADSiUwAANKJTAAA0olMAADSiUwAANLVHZnd3d0xe/bsuP/++3uubdiwIebMmRPTpk2LU045Je65556UTQIA0Fjqisyurq741Kc+Fe3t7T3XiqKIj33sY3HwwQfH0qVL47TTTovzzz8/Nm7cmLZZAAAaw9Ba32Ht2rUxb968KIqi4vp9990XGzZsiFtuuSVGjBgREyZMiHvvvTeWLl0aH//4x9M2DADA4FfzI5kPPPBAzJw5M2699daK6ytWrIgpU6bEiBEjeq5Nnz49HnrooRe9SQAAGkvNj2SeeeaZO72+efPmGDNmTMW1gw46KB5//PGqb7soiti6dWutW2pI5XK54k/qs6+cFxjMdvbv0Oe4+phbfcytfrXOriiKKJVKVa2tOTJ3pVwuR1NTU8W1pqam6O7urvo2tm/fHqtXr87aUkPo7Owc6C00tH3tvMBg9P8uWrqbt67qt330lQfOnNLv9+lrQ33MrX61zO6FvbcraZHZ3NwcW7ZsqbjW3d0dw4cPr/o2hg0bFhMnTsza0qBWLpejs7Mzxo0bFy0tLX14T43/CX53Jk+ePNBb6GN7998fNIL+/DzTf18b9i7mVr9aZ7d27dqqbzstMg855JBed/zEE0/0egp9d0qlUsX3dO4LWlpa9rmPOZPZAX1tID7P+NpQH3OrX7Wzq/ap8ojEH8be2toaf/3rX2Pbtm0915YvXx6tra1ZdwEAQINIi8wZM2bEoYceGgsWLIj29vZYtGhRrFy5Mt75zndm3QUAAA0iLTKHDBkS1157bWzevDne8Y53xE9+8pO45ppr4rDDDsu6CwAA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AACISP7d5QAAECEyAQDoAyITAIB0IrMfnHvuufGZz3xml28/9dRT44gjjqh4efTRR/txh4PLHXfc0Wsec+fO3enaP/zhDzF79uxobW2Nc845JzZs2NDPux08apmbM/e87u7u+OIXvxivfvWr43Wve1184xvfiF19q7rzVqmW2Tlz/3Xbbbf1msMRRxwRRx555E7XO3P/VevcnLdK//znP+O8886Lo48+Ok444YT47ne/u8u1qWeuoE/99Kc/LSZNmlTMnz9/p29/5plniqlTpxYPPPBA8a9//avnZfv27f2808Hj2muvLc4777yKeTz11FO91v3jH/8opk2bVtx4443Fo48+WnziE58oZs+eXezYsWMAdj3wqp2bM1fpoosuKk488cRixYoVxR/+8Idi5syZxZIlS3qtc956q3Z2ztzzyuVyxQw2btxYvPnNby6+8pWv9FrrzD2vlrk5b729613vKj75yU8W69evL+64446itbW1+OUvf9lrXfaZE5l96MknnyyOO+644vTTT99lZHZ2dhZHHnlksW3btn7e3eA1b968YuHChXtcd+WVVxZnnXVWz+tbt24t2traivvuu68vtzdoVTs3Z+55Tz75ZDFlypTi/vvv77n2rW99q/jMZz7Ta63zVqmW2Tlzu3b99dcXs2bNKrq6unq9zZnbtd3NzXmrtGXLlmLSpEnFmjVreq6df/75xRe/+MVea7PPnKfL+9DXvva1OO2002LixIm7XLN27do49NBDo7m5uR93Nrh1dHTEuHHj9rhuxYoVccwxx/S83tLSEkcddVTFb53al1Q7N2fuecuXL4+RI0fGjBkzeq6de+65cemll/Za67xVqmV2ztzObdmyJW644YaYN29eNDU19Xq7M7dze5qb81Zp+PDh0dLSErfddlts37491q1bFw8++GBMnjy519rsMycy+8i9994bf/rTn+KjH/3obtd1dHTEsGHD4rzzzovXv/71cdZZZ8XKlSv7aZeDT1EUsX79+rjnnnvipJNOilmzZsXXv/716O7u7rV28+bNMWbMmIprBx10UDz++OP9td1Bo5a5OXPP27BhQxx++OGxbNmyOPnkk+NNb3pTXHPNNbFjx45ea523SrXMzpnbuSVLlsSYMWPi5JNP3unbnbmd29PcnLdKzc3N8fnPfz5uvfXWaG1tjbe85S1x3HHHxRlnnNFrbfaZE5l9oKurK77whS/E5z//+Rg+fPhu165fvz6eeuqpOOOMM2LRokUxYcKEeN/73hf//Oc/+2m3g8vGjRujXC5HU1NTXHnllTF//vy4/fbb47LLLuu19rl1/6upqWmnYbW3q2Vuztzztm7dGn/729/illtuiUsvvTTmz58fixcv3uk3xTtvlWqZnTPXW1EU8cMf/jDOOuusXa5x5nqrZm7OW28dHR1x/PHHx6233hqXXnpp/PznP4+f/OQnvdZln7mhdb0Xu3X11VfHK1/5yjj22GP3uPaSSy6Jbdu2xciRIyMi4uKLL44HH3wwfvzjH8dHPvKRvt7qoHP44YfH/fffHwcccECUSqWYPHly7NixIy644IJYsGBBDBkypGdtc3Nzr4Pf3d0d+++/f39ve8DVMjdn7nlDhw6Np59+OhYuXBiHH354RPw32JcsWRIf+MAHKtY6b5VqmZ0z19vDDz8cmzZtire+9a27XOPM9VbN3Jy3Svfee2/86Ec/irvuuiuGDx8eU6dOjU2bNsV1110Xp556asXa7DPnkcw+8LOf/Sx+9atfRVtbW7S1tcXtt98et99+e7S1tfVaO3To0J5/CBERpVIpxo8fH5s2berPLQ8qo0aNilKp1PP6hAkToqurK5566qmKdYccckg88cQTFdeeeOKJGD16dL/sc7Cpdm7O3PNGjx4dzc3NPZEUEfHyl798p494OG+VapmdM9fb3XffHcccc0wccMABu1zjzPVWzdyct0p/+ctfYuzYsRXPrE6ZMiU2btzYa232mROZfWDx4sVx++23x7Jly2LZsmVxwgknxAknnBDLli3rtfbss8+Oq6++uuf1HTt2xJo1a2L8+PH9uOPB4+67746ZM2dGuVzuubZ69eoYNWpUHHjggRVrW1tbY/ny5T2vl8vlWLVqVbS2tvbbfgeLWubmzD2vtbU1urq6Yv369T3X1q1bVxFO/7vWeXteLbNz5npbuXJlHH300btd48z1Vs3cnLdKY8aMib/97W8Vj1CuW7cuXvayl/Vam33mRGYfOPzww2Ps2LE9L/vtt1/st99+MXbs2Hj22Wdj8+bNPX/Zz/1Q1F//+texbt26+NKXvhT/+c9/4u1vf/sAfxQDo62tLZqbm+PCCy+MdevWxV133RWXXXZZfOhDH+o1u9NPPz0efPDBWLRoUbS3t8eCBQviZS97WcycOXOAP4r+V8vcnLnnjR8/Pt74xjfGggUL4pFHHom77747Fi1aFO95z3uctz2oZXbOXG/t7e29fvKIM7dn1czNeat0wgknxLBhw+LCCy+M9evXx29+85u4/vrr4+yzz+77M1fXDz6iJvPnz+/5OZkbNmwoJk2a1PMzp3bs2FFcd911xRvf+Mbila98ZfHe97634mdZ7YseffTRYs6cOcW0adOK17/+9cU3v/nNYseOHb1mVxRFceeddxYnnnhi8apXvap43/veVzz22GMDuPOBVe3cnLlK//73v4sLLrigmDZtWvHa177WeatBtbNz5nqbOnVq8bvf/a7imjO3Z9XMzXnrrb29vZgzZ05x9NFHF7NmzSq+853v9MvnuVJR7OJ3gAEAQJ08XQ4AQDqRCQBAOpEJAEA6kQkAQDqRCQBAOpEJAEA6kQkAQDqRCQBAOpEJAEA6kQkAQDqRCQBAOpEJAEC6/w+PuI5MbeN8swAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "get_config('X_train')['sepal_length'].hist()" ] }, { "attachments": {}, "cell_type": "markdown", "id": "36b8b803", "metadata": {}, "source": [ "## ✅ Compare Models\n", "This function trains and evaluates the performance of all estimators available in the model library using cross-validation. The output of this function is a scoring grid with average cross-validated scores. Metrics evaluated during CV can be accessed using the `get_metrics` function. Custom metrics can be added or removed using `add_metric` and `remove_metric` function." ] }, { "cell_type": "code", "execution_count": 28, "id": "a3350418", "metadata": {}, "outputs": [ { "data": { "text/html": [], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
 ModelAccuracyAUCRecallPrec.F1KappaMCCTT (Sec)
qdaQuadratic Discriminant Analysis0.97180.99740.97180.97800.97120.95730.96090.0380
ldaLinear Discriminant Analysis0.97181.00000.97180.97800.97120.95730.96090.0440
knnK Neighbors Classifier0.96360.98440.96360.97090.96310.94500.94940.0510
lightgbmLight Gradient Boosting Machine0.95360.98570.95360.96340.95280.92980.93560.0500
nbNaive Bayes0.94450.98680.94450.95250.94380.91610.92070.0380
etExtra Trees Classifier0.94450.99350.94450.95860.94260.91610.92460.1240
catboostCatBoost Classifier0.94450.99220.94450.95860.94260.91610.92460.0390
xgboostExtreme Gradient Boosting0.93550.98680.93550.94400.93430.90230.90770.0480
dtDecision Tree Classifier0.92640.94290.92640.95020.92010.88860.90400.0340
rfRandom Forest Classifier0.92640.99030.92640.93430.92320.88860.89560.1210
gbcGradient Boosting Classifier0.92640.96880.92640.93430.92320.88860.89560.1500
adaAda Boost Classifier0.91550.98430.91550.94010.90970.87200.88730.0690
lrLogistic Regression0.90730.97510.90730.91590.90640.85970.86450.0400
ridgeRidge Classifier0.83180.00000.83180.85450.82810.74590.75950.0370
svmSVM - Linear Kernel0.81000.00000.81000.78310.77020.71250.75270.0350
dummyDummy Classifier0.28640.50000.28640.08220.12770.00000.00000.0380
\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Processing: 0%| | 0/69 [00:00\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
NameReferenceTurbo
ID
lrLogistic Regressionsklearn.linear_model._logistic.LogisticRegressionTrue
knnK Neighbors Classifiersklearn.neighbors._classification.KNeighborsCl...True
nbNaive Bayessklearn.naive_bayes.GaussianNBTrue
dtDecision Tree Classifiersklearn.tree._classes.DecisionTreeClassifierTrue
svmSVM - Linear Kernelsklearn.linear_model._stochastic_gradient.SGDC...True
rbfsvmSVM - Radial Kernelsklearn.svm._classes.SVCFalse
gpcGaussian Process Classifiersklearn.gaussian_process._gpc.GaussianProcessC...False
mlpMLP Classifiersklearn.neural_network._multilayer_perceptron....False
ridgeRidge Classifiersklearn.linear_model._ridge.RidgeClassifierTrue
rfRandom Forest Classifiersklearn.ensemble._forest.RandomForestClassifierTrue
qdaQuadratic Discriminant Analysissklearn.discriminant_analysis.QuadraticDiscrim...True
adaAda Boost Classifiersklearn.ensemble._weight_boosting.AdaBoostClas...True
gbcGradient Boosting Classifiersklearn.ensemble._gb.GradientBoostingClassifierTrue
ldaLinear Discriminant Analysissklearn.discriminant_analysis.LinearDiscrimina...True
etExtra Trees Classifiersklearn.ensemble._forest.ExtraTreesClassifierTrue
xgboostExtreme Gradient Boostingxgboost.sklearn.XGBClassifierTrue
lightgbmLight Gradient Boosting Machinelightgbm.sklearn.LGBMClassifierTrue
catboostCatBoost Classifiercatboost.core.CatBoostClassifierTrue
dummyDummy Classifiersklearn.dummy.DummyClassifierTrue
\n", "" ], "text/plain": [ " Name \\\n", "ID \n", "lr Logistic Regression \n", "knn K Neighbors Classifier \n", "nb Naive Bayes \n", "dt Decision Tree Classifier \n", "svm SVM - Linear Kernel \n", "rbfsvm SVM - Radial Kernel \n", "gpc Gaussian Process Classifier \n", "mlp MLP Classifier \n", "ridge Ridge Classifier \n", "rf Random Forest Classifier \n", "qda Quadratic Discriminant Analysis \n", "ada Ada Boost Classifier \n", "gbc Gradient Boosting Classifier \n", "lda Linear Discriminant Analysis \n", "et Extra Trees Classifier \n", "xgboost Extreme Gradient Boosting \n", "lightgbm Light Gradient Boosting Machine \n", "catboost CatBoost Classifier \n", "dummy Dummy Classifier \n", "\n", " Reference Turbo \n", "ID \n", "lr sklearn.linear_model._logistic.LogisticRegression True \n", "knn sklearn.neighbors._classification.KNeighborsCl... True \n", "nb sklearn.naive_bayes.GaussianNB True \n", "dt sklearn.tree._classes.DecisionTreeClassifier True \n", "svm sklearn.linear_model._stochastic_gradient.SGDC... True \n", "rbfsvm sklearn.svm._classes.SVC False \n", "gpc sklearn.gaussian_process._gpc.GaussianProcessC... False \n", "mlp sklearn.neural_network._multilayer_perceptron.... False \n", "ridge sklearn.linear_model._ridge.RidgeClassifier True \n", "rf sklearn.ensemble._forest.RandomForestClassifier True \n", "qda sklearn.discriminant_analysis.QuadraticDiscrim... True \n", "ada sklearn.ensemble._weight_boosting.AdaBoostClas... True \n", "gbc sklearn.ensemble._gb.GradientBoostingClassifier True \n", "lda sklearn.discriminant_analysis.LinearDiscrimina... True \n", "et sklearn.ensemble._forest.ExtraTreesClassifier True \n", "xgboost xgboost.sklearn.XGBClassifier True \n", "lightgbm lightgbm.sklearn.LGBMClassifier True \n", "catboost catboost.core.CatBoostClassifier True \n", "dummy sklearn.dummy.DummyClassifier True " ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# check available models\n", "models()" ] }, { "attachments": {}, "cell_type": "markdown", "id": "f588f54b", "metadata": {}, "source": [ "You can use the `include` and `exclude` parameter in the `compare_models` to train only select model or exclude specific models from training by passing the model id's in `exclude` parameter." ] }, { "cell_type": "code", "execution_count": 30, "id": "f2a7e578", "metadata": {}, "outputs": [ { "data": { "text/html": [], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "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", "
 ModelAccuracyAUCRecallPrec.F1KappaMCCTT (Sec)
lightgbmLight Gradient Boosting Machine0.95360.98570.95360.96340.95280.92980.93560.0520
etExtra Trees Classifier0.94450.99350.94450.95860.94260.91610.92460.1190
catboostCatBoost Classifier0.94450.99220.94450.95860.94260.91610.92460.0390
xgboostExtreme Gradient Boosting0.93550.98680.93550.94400.93430.90230.90770.0580
dtDecision Tree Classifier0.92640.94290.92640.95020.92010.88860.90400.0370
rfRandom Forest Classifier0.92640.99030.92640.93430.92320.88860.89560.1200
gbcGradient Boosting Classifier0.92640.96880.92640.93430.92320.88860.89560.1510
\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Processing: 0%| | 0/33 [00:00#sk-container-id-3 {color: black;background-color: white;}#sk-container-id-3 pre{padding: 0;}#sk-container-id-3 div.sk-toggleable {background-color: white;}#sk-container-id-3 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-3 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-3 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-3 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-3 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-3 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-3 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-3 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-3 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-3 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-3 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-3 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-3 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-3 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-3 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-3 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-3 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-3 div.sk-item {position: relative;z-index: 1;}#sk-container-id-3 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-3 div.sk-item::before, #sk-container-id-3 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-3 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-3 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-3 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-3 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-3 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-3 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-3 div.sk-label-container {text-align: center;}#sk-container-id-3 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-3 div.sk-text-repr-fallback {display: none;}
LGBMClassifier(boosting_type='gbdt', class_weight=None, colsample_bytree=1.0,\n",
       "               importance_type='split', learning_rate=0.1, max_depth=-1,\n",
       "               min_child_samples=20, min_child_weight=0.001, min_split_gain=0.0,\n",
       "               n_estimators=100, n_jobs=-1, num_leaves=31, objective=None,\n",
       "               random_state=123, reg_alpha=0.0, reg_lambda=0.0, silent='warn',\n",
       "               subsample=1.0, subsample_for_bin=200000, subsample_freq=0)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "LGBMClassifier(boosting_type='gbdt', class_weight=None, colsample_bytree=1.0,\n", " importance_type='split', learning_rate=0.1, max_depth=-1,\n", " min_child_samples=20, min_child_weight=0.001, min_split_gain=0.0,\n", " n_estimators=100, n_jobs=-1, num_leaves=31, objective=None,\n", " random_state=123, reg_alpha=0.0, reg_lambda=0.0, silent='warn',\n", " subsample=1.0, subsample_for_bin=200000, subsample_freq=0)" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "compare_tree_models" ] }, { "attachments": {}, "cell_type": "markdown", "id": "af9ae6cd", "metadata": {}, "source": [ "The function above has return trained model object as an output. The scoring grid is only displayed and not returned. If you need access to the scoring grid you can use `pull` function to access the dataframe." ] }, { "cell_type": "code", "execution_count": 32, "id": "fc529e25", "metadata": {}, "outputs": [ { "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", "
ModelAccuracyAUCRecallPrec.F1KappaMCCTT (Sec)
lightgbmLight Gradient Boosting Machine0.95360.98570.95360.96340.95280.92980.93560.052
etExtra Trees Classifier0.94450.99350.94450.95860.94260.91610.92460.119
catboostCatBoost Classifier0.94450.99220.94450.95860.94260.91610.92460.039
xgboostExtreme Gradient Boosting0.93550.98680.93550.94400.93430.90230.90770.058
dtDecision Tree Classifier0.92640.94290.92640.95020.92010.88860.90400.037
rfRandom Forest Classifier0.92640.99030.92640.93430.92320.88860.89560.120
gbcGradient Boosting Classifier0.92640.96880.92640.93430.92320.88860.89560.151
\n", "
" ], "text/plain": [ " Model Accuracy AUC Recall Prec. \\\n", "lightgbm Light Gradient Boosting Machine 0.9536 0.9857 0.9536 0.9634 \n", "et Extra Trees Classifier 0.9445 0.9935 0.9445 0.9586 \n", "catboost CatBoost Classifier 0.9445 0.9922 0.9445 0.9586 \n", "xgboost Extreme Gradient Boosting 0.9355 0.9868 0.9355 0.9440 \n", "dt Decision Tree Classifier 0.9264 0.9429 0.9264 0.9502 \n", "rf Random Forest Classifier 0.9264 0.9903 0.9264 0.9343 \n", "gbc Gradient Boosting Classifier 0.9264 0.9688 0.9264 0.9343 \n", "\n", " F1 Kappa MCC TT (Sec) \n", "lightgbm 0.9528 0.9298 0.9356 0.052 \n", "et 0.9426 0.9161 0.9246 0.119 \n", "catboost 0.9426 0.9161 0.9246 0.039 \n", "xgboost 0.9343 0.9023 0.9077 0.058 \n", "dt 0.9201 0.8886 0.9040 0.037 \n", "rf 0.9232 0.8886 0.8956 0.120 \n", "gbc 0.9232 0.8886 0.8956 0.151 " ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "compare_tree_models_results = pull()\n", "compare_tree_models_results" ] }, { "attachments": {}, "cell_type": "markdown", "id": "05a72fc2", "metadata": {}, "source": [ "By default `compare_models` return the single best performing model based on the metric defined in the `sort` parameter. Let's change our code to return 3 top models based on `Recall`." ] }, { "cell_type": "code", "execution_count": 33, "id": "1066dd07", "metadata": {}, "outputs": [ { "data": { "text/html": [], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
 ModelAccuracyAUCRecallPrec.F1KappaMCCTT (Sec)
qdaQuadratic Discriminant Analysis0.97180.99740.97180.97800.97120.95730.96090.0400
ldaLinear Discriminant Analysis0.97181.00000.97180.97800.97120.95730.96090.0380
knnK Neighbors Classifier0.96360.98440.96360.97090.96310.94500.94940.0490
lightgbmLight Gradient Boosting Machine0.95360.98570.95360.96340.95280.92980.93560.0490
nbNaive Bayes0.94450.98680.94450.95250.94380.91610.92070.0380
etExtra Trees Classifier0.94450.99350.94450.95860.94260.91610.92460.1180
catboostCatBoost Classifier0.94450.99220.94450.95860.94260.91610.92460.0390
xgboostExtreme Gradient Boosting0.93550.98680.93550.94400.93430.90230.90770.0460
dtDecision Tree Classifier0.92640.94290.92640.95020.92010.88860.90400.0330
rfRandom Forest Classifier0.92640.99030.92640.93430.92320.88860.89560.1170
gbcGradient Boosting Classifier0.92640.96880.92640.93430.92320.88860.89560.1450
adaAda Boost Classifier0.91550.98430.91550.94010.90970.87200.88730.0680
lrLogistic Regression0.90730.97510.90730.91590.90640.85970.86450.0420
ridgeRidge Classifier0.83180.00000.83180.85450.82810.74590.75950.0310
svmSVM - Linear Kernel0.81000.00000.81000.78310.77020.71250.75270.0350
dummyDummy Classifier0.28640.50000.28640.08220.12770.00000.00000.0360
\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Processing: 0%| | 0/71 [00:00\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
NameReferenceTurbo
ID
lrLogistic Regressionsklearn.linear_model._logistic.LogisticRegressionTrue
knnK Neighbors Classifiersklearn.neighbors._classification.KNeighborsCl...True
nbNaive Bayessklearn.naive_bayes.GaussianNBTrue
dtDecision Tree Classifiersklearn.tree._classes.DecisionTreeClassifierTrue
svmSVM - Linear Kernelsklearn.linear_model._stochastic_gradient.SGDC...True
rbfsvmSVM - Radial Kernelsklearn.svm._classes.SVCFalse
gpcGaussian Process Classifiersklearn.gaussian_process._gpc.GaussianProcessC...False
mlpMLP Classifiersklearn.neural_network._multilayer_perceptron....False
ridgeRidge Classifiersklearn.linear_model._ridge.RidgeClassifierTrue
rfRandom Forest Classifiersklearn.ensemble._forest.RandomForestClassifierTrue
qdaQuadratic Discriminant Analysissklearn.discriminant_analysis.QuadraticDiscrim...True
adaAda Boost Classifiersklearn.ensemble._weight_boosting.AdaBoostClas...True
gbcGradient Boosting Classifiersklearn.ensemble._gb.GradientBoostingClassifierTrue
ldaLinear Discriminant Analysissklearn.discriminant_analysis.LinearDiscrimina...True
etExtra Trees Classifiersklearn.ensemble._forest.ExtraTreesClassifierTrue
xgboostExtreme Gradient Boostingxgboost.sklearn.XGBClassifierTrue
lightgbmLight Gradient Boosting Machinelightgbm.sklearn.LGBMClassifierTrue
catboostCatBoost Classifiercatboost.core.CatBoostClassifierTrue
dummyDummy Classifiersklearn.dummy.DummyClassifierTrue
\n", "" ], "text/plain": [ " Name \\\n", "ID \n", "lr Logistic Regression \n", "knn K Neighbors Classifier \n", "nb Naive Bayes \n", "dt Decision Tree Classifier \n", "svm SVM - Linear Kernel \n", "rbfsvm SVM - Radial Kernel \n", "gpc Gaussian Process Classifier \n", "mlp MLP Classifier \n", "ridge Ridge Classifier \n", "rf Random Forest Classifier \n", "qda Quadratic Discriminant Analysis \n", "ada Ada Boost Classifier \n", "gbc Gradient Boosting Classifier \n", "lda Linear Discriminant Analysis \n", "et Extra Trees Classifier \n", "xgboost Extreme Gradient Boosting \n", "lightgbm Light Gradient Boosting Machine \n", "catboost CatBoost Classifier \n", "dummy Dummy Classifier \n", "\n", " Reference Turbo \n", "ID \n", "lr sklearn.linear_model._logistic.LogisticRegression True \n", "knn sklearn.neighbors._classification.KNeighborsCl... True \n", "nb sklearn.naive_bayes.GaussianNB True \n", "dt sklearn.tree._classes.DecisionTreeClassifier True \n", "svm sklearn.linear_model._stochastic_gradient.SGDC... True \n", "rbfsvm sklearn.svm._classes.SVC False \n", "gpc sklearn.gaussian_process._gpc.GaussianProcessC... False \n", "mlp sklearn.neural_network._multilayer_perceptron.... False \n", "ridge sklearn.linear_model._ridge.RidgeClassifier True \n", "rf sklearn.ensemble._forest.RandomForestClassifier True \n", "qda sklearn.discriminant_analysis.QuadraticDiscrim... True \n", "ada sklearn.ensemble._weight_boosting.AdaBoostClas... True \n", "gbc sklearn.ensemble._gb.GradientBoostingClassifier True \n", "lda sklearn.discriminant_analysis.LinearDiscrimina... True \n", "et sklearn.ensemble._forest.ExtraTreesClassifier True \n", "xgboost xgboost.sklearn.XGBClassifier True \n", "lightgbm lightgbm.sklearn.LGBMClassifier True \n", "catboost catboost.core.CatBoostClassifier True \n", "dummy sklearn.dummy.DummyClassifier True " ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# check all the available models\n", "models()" ] }, { "cell_type": "code", "execution_count": 41, "id": "16641cab", "metadata": {}, "outputs": [ { "data": { "text/html": [], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "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", "
 AccuracyAUCRecallPrec.F1KappaMCC
Fold       
00.90911.00000.90910.92730.90760.86250.8735
10.81820.92210.81820.81820.81820.72500.7250
20.90910.96100.90910.92730.90760.86250.8735
30.63640.89610.63640.63640.63640.45000.4500
41.00001.00001.00001.00001.00001.00001.0000
50.90000.97140.90000.92500.89710.84850.8616
61.00001.00001.00001.00001.00001.00001.0000
71.00001.00001.00001.00001.00001.00001.0000
80.90001.00000.90000.92500.89710.84850.8616
91.00001.00001.00001.00001.00001.00001.0000
Mean0.90730.97510.90730.91590.90640.85970.8645
Std0.10760.03600.10760.10790.10770.16280.1628
\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Processing: 0%| | 0/4 [00:00\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", "
AccuracyAUCRecallPrec.F1KappaMCC
Fold
00.90911.00000.90910.92730.90760.86250.8735
10.81820.92210.81820.81820.81820.72500.7250
20.90910.96100.90910.92730.90760.86250.8735
30.63640.89610.63640.63640.63640.45000.4500
41.00001.00001.00001.00001.00001.00001.0000
50.90000.97140.90000.92500.89710.84850.8616
61.00001.00001.00001.00001.00001.00001.0000
71.00001.00001.00001.00001.00001.00001.0000
80.90001.00000.90000.92500.89710.84850.8616
91.00001.00001.00001.00001.00001.00001.0000
Mean0.90730.97510.90730.91590.90640.85970.8645
Std0.10760.03600.10760.10790.10770.16280.1628
\n", "
" ], "text/plain": [ " Accuracy AUC Recall Prec. F1 Kappa MCC\n", "Fold \n", "0 0.9091 1.0000 0.9091 0.9273 0.9076 0.8625 0.8735\n", "1 0.8182 0.9221 0.8182 0.8182 0.8182 0.7250 0.7250\n", "2 0.9091 0.9610 0.9091 0.9273 0.9076 0.8625 0.8735\n", "3 0.6364 0.8961 0.6364 0.6364 0.6364 0.4500 0.4500\n", "4 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000\n", "5 0.9000 0.9714 0.9000 0.9250 0.8971 0.8485 0.8616\n", "6 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000\n", "7 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000\n", "8 0.9000 1.0000 0.9000 0.9250 0.8971 0.8485 0.8616\n", "9 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000\n", "Mean 0.9073 0.9751 0.9073 0.9159 0.9064 0.8597 0.8645\n", "Std 0.1076 0.0360 0.1076 0.1079 0.1077 0.1628 0.1628" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lr_results = pull()\n", "print(type(lr_results))\n", "lr_results" ] }, { "cell_type": "code", "execution_count": 43, "id": "148a74c4", "metadata": {}, "outputs": [ { "data": { "text/html": [], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "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", "
 AccuracyAUCRecallPrec.F1KappaMCC
Fold       
00.91430.97300.91430.91580.91400.87120.8722
10.88570.97640.88570.89220.88490.82840.8325
20.97140.99880.97140.97360.97130.95710.9582
Mean0.92380.98270.92380.92720.92340.88560.8877
Std0.03560.01150.03560.03420.03590.05350.0525
\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Processing: 0%| | 0/4 [00:00" ] }, "metadata": {}, "output_type": "display_data" }, { "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", "
 AccuracyAUCRecallPrec.F1KappaMCC
Fold       
00.90911.00000.90910.92730.90760.86250.8735
10.81820.90910.81820.81820.81820.72500.7250
20.90910.93510.90910.92730.90760.86250.8735
30.72730.88310.72730.73330.72290.58750.5950
40.90911.00000.90910.92730.90760.86250.8735
50.90000.97140.90000.92500.89710.84850.8616
60.90001.00000.90000.92500.89710.84850.8616
71.00001.00001.00001.00001.00001.00001.0000
80.90000.98570.90000.92500.89710.84850.8616
91.00001.00001.00001.00001.00001.00001.0000
Mean0.89730.96840.89730.91080.89550.84450.8525
Std0.07530.04150.07530.07580.07620.11390.1130
\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Processing: 0%| | 0/4 [00:00#sk-container-id-4 {color: black;background-color: white;}#sk-container-id-4 pre{padding: 0;}#sk-container-id-4 div.sk-toggleable {background-color: white;}#sk-container-id-4 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-4 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-4 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-4 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-4 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-4 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-4 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-4 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-4 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-4 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-4 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-4 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-4 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-4 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-4 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-4 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-4 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-4 div.sk-item {position: relative;z-index: 1;}#sk-container-id-4 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-4 div.sk-item::before, #sk-container-id-4 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-4 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-4 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-4 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-4 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-4 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-4 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-4 div.sk-label-container {text-align: center;}#sk-container-id-4 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-4 div.sk-text-repr-fallback {display: none;}
LogisticRegression(C=0.5, class_weight=None, dual=False, fit_intercept=True,\n",
       "                   intercept_scaling=1, l1_ratio=0.15, max_iter=1000,\n",
       "                   multi_class='auto', n_jobs=None, penalty='l2',\n",
       "                   random_state=123, solver='lbfgs', tol=0.0001, verbose=0,\n",
       "                   warm_start=False)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "LogisticRegression(C=0.5, class_weight=None, dual=False, fit_intercept=True,\n", " intercept_scaling=1, l1_ratio=0.15, max_iter=1000,\n", " multi_class='auto', n_jobs=None, penalty='l2',\n", " random_state=123, solver='lbfgs', tol=0.0001, verbose=0,\n", " warm_start=False)" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# train logistic regression with specific model parameters\n", "create_model('lr', C = 0.5, l1_ratio = 0.15)" ] }, { "cell_type": "code", "execution_count": 45, "id": "b85af29b", "metadata": {}, "outputs": [ { "data": { "text/html": [], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
  AccuracyAUCRecallPrec.F1KappaMCC
SplitFold       
CV-Train00.91490.98820.91490.91590.91480.87230.8729
10.92550.98920.92550.92580.92550.88830.8884
20.92550.98870.92550.92790.92540.88830.8896
30.94680.98830.94680.94710.94680.92020.9204
40.90430.98550.90430.90650.90400.85640.8577
50.91580.98780.91580.91680.91570.87370.8743
60.90530.98430.90530.90740.90510.85790.8592
70.91580.98630.91580.91580.91580.87370.8737
80.91580.98480.91580.91680.91570.87370.8743
90.90530.98580.90530.90740.90510.85790.8592
CV-Val00.90911.00000.90910.92730.90760.86250.8735
10.81820.92210.81820.81820.81820.72500.7250
20.90910.96100.90910.92730.90760.86250.8735
30.63640.89610.63640.63640.63640.45000.4500
41.00001.00001.00001.00001.00001.00001.0000
50.90000.97140.90000.92500.89710.84850.8616
61.00001.00001.00001.00001.00001.00001.0000
71.00001.00001.00001.00001.00001.00001.0000
80.90001.00000.90000.92500.89710.84850.8616
91.00001.00001.00001.00001.00001.00001.0000
CV-TrainMean0.91750.98690.91750.91870.91740.87620.8770
Std0.01220.00170.01220.01170.01220.01820.0180
CV-ValMean0.90730.97510.90730.91590.90640.85970.8645
Std0.10760.03600.10760.10790.10770.16280.1628
Trainnan0.91430.98730.00000.00000.00000.87140.8715
\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Processing: 0%| | 0/4 [00:00#sk-container-id-5 {color: black;background-color: white;}#sk-container-id-5 pre{padding: 0;}#sk-container-id-5 div.sk-toggleable {background-color: white;}#sk-container-id-5 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-5 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-5 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-5 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-5 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-5 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-5 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-5 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-5 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-5 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-5 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-5 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-5 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-5 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-5 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-5 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-5 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-5 div.sk-item {position: relative;z-index: 1;}#sk-container-id-5 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-5 div.sk-item::before, #sk-container-id-5 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-5 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-5 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-5 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-5 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-5 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-5 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-5 div.sk-label-container {text-align: center;}#sk-container-id-5 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-5 div.sk-text-repr-fallback {display: none;}
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
       "                   intercept_scaling=1, l1_ratio=None, max_iter=1000,\n",
       "                   multi_class='auto', n_jobs=None, penalty='l2',\n",
       "                   random_state=123, solver='lbfgs', tol=0.0001, verbose=0,\n",
       "                   warm_start=False)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n", " intercept_scaling=1, l1_ratio=None, max_iter=1000,\n", " multi_class='auto', n_jobs=None, penalty='l2',\n", " random_state=123, solver='lbfgs', tol=0.0001, verbose=0,\n", " warm_start=False)" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# train lr and return train score as well alongwith CV\n", "create_model('lr', return_train_score=True)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "08634e9e", "metadata": {}, "source": [ "Some other parameters that you might find very useful in `create_model` are:\n", "\n", "- cross_validation\n", "- engine\n", "- fit_kwargs\n", "- groups\n", "\n", "You can check the docstring of the function for more info." ] }, { "cell_type": "code", "execution_count": 46, "id": "3fb32c74", "metadata": {}, "outputs": [], "source": [ "# help(create_model)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "d5378836", "metadata": {}, "source": [ "## ✅ Tune Model\n", "\n", "This function tunes the hyperparameters of the model. The output of this function is a scoring grid with cross-validated scores by fold. The best model is selected based on the metric defined in optimize parameter. Metrics evaluated during cross-validation can be accessed using the `get_metrics` function. Custom metrics can be added or removed using `add_metric` and `remove_metric` function." ] }, { "cell_type": "code", "execution_count": 47, "id": "402597f2", "metadata": {}, "outputs": [ { "data": { "text/html": [], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "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", "
 AccuracyAUCRecallPrec.F1KappaMCC
Fold       
00.81820.85710.81820.87880.80610.72500.7642
10.90910.92860.90910.92730.90760.86250.8735
20.90910.92860.90910.92730.90760.86250.8735
30.72730.78570.72730.84420.68260.58750.6674
41.00001.00001.00001.00001.00001.00001.0000
50.90000.92860.90000.92500.89710.84850.8616
61.00001.00001.00001.00001.00001.00001.0000
71.00001.00001.00001.00001.00001.00001.0000
81.00001.00001.00001.00001.00001.00001.0000
91.00001.00001.00001.00001.00001.00001.0000
Mean0.92640.94290.92640.95020.92010.88860.9040
Std0.08930.07000.08930.05520.10110.13510.1119
\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Processing: 0%| | 0/4 [00:00" ] }, "metadata": {}, "output_type": "display_data" }, { "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", "
 AccuracyAUCRecallPrec.F1KappaMCC
Fold       
01.00001.00001.00001.00001.00001.00001.0000
10.90910.94810.90910.92730.90760.86250.8735
20.90910.94810.90910.92730.90760.86250.8735
30.72730.84420.72730.84420.68260.58750.6674
41.00001.00001.00001.00001.00001.00001.0000
50.90000.92860.90000.92500.89710.84850.8616
61.00001.00001.00001.00001.00001.00001.0000
71.00001.00001.00001.00001.00001.00001.0000
81.00001.00001.00001.00001.00001.00001.0000
91.00001.00001.00001.00001.00001.00001.0000
Mean0.94450.96690.94450.96240.93950.91610.9276
Std0.08380.04880.08380.05130.09580.12670.1046
\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Processing: 0%| | 0/7 [00:00#sk-container-id-6 {color: black;background-color: white;}#sk-container-id-6 pre{padding: 0;}#sk-container-id-6 div.sk-toggleable {background-color: white;}#sk-container-id-6 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-6 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-6 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-6 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-6 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-6 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-6 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-6 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-6 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-6 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-6 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-6 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-6 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-6 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-6 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-6 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-6 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-6 div.sk-item {position: relative;z-index: 1;}#sk-container-id-6 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-6 div.sk-item::before, #sk-container-id-6 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-6 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-6 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-6 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-6 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-6 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-6 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-6 div.sk-label-container {text-align: center;}#sk-container-id-6 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-6 div.sk-text-repr-fallback {display: none;}
DecisionTreeClassifier(ccp_alpha=0.0, class_weight=None, criterion='gini',\n",
       "                       max_depth=None, max_features=None, max_leaf_nodes=None,\n",
       "                       min_impurity_decrease=0.0, min_samples_leaf=1,\n",
       "                       min_samples_split=2, min_weight_fraction_leaf=0.0,\n",
       "                       random_state=123, splitter='best')
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "DecisionTreeClassifier(ccp_alpha=0.0, class_weight=None, criterion='gini',\n", " max_depth=None, max_features=None, max_leaf_nodes=None,\n", " min_impurity_decrease=0.0, min_samples_leaf=1,\n", " min_samples_split=2, min_weight_fraction_leaf=0.0,\n", " random_state=123, splitter='best')" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dt" ] }, { "cell_type": "code", "execution_count": 50, "id": "31e050ff", "metadata": {}, "outputs": [ { "data": { "text/html": [], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "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", "
 AccuracyAUCRecallPrec.F1KappaMCC
Fold       
00.90910.94810.90910.92730.90760.86250.8735
11.00001.00001.00001.00001.00001.00001.0000
20.90910.92860.90910.92730.90760.86250.8735
30.72730.84420.72730.84420.68260.58750.6674
41.00001.00001.00001.00001.00001.00001.0000
50.90000.95710.90000.92500.89710.84850.8616
61.00001.00001.00001.00001.00001.00001.0000
71.00001.00001.00001.00001.00001.00001.0000
81.00001.00001.00001.00001.00001.00001.0000
91.00001.00001.00001.00001.00001.00001.0000
Mean0.94450.96780.94450.96240.93950.91610.9276
Std0.08380.04850.08380.05130.09580.12670.1046
\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Processing: 0%| | 0/7 [00:00" ] }, "metadata": {}, "output_type": "display_data" }, { "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", "
 AccuracyAUCRecallPrec.F1KappaMCC
Fold       
01.00001.00001.00001.00001.00001.00001.0000
10.90910.94810.90910.92730.90760.86250.8735
20.90910.94810.90910.92730.90760.86250.8735
30.72730.84420.72730.84420.68260.58750.6674
41.00001.00001.00001.00001.00001.00001.0000
50.90000.92860.90000.92500.89710.84850.8616
61.00001.00001.00001.00001.00001.00001.0000
71.00001.00001.00001.00001.00001.00001.0000
81.00001.00001.00001.00001.00001.00001.0000
91.00001.00001.00001.00001.00001.00001.0000
Mean0.94450.96690.94450.96240.93950.91610.9276
Std0.08380.04880.08380.05130.09580.12670.1046
\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Processing: 0%| | 0/7 [00:00#sk-container-id-7 {color: black;background-color: white;}#sk-container-id-7 pre{padding: 0;}#sk-container-id-7 div.sk-toggleable {background-color: white;}#sk-container-id-7 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-7 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-7 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-7 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-7 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-7 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-7 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-7 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-7 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-7 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-7 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-7 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-7 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-7 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-7 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-7 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-7 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-7 div.sk-item {position: relative;z-index: 1;}#sk-container-id-7 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-7 div.sk-item::before, #sk-container-id-7 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-7 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-7 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-7 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-7 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-7 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-7 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-7 div.sk-label-container {text-align: center;}#sk-container-id-7 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-7 div.sk-text-repr-fallback {display: none;}
DecisionTreeClassifier(ccp_alpha=0.0, class_weight=None, criterion='entropy',\n",
       "                       max_depth=5, max_features='sqrt', max_leaf_nodes=None,\n",
       "                       min_impurity_decrease=0.2, min_samples_leaf=5,\n",
       "                       min_samples_split=5, min_weight_fraction_leaf=0.0,\n",
       "                       random_state=123, splitter='best')
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "DecisionTreeClassifier(ccp_alpha=0.0, class_weight=None, criterion='entropy',\n", " max_depth=5, max_features='sqrt', max_leaf_nodes=None,\n", " min_impurity_decrease=0.2, min_samples_leaf=5,\n", " min_samples_split=5, min_weight_fraction_leaf=0.0,\n", " random_state=123, splitter='best')" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# model object\n", "tuned_dt" ] }, { "cell_type": "code", "execution_count": 53, "id": "7d5e49ca", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
RandomizedSearchCV(cv=StratifiedKFold(n_splits=10, random_state=None, shuffle=False),\n",
       "                   error_score=nan,\n",
       "                   estimator=Pipeline(memory=FastMemory(location=C:\\Users\\owner\\AppData\\Local\\Temp\\joblib),\n",
       "                                      steps=[('label_encoding',\n",
       "                                              TransformerWrapperWithInverse(exclude=None,\n",
       "                                                                            include=None,\n",
       "                                                                            transformer=LabelEncoder())),\n",
       "                                             ('numerical_imputer',\n",
       "                                              TransformerWrapper(exclude=None,...\n",
       "                                        'actual_estimator__max_features': [1.0,\n",
       "                                                                           'sqrt',\n",
       "                                                                           'log2'],\n",
       "                                        'actual_estimator__min_impurity_decrease': [0,\n",
       "                                                                                    0.0001,\n",
       "                                                                                    0.001,\n",
       "                                                                                    0.01,\n",
       "                                                                                    0.0002,\n",
       "                                                                                    0.002,\n",
       "                                                                                    0.02,\n",
       "                                                                                    0.0005,\n",
       "                                                                                    0.005,\n",
       "                                                                                    0.05,\n",
       "                                                                                    0.1,\n",
       "                                                                                    0.2,\n",
       "                                                                                    0.3,\n",
       "                                                                                    0.4,\n",
       "                                                                                    0.5],\n",
       "                                        'actual_estimator__min_samples_leaf': [2,\n",
       "                                                                               3,\n",
       "                                                                               4,\n",
       "                                                                               5,\n",
       "                                                                               6],\n",
       "                                        'actual_estimator__min_samples_split': [2,\n",
       "                                                                                5,\n",
       "                                                                                7,\n",
       "                                                                                9,\n",
       "                                                                                10]},\n",
       "                   pre_dispatch='2*n_jobs', random_state=123, refit=False,\n",
       "                   return_train_score=False, scoring='accuracy', verbose=1)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "RandomizedSearchCV(cv=StratifiedKFold(n_splits=10, random_state=None, shuffle=False),\n", " error_score=nan,\n", " estimator=Pipeline(memory=FastMemory(location=C:\\Users\\owner\\AppData\\Local\\Temp\\joblib),\n", " steps=[('label_encoding',\n", " TransformerWrapperWithInverse(exclude=None,\n", " include=None,\n", " transformer=LabelEncoder())),\n", " ('numerical_imputer',\n", " TransformerWrapper(exclude=None,...\n", " 'actual_estimator__max_features': [1.0,\n", " 'sqrt',\n", " 'log2'],\n", " 'actual_estimator__min_impurity_decrease': [0,\n", " 0.0001,\n", " 0.001,\n", " 0.01,\n", " 0.0002,\n", " 0.002,\n", " 0.02,\n", " 0.0005,\n", " 0.005,\n", " 0.05,\n", " 0.1,\n", " 0.2,\n", " 0.3,\n", " 0.4,\n", " 0.5],\n", " 'actual_estimator__min_samples_leaf': [2,\n", " 3,\n", " 4,\n", " 5,\n", " 6],\n", " 'actual_estimator__min_samples_split': [2,\n", " 5,\n", " 7,\n", " 9,\n", " 10]},\n", " pre_dispatch='2*n_jobs', random_state=123, refit=False,\n", " return_train_score=False, scoring='accuracy', verbose=1)" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# tuner object\n", "tuner" ] }, { "attachments": {}, "cell_type": "markdown", "id": "0a33c70b", "metadata": {}, "source": [ "The default search algorithm is `RandomizedSearchCV` from `sklearn`. This can be changed by using `search_library` and `search_algorithm` parameter." ] }, { "cell_type": "code", "execution_count": 54, "id": "31e33547", "metadata": {}, "outputs": [ { "data": { "text/html": [], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "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", "
 AccuracyAUCRecallPrec.F1KappaMCC
Fold       
00.90910.92860.90910.92730.90760.86250.8735
10.90910.92860.90910.92730.90760.86250.8735
20.90910.92860.90910.92730.90760.86250.8735
30.72730.78570.72730.84420.68260.58750.6674
41.00001.00001.00001.00001.00001.00001.0000
50.90000.92860.90000.92500.89710.84850.8616
61.00001.00001.00001.00001.00001.00001.0000
71.00001.00001.00001.00001.00001.00001.0000
81.00001.00001.00001.00001.00001.00001.0000
91.00001.00001.00001.00001.00001.00001.0000
Mean0.93550.95000.93550.95510.93030.90230.9149
Std0.08220.06430.08220.05060.09390.12430.1027
\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Processing: 0%| | 0/7 [00:00" ] }, "metadata": {}, "output_type": "display_data" }, { "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", "
 AccuracyAUCRecallPrec.F1KappaMCC
Fold       
00.90910.92860.90910.92730.90760.86250.8735
10.90911.00000.90910.92730.90760.86250.8735
20.90910.98700.90910.92730.90760.86250.8735
30.72730.94810.72730.84420.68260.58750.6674
41.00001.00001.00001.00001.00001.00001.0000
50.90000.98570.90000.92500.89710.84850.8616
61.00001.00001.00001.00001.00001.00001.0000
71.00001.00001.00001.00001.00001.00001.0000
81.00001.00001.00001.00001.00001.00001.0000
91.00001.00001.00001.00001.00001.00001.0000
Mean0.93550.98490.93550.95510.93030.90230.9149
Std0.08220.02430.08220.05060.09390.12430.1027
\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Processing: 0%| | 0/6 [00:00#sk-container-id-9 {color: black;background-color: white;}#sk-container-id-9 pre{padding: 0;}#sk-container-id-9 div.sk-toggleable {background-color: white;}#sk-container-id-9 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-9 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-9 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-9 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-9 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-9 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-9 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-9 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-9 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-9 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-9 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-9 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-9 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-9 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-9 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-9 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-9 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-9 div.sk-item {position: relative;z-index: 1;}#sk-container-id-9 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-9 div.sk-item::before, #sk-container-id-9 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-9 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-9 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-9 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-9 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-9 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-9 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-9 div.sk-label-container {text-align: center;}#sk-container-id-9 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-9 div.sk-text-repr-fallback {display: none;}
BaggingClassifier(base_estimator=DecisionTreeClassifier(ccp_alpha=0.0,\n",
       "                                                        class_weight=None,\n",
       "                                                        criterion='gini',\n",
       "                                                        max_depth=None,\n",
       "                                                        max_features=None,\n",
       "                                                        max_leaf_nodes=None,\n",
       "                                                        min_impurity_decrease=0.0,\n",
       "                                                        min_samples_leaf=1,\n",
       "                                                        min_samples_split=2,\n",
       "                                                        min_weight_fraction_leaf=0.0,\n",
       "                                                        random_state=123,\n",
       "                                                        splitter='best'),\n",
       "                  bootstrap=True, bootstrap_features=False, max_features=1.0,\n",
       "                  max_samples=1.0, n_estimators=10, n_jobs=None,\n",
       "                  oob_score=False, random_state=123, verbose=0,\n",
       "                  warm_start=False)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "BaggingClassifier(base_estimator=DecisionTreeClassifier(ccp_alpha=0.0,\n", " class_weight=None,\n", " criterion='gini',\n", " max_depth=None,\n", " max_features=None,\n", " max_leaf_nodes=None,\n", " min_impurity_decrease=0.0,\n", " min_samples_leaf=1,\n", " min_samples_split=2,\n", " min_weight_fraction_leaf=0.0,\n", " random_state=123,\n", " splitter='best'),\n", " bootstrap=True, bootstrap_features=False, max_features=1.0,\n", " max_samples=1.0, n_estimators=10, n_jobs=None,\n", " oob_score=False, random_state=123, verbose=0,\n", " warm_start=False)" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# ensemble with bagging\n", "ensemble_model(dt, method = 'Bagging')" ] }, { "cell_type": "code", "execution_count": 57, "id": "79279394", "metadata": {}, "outputs": [ { "data": { "text/html": [], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "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", "
 AccuracyAUCRecallPrec.F1KappaMCC
Fold       
00.90910.92860.90910.92730.90760.86250.8735
10.90910.92860.90910.92730.90760.86250.8735
20.90910.92860.90910.92730.90760.86250.8735
30.63640.71430.63640.63640.61210.45000.4743
41.00001.00001.00001.00001.00001.00001.0000
50.90000.92860.90000.92500.89710.84850.8616
61.00001.00001.00001.00001.00001.00001.0000
71.00001.00001.00001.00001.00001.00001.0000
81.00001.00001.00001.00001.00001.00001.0000
91.00001.00001.00001.00001.00001.00001.0000
Mean0.92640.94290.92640.93430.92320.88860.8956
Std0.10620.08330.10620.10520.11300.16060.1532
\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Processing: 0%| | 0/6 [00:00#sk-container-id-10 {color: black;background-color: white;}#sk-container-id-10 pre{padding: 0;}#sk-container-id-10 div.sk-toggleable {background-color: white;}#sk-container-id-10 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-10 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-10 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-10 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-10 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-10 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-10 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-10 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-10 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-10 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-10 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-10 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-10 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-10 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-10 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-10 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-10 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-10 div.sk-item {position: relative;z-index: 1;}#sk-container-id-10 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-10 div.sk-item::before, #sk-container-id-10 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-10 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-10 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-10 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-10 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-10 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-10 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-10 div.sk-label-container {text-align: center;}#sk-container-id-10 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-10 div.sk-text-repr-fallback {display: none;}
AdaBoostClassifier(algorithm='SAMME.R',\n",
       "                   base_estimator=DecisionTreeClassifier(ccp_alpha=0.0,\n",
       "                                                         class_weight=None,\n",
       "                                                         criterion='gini',\n",
       "                                                         max_depth=None,\n",
       "                                                         max_features=None,\n",
       "                                                         max_leaf_nodes=None,\n",
       "                                                         min_impurity_decrease=0.0,\n",
       "                                                         min_samples_leaf=1,\n",
       "                                                         min_samples_split=2,\n",
       "                                                         min_weight_fraction_leaf=0.0,\n",
       "                                                         random_state=123,\n",
       "                                                         splitter='best'),\n",
       "                   learning_rate=1.0, n_estimators=10, random_state=123)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "AdaBoostClassifier(algorithm='SAMME.R',\n", " base_estimator=DecisionTreeClassifier(ccp_alpha=0.0,\n", " class_weight=None,\n", " criterion='gini',\n", " max_depth=None,\n", " max_features=None,\n", " max_leaf_nodes=None,\n", " min_impurity_decrease=0.0,\n", " min_samples_leaf=1,\n", " min_samples_split=2,\n", " min_weight_fraction_leaf=0.0,\n", " random_state=123,\n", " splitter='best'),\n", " learning_rate=1.0, n_estimators=10, random_state=123)" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# ensemble with boosting\n", "ensemble_model(dt, method = 'Boosting')" ] }, { "attachments": {}, "cell_type": "markdown", "id": "d0fa1ce2", "metadata": {}, "source": [ "Some other parameters that you might find very useful in `ensemble_model` are:\n", "\n", "- choose_better\n", "- n_estimators\n", "- groups\n", "- fit_kwargs\n", "- probability_threshold\n", "- return_train_score\n", "\n", "You can check the docstring of the function for more info." ] }, { "cell_type": "code", "execution_count": 58, "id": "78130ed1", "metadata": {}, "outputs": [], "source": [ "# help(ensemble_model)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "ea8a9a4e", "metadata": {}, "source": [ "## ✅ Blend Models" ] }, { "attachments": {}, "cell_type": "markdown", "id": "2ede29c4", "metadata": {}, "source": [ "This function trains a Soft Voting / Majority Rule classifier for select models passed in the estimator_list parameter. The output of this function is a scoring grid with CV scores by fold. Metrics evaluated during CV can be accessed using the `get_metrics` function. Custom metrics can be added or removed using `add_metric` and `remove_metric` function." ] }, { "cell_type": "code", "execution_count": 59, "id": "61a7a1c5", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[QuadraticDiscriminantAnalysis(priors=None, reg_param=0.0,\n", " store_covariance=False, tol=0.0001),\n", " LinearDiscriminantAnalysis(covariance_estimator=None, n_components=None,\n", " priors=None, shrinkage=None, solver='svd',\n", " store_covariance=False, tol=0.0001),\n", " KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',\n", " metric_params=None, n_jobs=-1, n_neighbors=5, p=2,\n", " weights='uniform')]" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# top 3 models based on recall\n", "best_recall_models_top3" ] }, { "cell_type": "code", "execution_count": 60, "id": "04f65f2f", "metadata": {}, "outputs": [ { "data": { "text/html": [], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "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", "
 AccuracyAUCRecallPrec.F1KappaMCC
Fold       
00.90910.97400.90910.92730.90760.86250.8735
11.00001.00001.00001.00001.00001.00001.0000
21.00001.00001.00001.00001.00001.00001.0000
30.90911.00000.90910.92730.90760.86250.8735
41.00001.00001.00001.00001.00001.00001.0000
50.90001.00000.90000.92500.89710.84850.8616
61.00001.00001.00001.00001.00001.00001.0000
71.00001.00001.00001.00001.00001.00001.0000
81.00001.00001.00001.00001.00001.00001.0000
91.00001.00001.00001.00001.00001.00001.0000
Mean0.97180.99740.97180.97800.97120.95730.9609
Std0.04310.00780.04310.03370.04400.06530.0599
\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Processing: 0%| | 0/6 [00:00#sk-container-id-11 {color: black;background-color: white;}#sk-container-id-11 pre{padding: 0;}#sk-container-id-11 div.sk-toggleable {background-color: white;}#sk-container-id-11 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-11 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-11 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-11 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-11 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-11 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-11 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-11 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-11 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-11 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-11 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-11 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-11 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-11 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-11 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-11 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-11 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-11 div.sk-item {position: relative;z-index: 1;}#sk-container-id-11 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-11 div.sk-item::before, #sk-container-id-11 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-11 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-11 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-11 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-11 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-11 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-11 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-11 div.sk-label-container {text-align: center;}#sk-container-id-11 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-11 div.sk-text-repr-fallback {display: none;}
VotingClassifier(estimators=[('Quadratic Discriminant Analysis',\n",
       "                              QuadraticDiscriminantAnalysis(priors=None,\n",
       "                                                            reg_param=0.0,\n",
       "                                                            store_covariance=False,\n",
       "                                                            tol=0.0001)),\n",
       "                             ('Linear Discriminant Analysis',\n",
       "                              LinearDiscriminantAnalysis(covariance_estimator=None,\n",
       "                                                         n_components=None,\n",
       "                                                         priors=None,\n",
       "                                                         shrinkage=None,\n",
       "                                                         solver='svd',\n",
       "                                                         store_covariance=False,\n",
       "                                                         tol=0.0001)),\n",
       "                             ('K Neighbors Classifier',\n",
       "                              KNeighborsClassifier(algorithm='auto',\n",
       "                                                   leaf_size=30,\n",
       "                                                   metric='minkowski',\n",
       "                                                   metric_params=None,\n",
       "                                                   n_jobs=-1, n_neighbors=5,\n",
       "                                                   p=2, weights='uniform'))],\n",
       "                 flatten_transform=True, n_jobs=-1, verbose=False,\n",
       "                 voting='soft', weights=None)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "VotingClassifier(estimators=[('Quadratic Discriminant Analysis',\n", " QuadraticDiscriminantAnalysis(priors=None,\n", " reg_param=0.0,\n", " store_covariance=False,\n", " tol=0.0001)),\n", " ('Linear Discriminant Analysis',\n", " LinearDiscriminantAnalysis(covariance_estimator=None,\n", " n_components=None,\n", " priors=None,\n", " shrinkage=None,\n", " solver='svd',\n", " store_covariance=False,\n", " tol=0.0001)),\n", " ('K Neighbors Classifier',\n", " KNeighborsClassifier(algorithm='auto',\n", " leaf_size=30,\n", " metric='minkowski',\n", " metric_params=None,\n", " n_jobs=-1, n_neighbors=5,\n", " p=2, weights='uniform'))],\n", " flatten_transform=True, n_jobs=-1, verbose=False,\n", " voting='soft', weights=None)" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# blend top 3 models\n", "blend_models(best_recall_models_top3)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "9e788c9c", "metadata": {}, "source": [ "Some other parameters that you might find very useful in `blend_models` are:\n", "\n", "- choose_better\n", "- method\n", "- weights\n", "- fit_kwargs\n", "- probability_threshold\n", "- return_train_score\n", "\n", "You can check the docstring of the function for more info." ] }, { "cell_type": "code", "execution_count": 61, "id": "99b549a6", "metadata": {}, "outputs": [], "source": [ "# help(blend_models)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "e76969b0", "metadata": {}, "source": [ "## ✅ Stack Models" ] }, { "attachments": {}, "cell_type": "markdown", "id": "55909804", "metadata": {}, "source": [ "This function trains a meta-model over select estimators passed in the estimator_list parameter. The output of this function is a scoring grid with CV scores by fold. Metrics evaluated during CV can be accessed using the `get_metrics` function. Custom metrics can be added or removed using `add_metric` and `remove_metric` function." ] }, { "cell_type": "code", "execution_count": 62, "id": "201c681e", "metadata": {}, "outputs": [ { "data": { "text/html": [], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "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", "
 AccuracyAUCRecallPrec.F1KappaMCC
Fold       
00.90910.97400.90910.92730.90760.86250.8735
11.00001.00001.00001.00001.00001.00001.0000
21.00001.00001.00001.00001.00001.00001.0000
30.90911.00000.90910.92730.90760.86250.8735
41.00001.00001.00001.00001.00001.00001.0000
50.90001.00000.90000.92500.89710.84850.8616
61.00001.00001.00001.00001.00001.00001.0000
71.00001.00001.00001.00001.00001.00001.0000
81.00001.00001.00001.00001.00001.00001.0000
91.00001.00001.00001.00001.00001.00001.0000
Mean0.97180.99740.97180.97800.97120.95730.9609
Std0.04310.00780.04310.03370.04400.06530.0599
\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Processing: 0%| | 0/6 [00:00#sk-container-id-12 {color: black;background-color: white;}#sk-container-id-12 pre{padding: 0;}#sk-container-id-12 div.sk-toggleable {background-color: white;}#sk-container-id-12 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-12 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-12 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-12 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-12 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-12 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-12 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-12 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-12 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-12 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-12 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-12 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-12 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-12 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-12 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-12 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-12 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-12 div.sk-item {position: relative;z-index: 1;}#sk-container-id-12 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-12 div.sk-item::before, #sk-container-id-12 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-12 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-12 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-12 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-12 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-12 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-12 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-12 div.sk-label-container {text-align: center;}#sk-container-id-12 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-12 div.sk-text-repr-fallback {display: none;}
StackingClassifier(cv=5,\n",
       "                   estimators=[('Quadratic Discriminant Analysis',\n",
       "                                QuadraticDiscriminantAnalysis(priors=None,\n",
       "                                                              reg_param=0.0,\n",
       "                                                              store_covariance=False,\n",
       "                                                              tol=0.0001)),\n",
       "                               ('Linear Discriminant Analysis',\n",
       "                                LinearDiscriminantAnalysis(covariance_estimator=None,\n",
       "                                                           n_components=None,\n",
       "                                                           priors=None,\n",
       "                                                           shrinkage=None,\n",
       "                                                           solver='svd',\n",
       "                                                           store_covariance=False,\n",
       "                                                           tol=0.0001)),\n",
       "                               ('K Neighbors...\n",
       "                                                     n_jobs=-1, n_neighbors=5,\n",
       "                                                     p=2, weights='uniform'))],\n",
       "                   final_estimator=LogisticRegression(C=1.0, class_weight=None,\n",
       "                                                      dual=False,\n",
       "                                                      fit_intercept=True,\n",
       "                                                      intercept_scaling=1,\n",
       "                                                      l1_ratio=None,\n",
       "                                                      max_iter=1000,\n",
       "                                                      multi_class='auto',\n",
       "                                                      n_jobs=None, penalty='l2',\n",
       "                                                      random_state=123,\n",
       "                                                      solver='lbfgs',\n",
       "                                                      tol=0.0001, verbose=0,\n",
       "                                                      warm_start=False),\n",
       "                   n_jobs=-1, passthrough=True, stack_method='auto', verbose=0)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "StackingClassifier(cv=5,\n", " estimators=[('Quadratic Discriminant Analysis',\n", " QuadraticDiscriminantAnalysis(priors=None,\n", " reg_param=0.0,\n", " store_covariance=False,\n", " tol=0.0001)),\n", " ('Linear Discriminant Analysis',\n", " LinearDiscriminantAnalysis(covariance_estimator=None,\n", " n_components=None,\n", " priors=None,\n", " shrinkage=None,\n", " solver='svd',\n", " store_covariance=False,\n", " tol=0.0001)),\n", " ('K Neighbors...\n", " n_jobs=-1, n_neighbors=5,\n", " p=2, weights='uniform'))],\n", " final_estimator=LogisticRegression(C=1.0, class_weight=None,\n", " dual=False,\n", " fit_intercept=True,\n", " intercept_scaling=1,\n", " l1_ratio=None,\n", " max_iter=1000,\n", " multi_class='auto',\n", " n_jobs=None, penalty='l2',\n", " random_state=123,\n", " solver='lbfgs',\n", " tol=0.0001, verbose=0,\n", " warm_start=False),\n", " n_jobs=-1, passthrough=True, stack_method='auto', verbose=0)" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# stack models\n", "stack_models(best_recall_models_top3)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "af78cda8", "metadata": {}, "source": [ "Some other parameters that you might find very useful in `stack_models` are:\n", "\n", "- choose_better\n", "- meta_model\n", "- method\n", "- restack\n", "- probability_threshold\n", "- return_train_score\n", "\n", "You can check the docstring of the function for more info." ] }, { "cell_type": "code", "execution_count": 63, "id": "3305e597", "metadata": {}, "outputs": [], "source": [ "# help(stack_models)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "279a3127", "metadata": {}, "source": [ "## ✅ Plot Model" ] }, { "attachments": {}, "cell_type": "markdown", "id": "862bd3e9", "metadata": {}, "source": [ "This function analyzes the performance of a trained model on the hold-out set. It may require re-training the model in certain cases." ] }, { "cell_type": "code", "execution_count": 64, "id": "9c8da9b4", "metadata": {}, "outputs": [ { "data": { "text/html": [], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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iIiIiGQIDg4OKQJz8mNHR0eL5dOnT6dkyZJ06NCBcuXKMX78eDJlysSaNWtSvT0FaRERERHJEHLnzk1ISAjx8fHmZUFBQTg6OpItWzaLsn///TelS5c2P7a2tqZ06dJcvXo11dtTkBYRERGRDKFMmTLY2tpy5MgR8zI/Pz/Kly+PtbVl7M2VKxdnz561WHb+/Hny58+f6u0pSIuIiIhIhpApUya8vLwYM2YMx44dY/v27SxcuBBvb28gaXQ6OjoagLfffpsffviBdevWcfHiRaZPn87Vq1dp1apVqrenq3aIiIiISIbh4+PDmDFj6Ny5M05OTvTt25dGjRoBULt2bSZNmkTr1q1p2rQpERERfPXVV1y/fp0yZcqwePFiXFxcUr0tBWkRERERyTAyZcrElClTmDJlSornAgICLB63a9eOdu3aGd6WpnaIiIiIiBigIC0iIiIiYoCCtIiIiIiIAZojLSIiIiJpws7WRMm8kWlaZ7CtKU3rS0sakRYRERERMUBBWkRERETEAAVpEREREREDFKRFRERERAxQkBYRERERMUBBWkRERETEAAVpEREREREDFKRFRERERAxQkBYRERERMUBBWkRERETEAAVpEREREREDFKRFRERERAxQkBYRERERMUBBWkRERETEAAVpEREREREDFKRFRERERAxQkBYRERERMUBBWkRERETEAAVpEREREREDFKRFRERERAxQkBYRERERMUBBWkRERETEAAVpEREREREDFKRFRERERAxQkBYRERERMUBBWkRERETEAAVpEREREREDFKRFRERERAxQkBYRERERMUBBWkRERETEAAVpEREREREDFKRFRERERAxQkBYRERERMUBBWkRERETEAAVpEREREREDFKRFRERERAxQkBYRERERMUBBWkRERETEAAVpEREREREDFKRFRERERAxQkBYRERERMUBBWkRERETEAAVpEREREREDFKRFRERERAxQkBYRERERMcA2vTY8OjEgvTYtGZT6lKQ19SlJa1YtNqR3EySjOH48vVsgpGOQFhEREZGMxcbBmleqZEvTOkMcnt8JFOkWpMdalUqvTUsGkzxqqD4laUV9StJacp9K3NAinVsiGUbhiendAkFzpEVEREREDFGQFhERERExQEFaRERERMQABWkREREREQMUpEVEREREDFCQFhERERExQEFaRERERMQABWkREREREQMUpEVEREREDFCQFhERERExQEFaRERERMQABWkREREREQMUpEVEREREDFCQFhERERExQEFaRERERMQABWkREREREQMUpEVEREREDFCQFhERERExQEFaRERERMQABWkREREREQMUpEVEREREDFCQFhEREZEMIyYmhuHDh1OlShVq167NwoULH1o2ICCAd955Bw8PD1q0aMH+/fufaFsK0iIiIiKSYUydOpUTJ06wePFiRo8ezZw5c9iyZUuKcmFhYXzwwQcUL16cDRs20LBhQ/r06cOtW7dSvS0FaRERERHJECIjI1m1ahWffPIJ7u7uNGzYkK5du7Js2bIUZX/88UcyZ87MmDFjKFSoEP369aNQoUKcOHEi1duzTcvGi4iIiIikF39/f+Lj4/H09DQvq1y5MvPnz8dkMmFt/e8Y8sGDB6lfvz42NjbmZWvWrHmi7WlEWkREREQyhKCgIHLmzIm9vb15maurKzExMdy5c8eibGBgIM7OzowcOZJXX32Vt99+Gz8/vyfanoK0iIiIiGQIUVFRFiEaMD+OjY21WB4ZGcmCBQtwc3PD19eXqlWr0qVLF65du5bq7SlIi4iIiEiG4ODgkCIwJz92dHS0WG5jY0OZMmXo168fZcuW5eOPP6Zw4cL89NNPqd6egrSIiIiIZAi5c+cmJCSE+Ph487KgoCAcHR3Jli2bRVk3NzeKFi1qsaxw4cIakRYRERGRl0+ZMmWwtbXlyJEj5mV+fn6UL1/e4kRDgIoVKxIQEGCx7Ny5c+TLly/V21OQFhEREZEMIVOmTHh5eTFmzBiOHTvG9u3bWbhwId7e3kDS6HR0dDQA//vf/wgICGD27NlcvHiRWbNmERgYSMuWLVO9PQVpEREREckwfHx8cHd3p3PnzowdO5a+ffvSqFEjAGrXrs2mTZsAyJcvH19//TW7du2iefPm7Nq1iwULFpA7d+5Ub0vXkRYRERGRDCNTpkxMmTKFKVOmpHju/qkclStXZu3atYa3pRFpEREREREDFKRFRERERAxQkBYRERERMUBBWkRERETEAAVpEREREREDFKRFRERERAxQkBYRERERMUBBWkRERETEAAVpEREREREDFKRFRERERAxQkBYRERERMUBBWkRERETEAAVpEREREREDbNO7ASIiIiKSQThaY/WGc5rX+bx6flsm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oiWjU5B+Asl3YerVqxd3794lIiLCHKJjY2PJmzcv8+fPp3nz5pw+fZqhQ4cSGhrKtWvXNBotIiIiksFoaocBBw4coEePHsTGxvLDDz9Qrlw54N950FOnTmXLli3s3LmT69evkytXLqytrRWmRURERDIQnUJrQPXq1VmyZAn29vasWLGCwMBAAPPJhLGxseTKlQuAPHnyYG1tjclkUogWERERyUAUpA3y8PDgm2++Yffu3fj6+hIQEACAv78/hw4dokSJEhblddkfERERkYxFUzv+Iz8/P7p27YrJZKJIkSJkzpyZmJgYli9fjr29vaZziIiIiGRQGib9jypXrszixYuJj48nISGBFi1asGbNGuzt7YmNjVWIFhEREcmgFKTTgIeHB9999x23bt1i3759nD17FiDFDVhEREREJOPQ1I40dOjQIfr06UOpUqUYPnx4innSIiIiIpJxaEQ6DVWqVIlZs2Zx6dIlsmbNmt7NEREREZGnSCPST0F0dDSOjo7p3QwREREReYoUpEVEREREDNDUDhERERERAxSkRUREREQMUJAWERERETFAQVpERERExAAFaRERERERAxSkRUREREQMUJAWERERETFAQVpERERExID/AxjZQQzNHdq7AAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# plot class report\n", "plot_model(best, plot = 'class_report')" ] }, { "cell_type": "code", "execution_count": 65, "id": "952b6f24", "metadata": {}, "outputs": [ { "data": { "text/html": [], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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/rP8888/1bt371S/pgTffvutZs2aZfEdT/hu7N27V71799bHH3+s48ePa/jw4bpz547F40+ePKmTJ0/qzz//1KxZszIUxK1evVoff/yx1RQrFy5c0IULF/TLL79o6tSpSQayd+/e1ahRo3T48GGr+xI+K19fX23cuFFz587VrFmzLIKIxOzatUtvvvmmsehggoTv7NKlSzVhwgR169YtTa81KYcOHdK1a9ckxU/dkRC0dezYURMnTlRERIR27Nghf39/FSpUKNX1ZvR1hISEaNy4cdqyZYvVfdHR0QoLC9OtW7e0Y8cOzZ49W7Nnz1aZMmVS1TYPDw+1bNnSWBRy/fr1eu2115J9zLp16yTFXw3xzDPPGH+/f/++Xn/9dat+JioqSmFhYfL19dX69ev1448/atasWakOe2xV/6OvT4qfsz+tv5n169fX7NmzVbNmTeXNmzfNz59Zn3dm9J2//fabPv74Y6vfsYCAAAUEBOjkyZP66aefNHjw4Gybvz4uLk7ffvutfvrpJ8XGxlrcl9A///nnn1qwYIF+/PHHRMPOrVu36oMPPtD9+/et7nvw4IEePHigc+fO6ZdfftFrr72W6b+T5iIjIzV58mQtXrzYarogf39/+fv7a+fOnZoxY4a+/fbbVE17ktH+Patdv37d2HZ0dJSnp2ei5fz8/DRy5EidOnXK4u+RkZEKDg7WhQsXtGjRIr388st64403ZG+f/AXHgYGBGjRokE6cOGHx9ytXrujKlStaunSpJk6cqK5duyZZx+3bt/X222/rwIEDVvf5+PjIx8dHa9asUYMGDfTNN9+k+LsXFBSkQYMGGQM3pPj9joQrdgAAsDVCaQDpdu7cOSPIsrOzS9Vo0qS0a9fOGIWxc+fOLA2lx44dqz/++ENS/AFK06ZNValSJbm5uenhw4c6ceKEDh06JJPJpPv372v48OHauHGj1Wi0sLAw9e3bVxcvXpQUf3lw69atVaFCBQUHB2vHjh26evWqPv744yTnCn3UzJkzLQLpBOajWr/++mvNmjVLUvz73qBBA9WoUUN58uRRaGiozp49qz179ig2NlZhYWF68803tX79ehUtWlSSVLJkSb399tt6+PChZsyYIUkqUaKEEXwmTImRGv7+/urTp48xF7iTk5OaNWumKlWqKCIiQocPH9bx48cVFxenGTNmyMnJScOGDUt1/Snx8PBQpUqVdObMGUnx4XBqQ+moqCgNHjzYCFWKFCmiFi1aqEiRIgoLC9OFCxe0c+dOxcXF6fjx4xo2bJgWL15sVc/evXs1aNAgI0jOmzevWrdurRIlSiggIEA7d+6Ur6+vQkJCNGrUKP30009q1KiRVT0xMTEaO3asUU+CPHnypPlg/ueffzbCtXr16qlOnTqKiYnR/v37jfdqyZIlKlOmjH788UcFBgaqcuXKatasmXLlyqWDBw8aB8G7d+/WokWLEh19mBp//fWXjhw5ori4OFWoUEFNmzaVh4eHrl69qs2bNys8PFyhoaEaMWKEtmzZYhVehYWFqU+fPrpx44ak+M+8efPmKl26tJydnXXnzh3t3btXly9fliSdOXNG7733nmbOnJlkm/7++2+tXbtW4eHhKl68uFq2bKn8+fPr5s2b2rhxo4KCghQdHa13331X1apVU7ly5SRJnp6eevvttyVJX3zxhaT4zzshaE3u/3nCAodS/EjNBHny5FGbNm30+++/KyYmRitWrEj1/5H0vo4EcXFxevXVV43vSu7cudW8eXOVK1dOuXPn1oMHD3Tw4EGjT/Lx8dHIkSO1evXqFAMZ89eaEEr//vvvyYbSFy5cMH4HGjVqZBHOjxkzxminl5eXWrVqpRIlSig6OlrXrl3T5s2bjRNhAwcO1Pr169M0qjur65fiwzHzMCg9C/va2dklOyoyOZn1eWdG33no0CG9//77xkmzevXqqXbt2sqTJ4/u3Lmj/fv36+LFi4qJidEPP/ygwoULq2fPnim+xoTfNyn+JEjCa3nhhReMEwnly5dP9Xv23nvvaeXKlcbthD7Mzc1NV69e1aZNmxQdHa1Tp07p5Zdf1m+//abcuXMb5f/880+NGDHCCLTLly+vRo0aqUCBAoqKitLVq1e1c+dOhYSEyGQyacaMGapcubLFb37C65k5c6aCgoIs/pYWMTExGjFihHbu3Gn8rUaNGmrQoIFcXV11/fp1bdu2TcHBwfL19dWLL76o2bNnW1yR86iM9u9ZzWQy6ZdffjFu16lTJ9H/tz4+Purdu7cxCtnT01MtW7ZUqVKlFBERoZMnT2rfvn2KjY3VnDlzdPfuXeM3ICnDhw/XiRMnZG9vr+bNm6tatWoKDQ3V1q1bdePGDUVHR2vs2LGKjY1NdEHpu3fvqk+fPkaf4ejoaOxf2dnZ6cyZM9q1a5diYmJ04MABPf/881q+fHmywfTnn39u0Qcl6NChg/G4jH7PAABIC0JpAOlmHp6WLVs21cFrYho2bKipU6dKir+sNDIyUrly5cpwGx+1f/9+I5D28PDQggULEp1W4sCBA3rttdcUHh6uu3fvauvWrVYjDWfMmGEE0sWKFdPs2bMtAtE333xTP/zwg3788UdjBz8lu3btkqurqz766CO1adNGoaGh2rBhg1q0aCEpfvTj3LlzJcUHwDNnzkw0sDx//rxefvllBQQEKDw8XCtXrjSCriJFiuiVV16Rr6+vEUon/C2tPvzwQyOQLlOmjKZNm2YVCi9evFiffPKJJOnHH39U165dU7yEPy3KlCljBK3mI6JSsmnTJl26dElS/OjDOXPmWH3nTp48qZdeeklhYWE6cuSIDh06pHr16hn3h4aG6u233zaC5NatW+uzzz6zGME4duxYffDBB1q9erViY2P14YcfatOmTVahno+PjySpVq1aev/991WuXDldvnxZFy9eTHP4dezYMbm6uuq7775T8+bNjb/HxsbqjTfe0IYNGyRJkyZNkhR/yfHLL79sUYf5Jb+//fZbukPpQ4cOycHBQRMmTLAKlYYPH67+/fvr5s2bCgkJ0fLlyzV48GCLMnPmzDEC6apVq+qnn36Sl5eX1fPMmTNHX375paT4E1t+fn7GfPWPShi5NmLECA0ePNhiFPioUaP0yiuv6OzZs4qNjdX8+fM1fvx4SfFTxiT8P0kIJMz/lpSQkBAjmHV2dtbTTz9tcX+PHj30+++/S5JWrFihIUOGpGpkenpfR4JVq1YZAWWxYsW0YMECFS9e3Op5/vjjD7355puKi4vT+fPndeTIEYv/B8lp1qyZ8uXLp4CAAF24cEEXL15MMhRcu3atsW2+ONnRo0e1b98+SfG/NYsXL7Ya7Xjjxg316dNHd+/elY+Pj9avX5/qUe5ZXX8C88vfXV1dE52WIStl1uedGX3n9OnTjUD6448/troaxGQy6ZtvvjFOwM6YMSNVobT5b9nFixeN/ZROnTolG64mZuPGjUYg7ejoqI8++shqzYwRI0aof//+un37ti5duqQ5c+YYv7WxsbH69NNPjUB6+PDhiZ5wevDggYYOHWpM47N48WKLUDrh9SxatMjYl0jP7/X06dONQNrV1TXRq6ju37+vsWPH6q+//lJkZKRGjx6t33//PckwOaP9e1YKDg7W5MmTjcVlJSV6Uiw2NlajR482AulnnnlGH3/8sdVAhJMnT2rYsGHy9/c3Rif36NEjyec/ePCgPD09NX36dIuRyGPGjNHkyZO1cOFCmUwmffbZZ2rRooXVezxmzBgjQC5durSmTZtmdWLx/PnzGjp0qHx8fOTn56c33nhD8+fPT7JNu3btUoECBfTJJ5+oYcOGun//vjZv3qyaNWuqZs2akjL+PQMAIC1Y6BBAuiVcii5JhQsXzlBd5pe8xsXFydfXN0P1JcV8Ttfhw4cnOc9xgwYNLEYzPjp6OTAwUPPmzZMUHw5Pnz7dKox1cHDQyJEjEx0Bk5zx48erW7ducnd3V6FChTRgwAC5urpKir/0O2GRnr59+yY5grZixYoaOHCgcTshtM1MFy9etDjAnTNnTqKjlPv06WMcuMXGxmrFihWZ2g7zUUEPHjxI9ePML6l96aWXEj0JUqNGDeN9tLe318mTJy3uX716tXEgW6VKFX3//fdWl9Q7Oztr/PjxeuKJJyTFh1tJLWjn7e2tn376SdWrV5eLi4uqVatm8T1MizFjxlgE0lL8d/LRUKRjx45WgbQkDR48WG5ubpLiR7AmNlVMar322muJBkolSpTQyJEjjdsJwaC51atXG9uTJk1KNJCWpFdffdXigP3s2bPJtqlr164aOnSoVfjr7e2td999N9k2pdWGDRuMeYRbt25t9R1p2LChcSXD7du3tWPHjlTXnZHXYd4fvvfee4kGlFL8NDnNmjUzbqelP3F0dFTnzp2N2wnh+6NMJpNxwtDV1dVimhvz/6vPP/98opfflyxZUmPGjJEUP5r40Uvwk5PV9Se4deuWsV2wYMFUjzbPLJn1eWdG33n8+HFJ8SeHX3jhBavH29nZacyYMcaJpYCAAKvpkbLa7Nmzje033ngj0UWcS5UqZbHY87Jly4ztQ4cOGfsyVatWTfIKCC8vL40bN864nRW/1w8ePDD2WSTpq6++SnRaL29vb02bNk1Vq1aVFP++JxdyShnr39NjxYoV+umnnxL9N336dE2ePFmvvfaaWrRoYbG/8frrr6tp06ZW9W3atMn4/9ywYUN98cUXic7TXqNGDf3www/GlDvTpk2zmtLFnL29vaZNm2Y1NYaTk5Pef/99tWzZUlL83Pvm3zUp/gqlgwcPSor/P/Lzzz9bBdJS/L7evHnzjPbu37/fIoRPzNSpU9W6dWu5ubmpRIkSBM8AgGzFSGkA6RYSEmJse3h4ZKiuRy83fPjwYYbqS0qHDh1UpkwZ+fr6WozES4z5KLbQ0FCL+3bt2mWEdK1atUp2xFvC5c+JzV/9KE9PT3Xq1CnJ+xs2bCgXFxf5+vqqV69e6W5/Zti6daux3aNHjyQDDik+QD958qRKly6d5OjV9HJxcTG20xJKm4d4x44dS3Le7f79++vpp59WsWLFrEYsm78HQ4YMkZOTU6J1ODs768UXX9SqVatUunTpRBcOlOJHh6Zn0bJHubq6Jvn9KFu2rJycnIzR3YkFLVL8gXOpUqV09uxZxcXFKTAwMMnFoVLSp0+fJO8zHz157949i/uioqI0dOhQ+fr6KjIyUpUqVUr2eSpWrGiM4EzpO59cm2rVqmW8R4+2KT3Mp+5I7CSVvb29unXrph9//FGStHTp0lTPA5+R1/HCCy+oYcOGunPnjnE1RlIqVqyoP//8U5Jl358azz77rBYsWCApfhRuYnPmHjp0SDdv3pQktWnTxjgRJ1n+X00IMxPTsWNH1ahRQyVKlEjTlTZZXX+ChBMTkpI8uZKVMuvzzoy+M6EPDA0N1cWLFxNdENjOzk7z5s2Ti4tLuvue9PL39zdORnt5eenFF19MsmzdunXVuHFjmUwmlS5d2lh8slChQnrvvffk6+ur+vXrJ/t85n1bVvxe79ixw6i3fv36Vgu2mnN2dtZbb72lAQMGSIrvv5Kb5zq9/Xt6JVzhlVqFCxfWG2+8keQ+n/naKIMGDUr2ZFGNGjXUpEkT7d69W35+fjpy5EiSn227du1Ut27dJOsaOXKkcQJy69atGjt2rHGf+cm7/v37JzutWokSJdSvXz9Nnz5dUvznldSAhSpVqiS5RgoAANmBUBpAjvDoYk8ZWVQtOS1btjRGpyQnYWGrBAmjkxOYj3Q1H1GWmMKFC6tKlSqJzhX9qJo1ayZ7QFS/fv0UD26l+DDPfCqLR9ufGczfg5QCjqpVqyY5QjKjzEfwpmXkYb169fTzzz9Lip/6wc/PT127djXm10yQN2/eRBcUi4qKMha4dHBwSHGe1759+6pv377JlqlVq1aq25+cihUrJjnlh52dnfLnz2+M2kwu6DV/H9I7Urpo0aIqUKBAkvebX7IcGRlpcZ+zs3Oyl0ebu3fvnsVJiUfn5jbn6OioKlWqJHm/k5OT8uTJo/v371u1Ka2uXLliTJlQsGDBJMOC7t27a/r06TKZTNq9e7d8fHxSnOYmo6/j0WlEkhIUFGRM0yOlvT+pUqWKKlSooAsXLsjHx0cnTpwwLhVPYL4A4KMLf5n3eRs2bNDDhw/Vs2dPNWnSxOKEqIuLS6KjCVOS1fUnMP9dy8iVB+mVWZ93RvvOhDq2bt2q2NhYvfjii+rfv79atWqlypUrW+wPJCwIamvmo02bNGmS4hRK5qOQE5QpUyZVi4KaTCZjKrCE27GxsZm6H7R//35jO7nFdhM0atRInp6eCgwM1N27d3Xt2jWVLl3aqlxG+vesVKxYMbVr106NGjVS48aNkzxhHBMTY7G4aXL9aYLatWtr9+7dkpRsKG1+hUhiKleurCJFiujWrVu6ceOGrl+/bnzf0/p5dezY0QilH11421xm7WMAAJBZCKUBpFvCpf1Sxkc2BwYGWtzOly9fhupLrdDQUF29elU3btyQj4+Prl69qr///ttYYCnBo6vUmy8Uk5qF9SpUqJCqUDq50caJiYyMNNp/48YNXbt2TRcuXNC5c+csQo9H258ZzC9FT8vCUZktODjY2E7LiP1WrVqpfv36xiWyGzZs0IYNG+Tk5KQ6deqoadOmatGiRaIj+KT4y5oTgs/ixYtbLG6VXmn9/JOS0qhC8/A+qdDo0XLpldL/ZfOR7qm5miAgIEBXr16Vj4+Pbty4ocuXL+vcuXPGvNOp4eHhkWLIlNCu1LQpOeajpLt27Zpk0FSiRAnVq1dPBw8elMlk0rJly/Tmm28mW3dmv46goCBdu3bN6E+uXLmiv//+W5cvX7boQ9LTn3Tt2tWY8/v333+3CKWjoqKMObcLFiyoxo0bWzy2UqVK6tq1q9asWSMpPjDcs2ePHBwcVL16dTVr1kxPPfWUqlevbnWCMzWyuv4E5usupOWqjqyS3s87o32nFD991t69exUWFqagoCBNnTpVU6dOVb58+dSkSRM1a9ZMzZo1y5YR5ZLl71tGTkSYi4uL0/Xr1439jWvXrunSpUs6c+aM1T5UZv9mm59kT2raskdVqlTJCEd9fHwSDaUzu39PjW3btln8VkZHR+v27dtavXq1Zs+ercjISN26dUsRERFq0KBBkoG0JN28edPiCoa0Lj5q/j15VMIUKMkpV66cUcfNmzdVqlQpxcTEGH9zcnJK1fevfPnyxlUxd+7cUVRUVKK/DZm1jwEAQGYhlAaQbuYjmBIuu04v8x17Ozu7LF2hPS4uTmvWrNHixYt1+vTpJA+UHBwckpwvMCAgwNhOTRCa2gPr1C4WuW3bNi1YsECHDx9OctRicu3PDGl9D7LK/fv3je20nMywt7fXjz/+qAkTJmjNmjVGCBAdHa0DBw7owIED+vrrr1WqVCl1795d/fv3txgFmBWvP7PqMQ8CUpJVVyUkSEtbkhISEqL58+dr1apVxoKQiUntdz4z2pQasbGxRtApxc9R++jcoUlZuXKlRowYkWzonBmvIyoqSkuXLtWKFSt04cKFJMtltD/p0qWLvvnmG8XGxmrDhg165513jJMef/75p7Gw1tNPP53oyZAJEyYoX758WrBggdHnxcbG6vjx4zp+/LimTp2qQoUKqUuXLho4cGCaf0Oyun7J8jczICBAcXFxNp9XOjM+74z2nVJ84Dlv3jy9++67unz5svH3gIAArV27VmvXrpWDg4MaNWqkfv36pXg1TmYz/13JaL/8999/a/bs2dq+fbtFAGouq3+vzU/8J3ci0pz53OpJLdZsq740OU5OTipRooSGDx+uxo0b65VXXlF4eLiWLFmia9euadasWUn2o48OiEir5B6fmv0R888iYXoT8/fa3d09Vb/R9vb2xlUxCe1K7OR0du6rAQCQGEJpAOlWrVo1Y/vq1asKDAxMdIGo1DC/3LBy5coZOtBJboRRaGiohg0bZrXQnJ2dnQoXLqxy5cqpWrVqql+/vnx9ffXBBx8kWk9aR8slN1LHXFJzDSeIiYnRuHHjLC51T1CgQAGVLVtWVatWVb169WRvb69BgwalqZ1pkRVTgqSH+aJQqbn01lyePHk0efJkDR06VH/88Yd27NihU6dOWZyouH79ur799lstX75cCxYsMEYaZcXrz6yAOCOjOXOay5cv63//+5/F1QlS/P+VEiVKqEKFCqpRo4YaN26sBQsWWCzmlt3+/PNPYyHMtAoICNDmzZtTPeVCety9e1evvvqq/v77b4u/29vbq1ixYipfvryqV6+uBg0aaPfu3cac1+lRsGBBNWrUSLt379bdu3d14MABNWrUSFLyU3ckcHZ21tixYzVgwABt2LBB27Zt07FjxyymafH399fs2bONhdDMf6NSktX1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AADTEEoDAAAAAAAAAExDKA0AAAAAAAAAMA2hNAAAAAAAAADANITSAAAAAAAAAADTEEoDAAAAAAAAAExDKA0AAAAAAAAAMA2hNAAAAAAAAADANITSAAAAAAAAAADTEEoDAAAAAAAAAExDKA0AAAAAAAAAMA2hNAAAAAAAAADANITSAAAAAAAAAADTEEoDAAAAAAAAAExDKA0AAAAAAAAAMA2hNAAAAAAAAADANITSAAAAAAAAAADTEEoDAAAAAAAAAExDKA0AAAAAAAAAMA2hNAAAAAAAAADANITSAAAAAAAAAADTEEoDAAAAAAAAAExDKA0AAAAAAAAAMA2hNAAAAAAAAADANITSAAAAAAAAAADTEEoDAAAAAAAAAExDKA0AAAAAAAAAMA2hNAAAAAAAAADANITSAAAAAAAAAADTEEoDAAAAAAAAAExDKA0AAAAAAAAAMA2hNAAAAAAAAADANITSAAAAAAAAAADTEEoDAAAAAAAAAExDKA0AAAAAAAAAMA2hNAAAAAAAAADANITSAAAAAAAAAADTEEoDAAAAAAAAAExDKA0AAAAAAAAAMA2hNAAAAAAAAADANITSAAAAAAAAAADTEEoDAAAAAAAAAExDKA0AAAAAAAAAMA2hNAAAAAAAAADANITSAAAAAAAAAADTEEoDAAAAAAAAAExDKA0AAAAAAAAAMA2hNAAAAAAAAADANITSAAAAAAAAAADTEEoDAAAAAAAAAExDKA0AAAAAAAAAMA2hNAAAAAAAAADANITSAAAAAAAAAADTEEoDAAAAAAAAAExDKA0AAAAAAAAAMA2hNAAAAAAAAADANITSAAAAAAAAAADTEEoDAAAAAAAAAExDKA0AAAAAAAAAMA2hNAAAAAAAAADANITSAAAAAAAAAADTEEoDAAAAAAAAAExDKA0AAAAAAAAAMA2hNAAAAAAAAADANITSAAAAAAAAAADTEEoDAAAAAAAAAExDKA0AAAAAAAAAMA2hNAAAAAAAAADANITSAAAAAAAAAADTEEoDAAAAAAAAAExDKA0AAAAAAAAAMA2hNAAAAAAAAADANITSAAAAAAAAAADTEEoDAAAAAAAAAExDKA0AAAAAAAAAMA2hNAAAAAAAAADANITSAAAAAAAAAADTEEoDAAAAAAAAAExDKA0AAAAAAAAAMA2hNAAAAAAAAADANITSAAAAAAAA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MjJYv349CxcuNO7Ee0KhkpISTCYTeXl5fPzxx2RmZuLn50evXr0ALUImIr/PpYLpoUOHAvymdkIiIiIi17Kff/6Z8ePHc+LECdatW8eyZcuA3xZMv/HGG4SFhVFSUsLRo0evGEz37dvXCKZnzZrFihUryMzM/PNPUESkmlMoLdcETxU0wE8//cT8+fMZOHAgDz/8MAMHDuS+++5j2LBhLFq0iISEBKA09OnRowcPPPAAvr6+nDt3jnXr1vHaa68RHx9vhEJeXl7Y7XbWrl3LZ599Rn5+PvXr16dbt26AHu0Skd/PE0zXrFkTgO+++47U1NRKPioRERGRyufn58ddd90FlM7xVq5c+ZuD6euvv57x48dTu3ZtHA4HR44c4Y033mDPnj3Avw6mP/roI1VMi4j8yUzusmmeyFXI7XYbvZx37tzJiy++SGZmJgUFBZccrNx444307t2bhx9+GICjR4+yevVq1q5dS15eHmazGYvFwoABA6hVqxb+/v58+eWXnD59mszMTGw2G4sXL6Zt27blvltE5Pfav38/TzzxBAsXLiQiIqKyD0dERESkSkhJSeHdd9/l448/BkqroB988EFiY2MBrrggYUpKCo8++ignTpww5oUxMTE8+eSTdO7cGfh1Lmm321mwYAHr16/nzJkzWCwWHn30UUaMGEFAQEDFnKyISDWjUFquGXFxcYwePRq3202dOnUICwuje/fuWCwWdu7cydmzZzl58iQAQUFB3HvvvTz11FMAnDp1iq+++oq5c+eSm5sL/Hr33POvl5cXwcHBTJs2jbZt22pFZhH5jyosLFSfehEREam2ys6vyv586tQp5s2b97uC6eeff561a9fSpEkTzp49S35+Pq1atWLhwoX4+fmV+7wnmN60aRO//PILfn5+fPnll9SpU+fPPnURkWrJWtkHIPKfcOjQIaZMmYLb7SYmJoZ+/frRv39/Y6AxZMgQEhISeOmll/j5559JT08nISGBxMREIiMjCQ0NZciQIXTp0oW3336bX375hePHjwOld88jIyPp1q0bAwYM4LrrrlMgLSL/cQqkRUREpDorO78q+3NoaChjxozB7Xazdu1ajh49ysqVKwGIjY01qqDLfsZTXFRUVISvry+PP/44W7duZevWrUyZMsWYJ3q+y+VyGa088vPz2bNnD9OmTVMgLSLyJ1KltFzV3G43xcXFTJ8+nRUrVtCgQQPGjBlDv3798Pb2pqSkBIvFgtlsZvXq1UydOhWAjh07MnToUHr06HHRgmKFhYXk5+dz5MgRoLSndExMDBaLBYvFopYdIiIiIiIif1DZedWpU6c4fPgwa9asoaioCLPZzAMPPMD1119Ps2bNADh9+jTvvvsua9euBS5fMe3Zb0ZGBvfddx9nzpxh8eLFtG7dmjNnzhAREXHJIqOyFdNFRUUEBQVV4H8NEZHqR5XSclUzmUzk5eURFxeHw+EgMjKSO++8E29vb6PlBsCaNWuMQLpz587ExsYagfT+/fvJzc2le/fuuN1ufHx88PHxMfqMeXh6UyuQFhERERER+f3KBtK7d+/mnXfeISkpiczMTKN94t69e5k8ebIRSjdu3JixY8cCGBXTH330EU6nkyFDhmA2mykuLsZms2G321m1ahXnzp2jWbNmhIeH4+vrS0REBG63+5JPvXoCbT8/v3KV1CIi8udQ/wG56h04cIDk5GRsNhv3338/NWvWpKSkBKu19J7Lxx9/zAsvvABAly5dGDRoED179sRisfDpp58yYsQIvvjiC+DKgbPadYiIiIiIiPxxnnnX9u3bGTNmDPv27SMzMxN/f39j3hUREcEjjzwClIbY8GswPWDAAAASExNZtmwZM2bMAMBms5GXl8fKlSvZsGEDDoeD6OhoatasedF3X+m4RETkz6dKablqlV0p2fPa05O1bCD9/PPPA6WBtKdC2mw2c/z4cWbOnElRUREbN25k+PDhREdHV87JiIiIiIiIVCPffvut0Ss6KiqKm2++mcGDB5ORkUFqaiphYWHlqp8987/GjRszZswYoHS+l5yczPz589m2bRv16tUjJSWF9PR07HY7derUYeTIkap8FhGpghRKy1Wh7ONd6enpBAUFGa8DAwOxWq2UlJTw448/0rVrV0wm0xUDaYCQkBCCg4NJTU3F7XYb4baIiIiIiIj8eU6cOMG0adNwu920atWK2NhYow1j/fr1iY6ONtoneloy5uXl4Xa78ff3JzQ0lAkTJuDl5cVHH30ElFZNnzhxAofDgdlspnbt2sydO5cWLVpoXSARkSpIobRUeWUHEHv27OH9998nJiaGcePGAaWDFIfDAWAsTnilQNrtduN2u/H29qZdu3YcPHgQh8PBuXPnKuHsREREREREqgfPYoIHDx4kJSUFq9XKHXfcUW5dIM9Tr2azmZycHBYvXkx8fDzx8fHYbDZiY2Pp3bs3ISEhvPTSS4SEhLBmzRrOnDlDSUkJYWFhtG/fniFDhtCiRYtLLmooIiKVT6G0VHmeQPrrr79m0qRJFBYWcvz4cXr06MH1119Pp06d6NmzJ9u2bWPDhg0UFRWxdetW4NKBtMlkMnqSmUwm43XZPmMiIiIiIiLyn+UJhz///HNycnIIDw9nyJAheHt743Q6jUD6xIkTHDx4kPfee4/k5GQAY942bdo0kpOTGTNmDI0aNWLkyJHcdttt5Obmkp6eTuvWralZsyY+Pj6XXdRQREQqn0JpuSokJSUxdepUCgoKAMjJySE9Pd0Imdu3b8/u3bvJz89n27ZtANxyyy088MADdO/e/aJA2mw2k56ezvbt23G5XFx33XW0b9++Mk9RRERERESkWigqKjJ+zs/Px9vb2wiPN27cyNKlSzl27Bg5OTnGdj4+PhQWFuJ2u1m1ahWRkZEMHjwYgCZNmlzye9SyQ0Sk6lIoLVXShT2/cnNzyc/PByA8PJyXXnqJ6667ztgmNjaW7du3s2fPHsxmMy6Xi9DQUG699dZy+/QE0na7nY8//pi0tDS8vLy46aabsFgs6jUmIiIiIiLyJ3G73TidTuPJ1aKiIjZt2sTNN9/MoUOH2Lt3L8uXLze2DwwMpHHjxgwdOpTQ0FA+//xz1q1bR25uLsuWLeOuu+6iTp06lXU6IiLyByiUlirJEwzv2rWLzMxM8vLyyM/Pp06dOsyYMYOWLVsa2zocDnx8fJg9ezaDBg3i2LFjACxdupQGDRrQvXt3IiMjjTvvGRkZfPLJJ6xfv56srCyCg4N58MEH8fX1rfgTFRERERERqSZMJhNWq5XY2FgOHz5MamoqM2fOZM6cORQVFZGXl2dsGxERwYgRI7jxxhsJDQ0FoFWrVhw4cID4+Hiys7MpKSmprFMREZE/SKG0VFnbt29n9OjRREZG0rdvX3x9fQkICKBhw4bltrNarTidTmrXrs3s2bMZP348SUlJALz11lts2bKFpk2b0qxZM5xOJ5s3b+bs2bNkZWXh6+vLjBkzaN68uaqkRUREREREKkC3bt3o378/69atIzs7u9zvIiMjadOmDc8++yz+/v7G+4WFhfj4+BAVFUVCQgI2m81Y8F5ERK4+CqWlSnK5XKSlpWG1WklMTGTJkiXGXfBLDTw8rTeaNWvG4sWLefzxx4mPj8fhcHDo0CEOHToE/Lo4hre3N40bN+att96iTZs2WpFZRERERESkgtSqVYsnnniCqKgolixZgtPpxMfHhx49etCrVy+uv/56LBYLTqfTmOv5+Phgt9s5dOgQDoeDkJAQGjVqVNmnIiIiv5PJ7WnmJFLF5Ofns2XLFl599VVjgQuTycTcuXPp2bPnJSubPYOWwsJCPvzwQ77//nt27NhRbpvmzZvzl7/8hXvvvZfrrrtOgbSIiIiIiEglyc7ONnpNBwUFGe87HA6sVqsxX7Pb7Sxfvpz58+djNpt54okniI2N1XxOROQqpVBaqrSCggI2bdrEf//3f5ObmwtAo0aNeO+994iKirpiMO1yuXC5XHz33XcUFRVht9vx8/PjxhtvxGazYbPZ1LJDRERERESkCvDM4+Dihe+zs7P57LPPWLNmDUeOHKFly5bMnDmTsLCwyjpcERH5gxRKS5Vw4d3tsoOQ/Px8Nm/ebATT3t7edOvWjWeffZawsLDfFSwrjBYREREREal6tmzZwooVKxg4cCDBwcG4XC4WLVrEwYMHOXPmDDVq1GDx4sW0atVK8zoRkauYQmmpNBcOIBwOB4WFhRQVFWGz2cotamG329myZQuvvfYaOTk5BAQE0LNnT8aOHUtoaKgGIyIiIiIiIle5n376ialTp/Ljjz9Sq1Yt7HY7VquV4uJiAGrXrs17773HDTfcoLYdIiJXOS10KJWibIgcHx/PN998w+bNmykoKCA/P5/atWvTu3dvWrVqRc+ePfHz8+O2224D4LXXXiM7O5tvvvkGk8nEY489pmBaRERERETkKufn54fD4cBkMhnrChUXF1O3bl0iIyN5+umnadmypQJpEZFrgCqlpVJt376dF154AbvdTkFBAVarFYfDYfw+ODiYTp068V//9V94e3tTWFjIxo0bef3118nJySEwMJAePXoomBYREREREbkGpKamsnv3bjZs2IDNZsPPz48777yT6OhoGjRooDmfiMg1QqG0VJp//OMfPProo7jdbqxWK/Xr1ycoKIiCggKysrJIS0sztu3atSvPPPMMUVFRxuKHnlYeCqZFRERERERERESuHgqlpVL88ssvjBs3jqNHjxITE8Ptt99ObGwsvr6+ABw6dIjPP/+cJUuWYDKZcLvddOjQgb///e80adLkoh7TCqZFRERERESuHWVbdKhdh4jItUdXdakQF977OH36NOfOnSMgIID+/fszaNAgfH19jQUsYmJieP7555k6dSrBwcGYzWb27dvHq6++CmD0mH7uueeoVasWmZmZfP311yxYsIDk5GQF0iIiIiIiIlexsiG0AmkRkWuPruxSoRISEgD4+eefycrKolGjRvTr1w8fHx/cbjc2mw0Ap9MJQGxsLOPGjSMoKAiTycSOHTt45ZVXgNJg+o477igXTH/yyScsWLDACLdFRERERERERESkalEoLRXCZDLx1Vdf0b9/f1566SXMZjMWi4Xo6Gj8/PxwuVzlqpstFgsulwuAAQMGMHLkSKPaes+ePRw8eBCAGjVq0Lt3b/7f//t/mEwmHA4H999/vxFui4iIiIiIiIiISNVirewDkOrBbrcbrTc++eQTAgICcDqdeHl5AVyy3YbZbDZ6hw0ZMoQTJ06wYsUKEhMTiY+Pp02bNgD4+vpy++23AxAeHk7btm3Vc0xERERERERERKSKUmonFcLPz493332XZs2aUVxczLlz5wDYv38/aWlpl+0BbTabjVYet99+OwEBAQDs3LkTt9ttVFPXqFGDe+65hxtuuEGBtIiIiIiIiIiISBWm5E4qTHR0NDNmzCA0NNQIofPy8khKSgJ+7SN9IYvFAsCNN95ohNIpKSk4HI5y4bNnnwqkRUREREREREREqi6ld1KhoqKimDNnDmFhYZjNZlJTU/mf//kfoDR8vlwwXVxcjMPhwGq1YjabqVevntH6Q0RERERERERERK4eCqWlwkVFRTF79mxCQ0OxWCzs3LmT5557DigNph0OR7nt3W43NpuN7Oxs0tPTcblc1KxZszIOXURERERERERERP4ghdJSKTzBdOPGjbFYLHzyySdMnToVAKu1dP1Nt9uN0+nEZDJht9tZvnw52dnZBAYG0qdPHwCjp7SIiIiIiIiIiIhcHRRKS6UpG0ybzWZWr17NmDFjSEpKwm63YzKZsFgsZGVl8emnn7Jt2zYAGjZsSExMDKD+0SIiIiIiIiIiIlcbk9vtdlf2QUj1duTIESZMmMDp06dxOp00bdqU4OBg2rdvT0lJCTt37iQ1NZX09HR8fX1ZtGgRMTExuN1uY3FDERERERERERERuToolJYq4cJg2sNkMuF2uwkMDKRBgwa8/PLLxMTE4HK5VCUtIiIiIiIiIiJyFVIoLVWGJ5j+5ZdfjCro++67j6CgIG666SbCwsIICQlRIC0iIiIiIiIiInIVUygtVcqFwXTXrl15/fXXqVevHoBadoiIiIiIiIiIiFzlFEpLlXNhK4/OnTvz+uuv06BBg8o+NBEREREREREREfmD1ANBqpyoqChmz55NaGgoFouFXbt28dxzz3Hu3LnKPjQRERERERERERH5gxRKS5UUFRXFrFmzjGD622+/ZcqUKQqmRURERERERERErnIKpaXKulwwff78+co+NBEREREREREREfmd1FNaqrwjR44wceJETp06hdPppFWrVsybN4+6detW9qGJiIiIiIiIiIjIv0mV0lLleSqmmzZtCkB8fDzFxcWVfFQiIiIiIiIiIiLyeyiUlqtCVFQU06ZNo1WrVmzYsIFGjRpV9iGJiIiIiIiIiIjI76D2HXJVKS4uxmazVfZhiIiIiIiIiIiIyO+kUFpEREREREREREREKozad4iIiIiIiIiIiIhIhVEoLSIiIiIiIiIiIiIVRqG0iIiIiIiIiIiIiFQYhdIiIiIiIiIiIiIiUmEUSouIiIiIiIiIiIhIhVEoLSIiIiIiIiIiIiIVRqG0iIiIiIiIiIiIiFQYhdIiIiIiIiIiIiIiUmEUSouIiIiIiIiIiIhIhVEoLSIiIiIiIiIiIiIVRqG0iIiIiIiIiIiIiFQYhdIiIiIiIiIiIiIiUmEUSouIiIiIiIiIiIhIhVEoLSIiIiIiIiIiIiIVRqG0iIiIiIiIiIiIiFQYhdIiIiIiIiIiIiIiUmEUSouIiIiIiIiIiIhIhVEoLSIiIiIiIiIiIiIV5v8D9OheeHKARtsAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# to control the scale of plot\n", "plot_model(best, plot = 'class_report', scale = 2)" ] }, { "cell_type": "code", "execution_count": 66, "id": "54389270", "metadata": {}, "outputs": [ { "data": { "text/html": [], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "'Class Report.png'" ] }, "execution_count": 66, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# to save the plot\n", "plot_model(best, plot = 'class_report', save=True)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "2fef279d", "metadata": {}, "source": [ "Some other parameters that you might find very useful in `plot_model` are:\n", "\n", "- fit_kwargs\n", "- plot_kwargs\n", "- groups\n", "- display_format\n", "\n", "You can check the docstring of the function for more info." ] }, { "cell_type": "code", "execution_count": 67, "id": "54b09b8e", "metadata": {}, "outputs": [], "source": [ "# help(plot_model)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "b724ca46", "metadata": {}, "source": [ "## ✅ Interpret Model" ] }, { "attachments": {}, "cell_type": "markdown", "id": "52f8fb33", "metadata": {}, "source": [ "This function analyzes the predictions generated from a trained model. Most plots in this function are implemented based on the SHAP (Shapley Additive exPlanations). For more info on this, please see https://shap.readthedocs.io/en/latest/" ] }, { "cell_type": "code", "execution_count": 68, "id": "6b6891b7", "metadata": {}, "outputs": [ { "data": { "text/html": [], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "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", "
 AccuracyAUCRecallPrec.F1KappaMCC
Fold       
00.90910.93510.90910.92730.90760.86250.8735
10.90911.00000.90910.92730.90760.86250.8735
20.90910.92210.90910.92730.90760.86250.8735
30.90911.00000.90910.92730.90760.86250.8735
41.00001.00001.00001.00001.00001.00001.0000
50.90001.00000.90000.92500.89710.84850.8616
61.00001.00001.00001.00001.00001.00001.0000
71.00001.00001.00001.00001.00001.00001.0000
81.00001.00001.00001.00001.00001.00001.0000
91.00001.00001.00001.00001.00001.00001.0000
Mean0.95360.98570.95360.96340.95280.92980.9356
Std0.04640.02870.04640.03660.04730.07030.0645
\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Processing: 0%| | 0/4 [00:00" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# interpret summary model\n", "interpret_model(lightgbm, plot = 'summary')" ] }, { "cell_type": "code", "execution_count": 70, "id": "824bafdc", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", "
\n", "
\n", " Visualization omitted, Javascript library not loaded!
\n", " Have you run `initjs()` in this notebook? If this notebook was from another\n", " user you must also trust this notebook (File -> Trust notebook). If you are viewing\n", " this notebook on github the Javascript has been stripped for security. If you are using\n", " JupyterLab this error is because a JupyterLab extension has not yet been written.\n", "
\n", " " ], "text/plain": [ "" ] }, "execution_count": 70, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# reason plot for test set observation 1\n", "interpret_model(lightgbm, plot = 'reason', observation = 1)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "ca7ce2b4", "metadata": {}, "source": [ "Some other parameters that you might find very useful in `interpret_model` are:\n", "\n", "- plot\n", "- feature\n", "- use_train_data\n", "- X_new_sample\n", "- y_new_sample\n", "- save\n", "\n", "You can check the docstring of the function for more info." ] }, { "cell_type": "code", "execution_count": 71, "id": "42595030", "metadata": {}, "outputs": [], "source": [ "# help(interpret_model)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "9f57d0c8", "metadata": {}, "source": [ "## ✅ Get Leaderboard" ] }, { "attachments": {}, "cell_type": "markdown", "id": "ec63b67a", "metadata": {}, "source": [ "This function returns the leaderboard of all models trained in the current setup." ] }, { "cell_type": "code", "execution_count": 72, "id": "307a6e3c", "metadata": {}, "outputs": [ { "data": { "text/html": [], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Processing: 0%| | 0/58 [00:00\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Model NameModelAccuracyAUCRecallPrec.F1KappaMCC
Index
0Logistic Regression(TransformerWrapperWithInverse(exclude=None, i...0.90730.97510.90730.91590.90640.85970.8645
1K Neighbors Classifier(TransformerWrapperWithInverse(exclude=None, i...0.96360.98440.96360.97090.96310.94500.9494
2Naive Bayes(TransformerWrapperWithInverse(exclude=None, i...0.94450.98680.94450.95250.94380.91610.9207
3Decision Tree Classifier(TransformerWrapperWithInverse(exclude=None, i...0.92640.94290.92640.95020.92010.88860.9040
4SVM - Linear Kernel(TransformerWrapperWithInverse(exclude=None, i...0.81000.00000.81000.78310.77020.71250.7527
5Ridge Classifier(TransformerWrapperWithInverse(exclude=None, i...0.83180.00000.83180.85450.82810.74590.7595
6Random Forest Classifier(TransformerWrapperWithInverse(exclude=None, i...0.92640.99030.92640.93430.92320.88860.8956
7Quadratic Discriminant Analysis(TransformerWrapperWithInverse(exclude=None, i...0.97180.99740.97180.97800.97120.95730.9609
8Ada Boost Classifier(TransformerWrapperWithInverse(exclude=None, i...0.91550.98430.91550.94010.90970.87200.8873
9Gradient Boosting Classifier(TransformerWrapperWithInverse(exclude=None, i...0.92640.96880.92640.93430.92320.88860.8956
10Linear Discriminant Analysis(TransformerWrapperWithInverse(exclude=None, i...0.97181.00000.97180.97800.97120.95730.9609
11Extra Trees Classifier(TransformerWrapperWithInverse(exclude=None, i...0.94450.99350.94450.95860.94260.91610.9246
12Extreme Gradient Boosting(TransformerWrapperWithInverse(exclude=None, i...0.93550.98680.93550.94400.93430.90230.9077
13Light Gradient Boosting Machine(TransformerWrapperWithInverse(exclude=None, i...0.95360.98570.95360.96340.95280.92980.9356
14CatBoost Classifier(TransformerWrapperWithInverse(exclude=None, i...0.94450.99220.94450.95860.94260.91610.9246
15Dummy Classifier(TransformerWrapperWithInverse(exclude=None, i...0.28640.50000.28640.08220.12770.00000.0000
16Decision Tree Classifier(TransformerWrapperWithInverse(exclude=None, i...0.92640.94290.92640.95020.92010.88860.9040
17Random Forest Classifier(TransformerWrapperWithInverse(exclude=None, i...0.92640.99030.92640.93430.92320.88860.8956
18Extra Trees Classifier(TransformerWrapperWithInverse(exclude=None, i...0.94450.99350.94450.95860.94260.91610.9246
19Gradient Boosting Classifier(TransformerWrapperWithInverse(exclude=None, i...0.92640.96880.92640.93430.92320.88860.8956
20Extreme Gradient Boosting(TransformerWrapperWithInverse(exclude=None, i...0.93550.98680.93550.94400.93430.90230.9077
21Light Gradient Boosting Machine(TransformerWrapperWithInverse(exclude=None, i...0.95360.98570.95360.96340.95280.92980.9356
22CatBoost Classifier(TransformerWrapperWithInverse(exclude=None, i...0.94450.99220.94450.95860.94260.91610.9246
23Logistic Regression(TransformerWrapperWithInverse(exclude=None, i...0.90730.97510.90730.91590.90640.85970.8645
24K Neighbors Classifier(TransformerWrapperWithInverse(exclude=None, i...0.96360.98440.96360.97090.96310.94500.9494
25Naive Bayes(TransformerWrapperWithInverse(exclude=None, i...0.94450.98680.94450.95250.94380.91610.9207
26Decision Tree Classifier(TransformerWrapperWithInverse(exclude=None, i...0.92640.94290.92640.95020.92010.88860.9040
27SVM - Linear Kernel(TransformerWrapperWithInverse(exclude=None, i...0.81000.00000.81000.78310.77020.71250.7527
28Ridge Classifier(TransformerWrapperWithInverse(exclude=None, i...0.83180.00000.83180.85450.82810.74590.7595
29Random Forest Classifier(TransformerWrapperWithInverse(exclude=None, i...0.92640.99030.92640.93430.92320.88860.8956
30Quadratic Discriminant Analysis(TransformerWrapperWithInverse(exclude=None, i...0.97180.99740.97180.97800.97120.95730.9609
31Ada Boost Classifier(TransformerWrapperWithInverse(exclude=None, i...0.91550.98430.91550.94010.90970.87200.8873
32Gradient Boosting Classifier(TransformerWrapperWithInverse(exclude=None, i...0.92640.96880.92640.93430.92320.88860.8956
33Linear Discriminant Analysis(TransformerWrapperWithInverse(exclude=None, i...0.97181.00000.97180.97800.97120.95730.9609
34Extra Trees Classifier(TransformerWrapperWithInverse(exclude=None, i...0.94450.99350.94450.95860.94260.91610.9246
35Extreme Gradient Boosting(TransformerWrapperWithInverse(exclude=None, i...0.93550.98680.93550.94400.93430.90230.9077
36Light Gradient Boosting Machine(TransformerWrapperWithInverse(exclude=None, i...0.95360.98570.95360.96340.95280.92980.9356
37CatBoost Classifier(TransformerWrapperWithInverse(exclude=None, i...0.94450.99220.94450.95860.94260.91610.9246
38Dummy Classifier(TransformerWrapperWithInverse(exclude=None, i...0.28640.50000.28640.08220.12770.00000.0000
39Logistic Regression(TransformerWrapperWithInverse(exclude=None, i...0.90730.97510.90730.91590.90640.85970.8645
40Logistic Regression(TransformerWrapperWithInverse(exclude=None, i...0.92380.98270.92380.92720.92340.88560.8877
41Logistic Regression(TransformerWrapperWithInverse(exclude=None, i...0.89730.96840.89730.91080.89550.84450.8525
42Logistic Regression(TransformerWrapperWithInverse(exclude=None, i...0.10760.03600.10760.10790.10770.16280.1628
43Decision Tree Classifier(TransformerWrapperWithInverse(exclude=None, i...0.92640.94290.92640.95020.92010.88860.9040
44Decision Tree Classifier(TransformerWrapperWithInverse(exclude=None, i...0.94450.96690.94450.96240.93950.91610.9276
45Decision Tree Classifier(TransformerWrapperWithInverse(exclude=None, i...0.92640.94290.92640.95020.92010.88860.9040
46Decision Tree Classifier(TransformerWrapperWithInverse(exclude=None, i...0.94450.96780.94450.96240.93950.91610.9276
47Decision Tree Classifier(TransformerWrapperWithInverse(exclude=None, i...0.92640.94290.92640.95020.92010.88860.9040
48Decision Tree Classifier(TransformerWrapperWithInverse(exclude=None, i...0.94450.96690.94450.96240.93950.91610.9276
49Decision Tree Classifier(TransformerWrapperWithInverse(exclude=None, i...0.92640.94290.92640.95020.92010.88860.9040
50Decision Tree Classifier(TransformerWrapperWithInverse(exclude=None, i...0.93550.95000.93550.95510.93030.90230.9149
51Decision Tree Classifier(TransformerWrapperWithInverse(exclude=None, i...0.92640.94290.92640.95020.92010.88860.9040
52Decision Tree Classifier(TransformerWrapperWithInverse(exclude=None, i...0.93550.98490.93550.95510.93030.90230.9149
53Decision Tree Classifier(TransformerWrapperWithInverse(exclude=None, i...0.92640.94290.92640.93430.92320.88860.8956
54Voting Classifier(TransformerWrapperWithInverse(exclude=None, i...0.97180.99740.97180.97800.97120.95730.9609
55Stacking Classifier(TransformerWrapperWithInverse(exclude=None, i...0.97180.99740.97180.97800.97120.95730.9609
56Light Gradient Boosting Machine(TransformerWrapperWithInverse(exclude=None, i...0.95360.98570.95360.96340.95280.92980.9356
\n", "" ], "text/plain": [ " Model Name \\\n", "Index \n", "0 Logistic Regression \n", "1 K Neighbors Classifier \n", "2 Naive Bayes \n", "3 Decision Tree Classifier \n", "4 SVM - Linear Kernel \n", "5 Ridge Classifier \n", "6 Random Forest Classifier \n", "7 Quadratic Discriminant Analysis \n", "8 Ada Boost Classifier \n", "9 Gradient Boosting Classifier \n", "10 Linear Discriminant Analysis \n", "11 Extra Trees Classifier \n", "12 Extreme Gradient Boosting \n", "13 Light Gradient Boosting Machine \n", "14 CatBoost Classifier \n", "15 Dummy Classifier \n", "16 Decision Tree Classifier \n", "17 Random Forest Classifier \n", "18 Extra Trees Classifier \n", "19 Gradient Boosting Classifier \n", "20 Extreme Gradient Boosting \n", "21 Light Gradient Boosting Machine \n", "22 CatBoost Classifier \n", "23 Logistic Regression \n", "24 K Neighbors Classifier \n", "25 Naive Bayes \n", "26 Decision Tree Classifier \n", "27 SVM - Linear Kernel \n", "28 Ridge Classifier \n", "29 Random Forest Classifier \n", "30 Quadratic Discriminant Analysis \n", "31 Ada Boost Classifier \n", "32 Gradient Boosting Classifier \n", "33 Linear Discriminant Analysis \n", "34 Extra Trees Classifier \n", "35 Extreme Gradient Boosting \n", "36 Light Gradient Boosting Machine \n", "37 CatBoost Classifier \n", "38 Dummy Classifier \n", "39 Logistic Regression \n", "40 Logistic Regression \n", "41 Logistic Regression \n", "42 Logistic Regression \n", "43 Decision Tree Classifier \n", "44 Decision Tree Classifier \n", "45 Decision Tree Classifier \n", "46 Decision Tree Classifier \n", "47 Decision Tree Classifier \n", "48 Decision Tree Classifier \n", "49 Decision Tree Classifier \n", "50 Decision Tree Classifier \n", "51 Decision Tree Classifier \n", "52 Decision Tree Classifier \n", "53 Decision Tree Classifier \n", "54 Voting Classifier \n", "55 Stacking Classifier \n", "56 Light Gradient Boosting Machine \n", "\n", " Model Accuracy AUC \\\n", "Index \n", "0 (TransformerWrapperWithInverse(exclude=None, i... 0.9073 0.9751 \n", "1 (TransformerWrapperWithInverse(exclude=None, i... 0.9636 0.9844 \n", "2 (TransformerWrapperWithInverse(exclude=None, i... 0.9445 0.9868 \n", "3 (TransformerWrapperWithInverse(exclude=None, i... 0.9264 0.9429 \n", "4 (TransformerWrapperWithInverse(exclude=None, i... 0.8100 0.0000 \n", "5 (TransformerWrapperWithInverse(exclude=None, i... 0.8318 0.0000 \n", "6 (TransformerWrapperWithInverse(exclude=None, i... 0.9264 0.9903 \n", "7 (TransformerWrapperWithInverse(exclude=None, i... 0.9718 0.9974 \n", "8 (TransformerWrapperWithInverse(exclude=None, i... 0.9155 0.9843 \n", "9 (TransformerWrapperWithInverse(exclude=None, i... 0.9264 0.9688 \n", "10 (TransformerWrapperWithInverse(exclude=None, i... 0.9718 1.0000 \n", "11 (TransformerWrapperWithInverse(exclude=None, i... 0.9445 0.9935 \n", "12 (TransformerWrapperWithInverse(exclude=None, i... 0.9355 0.9868 \n", "13 (TransformerWrapperWithInverse(exclude=None, i... 0.9536 0.9857 \n", "14 (TransformerWrapperWithInverse(exclude=None, i... 0.9445 0.9922 \n", "15 (TransformerWrapperWithInverse(exclude=None, i... 0.2864 0.5000 \n", "16 (TransformerWrapperWithInverse(exclude=None, i... 0.9264 0.9429 \n", "17 (TransformerWrapperWithInverse(exclude=None, i... 0.9264 0.9903 \n", "18 (TransformerWrapperWithInverse(exclude=None, i... 0.9445 0.9935 \n", "19 (TransformerWrapperWithInverse(exclude=None, i... 0.9264 0.9688 \n", "20 (TransformerWrapperWithInverse(exclude=None, i... 0.9355 0.9868 \n", "21 (TransformerWrapperWithInverse(exclude=None, i... 0.9536 0.9857 \n", "22 (TransformerWrapperWithInverse(exclude=None, i... 0.9445 0.9922 \n", "23 (TransformerWrapperWithInverse(exclude=None, i... 0.9073 0.9751 \n", "24 (TransformerWrapperWithInverse(exclude=None, i... 0.9636 0.9844 \n", "25 (TransformerWrapperWithInverse(exclude=None, i... 0.9445 0.9868 \n", "26 (TransformerWrapperWithInverse(exclude=None, i... 0.9264 0.9429 \n", "27 (TransformerWrapperWithInverse(exclude=None, i... 0.8100 0.0000 \n", "28 (TransformerWrapperWithInverse(exclude=None, i... 0.8318 0.0000 \n", "29 (TransformerWrapperWithInverse(exclude=None, i... 0.9264 0.9903 \n", "30 (TransformerWrapperWithInverse(exclude=None, i... 0.9718 0.9974 \n", "31 (TransformerWrapperWithInverse(exclude=None, i... 0.9155 0.9843 \n", "32 (TransformerWrapperWithInverse(exclude=None, i... 0.9264 0.9688 \n", "33 (TransformerWrapperWithInverse(exclude=None, i... 0.9718 1.0000 \n", "34 (TransformerWrapperWithInverse(exclude=None, i... 0.9445 0.9935 \n", "35 (TransformerWrapperWithInverse(exclude=None, i... 0.9355 0.9868 \n", "36 (TransformerWrapperWithInverse(exclude=None, i... 0.9536 0.9857 \n", "37 (TransformerWrapperWithInverse(exclude=None, i... 0.9445 0.9922 \n", "38 (TransformerWrapperWithInverse(exclude=None, i... 0.2864 0.5000 \n", "39 (TransformerWrapperWithInverse(exclude=None, i... 0.9073 0.9751 \n", "40 (TransformerWrapperWithInverse(exclude=None, i... 0.9238 0.9827 \n", "41 (TransformerWrapperWithInverse(exclude=None, i... 0.8973 0.9684 \n", "42 (TransformerWrapperWithInverse(exclude=None, i... 0.1076 0.0360 \n", "43 (TransformerWrapperWithInverse(exclude=None, i... 0.9264 0.9429 \n", "44 (TransformerWrapperWithInverse(exclude=None, i... 0.9445 0.9669 \n", "45 (TransformerWrapperWithInverse(exclude=None, i... 0.9264 0.9429 \n", "46 (TransformerWrapperWithInverse(exclude=None, i... 0.9445 0.9678 \n", "47 (TransformerWrapperWithInverse(exclude=None, i... 0.9264 0.9429 \n", "48 (TransformerWrapperWithInverse(exclude=None, i... 0.9445 0.9669 \n", "49 (TransformerWrapperWithInverse(exclude=None, i... 0.9264 0.9429 \n", "50 (TransformerWrapperWithInverse(exclude=None, i... 0.9355 0.9500 \n", "51 (TransformerWrapperWithInverse(exclude=None, i... 0.9264 0.9429 \n", "52 (TransformerWrapperWithInverse(exclude=None, i... 0.9355 0.9849 \n", "53 (TransformerWrapperWithInverse(exclude=None, i... 0.9264 0.9429 \n", "54 (TransformerWrapperWithInverse(exclude=None, i... 0.9718 0.9974 \n", "55 (TransformerWrapperWithInverse(exclude=None, i... 0.9718 0.9974 \n", "56 (TransformerWrapperWithInverse(exclude=None, i... 0.9536 0.9857 \n", "\n", " Recall Prec. F1 Kappa MCC \n", "Index \n", "0 0.9073 0.9159 0.9064 0.8597 0.8645 \n", "1 0.9636 0.9709 0.9631 0.9450 0.9494 \n", "2 0.9445 0.9525 0.9438 0.9161 0.9207 \n", "3 0.9264 0.9502 0.9201 0.8886 0.9040 \n", "4 0.8100 0.7831 0.7702 0.7125 0.7527 \n", "5 0.8318 0.8545 0.8281 0.7459 0.7595 \n", "6 0.9264 0.9343 0.9232 0.8886 0.8956 \n", "7 0.9718 0.9780 0.9712 0.9573 0.9609 \n", "8 0.9155 0.9401 0.9097 0.8720 0.8873 \n", "9 0.9264 0.9343 0.9232 0.8886 0.8956 \n", "10 0.9718 0.9780 0.9712 0.9573 0.9609 \n", "11 0.9445 0.9586 0.9426 0.9161 0.9246 \n", "12 0.9355 0.9440 0.9343 0.9023 0.9077 \n", "13 0.9536 0.9634 0.9528 0.9298 0.9356 \n", "14 0.9445 0.9586 0.9426 0.9161 0.9246 \n", "15 0.2864 0.0822 0.1277 0.0000 0.0000 \n", "16 0.9264 0.9502 0.9201 0.8886 0.9040 \n", "17 0.9264 0.9343 0.9232 0.8886 0.8956 \n", "18 0.9445 0.9586 0.9426 0.9161 0.9246 \n", "19 0.9264 0.9343 0.9232 0.8886 0.8956 \n", "20 0.9355 0.9440 0.9343 0.9023 0.9077 \n", "21 0.9536 0.9634 0.9528 0.9298 0.9356 \n", "22 0.9445 0.9586 0.9426 0.9161 0.9246 \n", "23 0.9073 0.9159 0.9064 0.8597 0.8645 \n", "24 0.9636 0.9709 0.9631 0.9450 0.9494 \n", "25 0.9445 0.9525 0.9438 0.9161 0.9207 \n", "26 0.9264 0.9502 0.9201 0.8886 0.9040 \n", "27 0.8100 0.7831 0.7702 0.7125 0.7527 \n", "28 0.8318 0.8545 0.8281 0.7459 0.7595 \n", "29 0.9264 0.9343 0.9232 0.8886 0.8956 \n", "30 0.9718 0.9780 0.9712 0.9573 0.9609 \n", "31 0.9155 0.9401 0.9097 0.8720 0.8873 \n", "32 0.9264 0.9343 0.9232 0.8886 0.8956 \n", "33 0.9718 0.9780 0.9712 0.9573 0.9609 \n", "34 0.9445 0.9586 0.9426 0.9161 0.9246 \n", "35 0.9355 0.9440 0.9343 0.9023 0.9077 \n", "36 0.9536 0.9634 0.9528 0.9298 0.9356 \n", "37 0.9445 0.9586 0.9426 0.9161 0.9246 \n", "38 0.2864 0.0822 0.1277 0.0000 0.0000 \n", "39 0.9073 0.9159 0.9064 0.8597 0.8645 \n", "40 0.9238 0.9272 0.9234 0.8856 0.8877 \n", "41 0.8973 0.9108 0.8955 0.8445 0.8525 \n", "42 0.1076 0.1079 0.1077 0.1628 0.1628 \n", "43 0.9264 0.9502 0.9201 0.8886 0.9040 \n", "44 0.9445 0.9624 0.9395 0.9161 0.9276 \n", "45 0.9264 0.9502 0.9201 0.8886 0.9040 \n", "46 0.9445 0.9624 0.9395 0.9161 0.9276 \n", "47 0.9264 0.9502 0.9201 0.8886 0.9040 \n", "48 0.9445 0.9624 0.9395 0.9161 0.9276 \n", "49 0.9264 0.9502 0.9201 0.8886 0.9040 \n", "50 0.9355 0.9551 0.9303 0.9023 0.9149 \n", "51 0.9264 0.9502 0.9201 0.8886 0.9040 \n", "52 0.9355 0.9551 0.9303 0.9023 0.9149 \n", "53 0.9264 0.9343 0.9232 0.8886 0.8956 \n", "54 0.9718 0.9780 0.9712 0.9573 0.9609 \n", "55 0.9718 0.9780 0.9712 0.9573 0.9609 \n", "56 0.9536 0.9634 0.9528 0.9298 0.9356 " ] }, "execution_count": 72, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# get leaderboard\n", "lb = get_leaderboard()\n", "lb" ] }, { "cell_type": "code", "execution_count": 73, "id": "f8a8b060", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Pipeline(memory=FastMemory(location=C:\\Users\\owner\\AppData\\Local\\Temp\\joblib),\n",
       "         steps=[('label_encoding',\n",
       "                 TransformerWrapperWithInverse(exclude=None, include=None,\n",
       "                                               transformer=LabelEncoder())),\n",
       "                ('numerical_imputer',\n",
       "                 TransformerWrapper(exclude=None,\n",
       "                                    include=['sepal_length', 'sepal_width',\n",
       "                                             'petal_length', 'petal_width'],\n",
       "                                    transformer=SimpleImputer(add_indicator=F...\n",
       "                                    transformer=SimpleImputer(add_indicator=False,\n",
       "                                                              copy=True,\n",
       "                                                              fill_value=None,\n",
       "                                                              missing_values=nan,\n",
       "                                                              strategy='most_frequent',\n",
       "                                                              verbose='deprecated'))),\n",
       "                ('normalize',\n",
       "                 TransformerWrapper(exclude=None, include=None,\n",
       "                                    transformer=MinMaxScaler(clip=False,\n",
       "                                                             copy=True,\n",
       "                                                             feature_range=(0,\n",
       "                                                                            1)))),\n",
       "                ['trained_model',\n",
       "                 QuadraticDiscriminantAnalysis(priors=None, reg_param=0.0,\n",
       "                                               store_covariance=False,\n",
       "                                               tol=0.0001)]],\n",
       "         verbose=False)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "Pipeline(memory=FastMemory(location=C:\\Users\\owner\\AppData\\Local\\Temp\\joblib),\n", " steps=[('label_encoding',\n", " TransformerWrapperWithInverse(exclude=None, include=None,\n", " transformer=LabelEncoder())),\n", " ('numerical_imputer',\n", " TransformerWrapper(exclude=None,\n", " include=['sepal_length', 'sepal_width',\n", " 'petal_length', 'petal_width'],\n", " transformer=SimpleImputer(add_indicator=F...\n", " transformer=SimpleImputer(add_indicator=False,\n", " copy=True,\n", " fill_value=None,\n", " missing_values=nan,\n", " strategy='most_frequent',\n", " verbose='deprecated'))),\n", " ('normalize',\n", " TransformerWrapper(exclude=None, include=None,\n", " transformer=MinMaxScaler(clip=False,\n", " copy=True,\n", " feature_range=(0,\n", " 1)))),\n", " ['trained_model',\n", " QuadraticDiscriminantAnalysis(priors=None, reg_param=0.0,\n", " store_covariance=False,\n", " tol=0.0001)]],\n", " verbose=False)" ] }, "execution_count": 73, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# select the best model based on F1\n", "lb.sort_values(by='F1', ascending=False)['Model'].iloc[0]" ] }, { "attachments": {}, "cell_type": "markdown", "id": "9ecf0bfa", "metadata": {}, "source": [ "Some other parameters that you might find very useful in `get_leaderboard` are:\n", "\n", "- finalize_models\n", "- fit_kwargs\n", "- model_only\n", "- groups\n", "\n", "You can check the docstring of the function for more info." ] }, { "cell_type": "code", "execution_count": 74, "id": "dc76f0a5", "metadata": {}, "outputs": [], "source": [ "# help(get_leaderboard)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "94669c72", "metadata": {}, "source": [ "## ✅ AutoML\n", "This function returns the best model out of all trained models in the current setup based on the optimize parameter. Metrics evaluated can be accessed using the `get_metrics` function." ] }, { "cell_type": "code", "execution_count": 75, "id": "01532054", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
QuadraticDiscriminantAnalysis(priors=None, reg_param=0.0,\n",
       "                              store_covariance=False, tol=0.0001)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "QuadraticDiscriminantAnalysis(priors=None, reg_param=0.0,\n", " store_covariance=False, tol=0.0001)" ] }, "execution_count": 75, "metadata": {}, "output_type": "execute_result" } ], "source": [ "automl()" ] }, { "attachments": {}, "cell_type": "markdown", "id": "726b2986", "metadata": {}, "source": [ "## ✅ Dashboard\n", "The dashboard function generates the interactive dashboard for a trained model. The dashboard is implemented using `ExplainerDashboard`. For more information check out [Explainer Dashboard.](explainerdashboard.readthedocs.io)" ] }, { "cell_type": "code", "execution_count": 76, "id": "ca75507d", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Note: model_output=='probability', so assuming that raw shap output of DecisionTreeClassifier is in probability space...\n", "Generating self.shap_explainer = shap.TreeExplainer(model)\n", "Building ExplainerDashboard..\n", "The explainer object has no decision_trees property. so setting decision_trees=False...\n", "Warning: calculating shap interaction values can be slow! Pass shap_interaction=False to remove interactions tab.\n", "Generating layout...\n", "Calculating shap values...\n", "Calculating prediction probabilities...\n", "Calculating metrics...\n", "Calculating confusion matrices...\n", "Calculating classification_dfs...\n", "Calculating roc auc curves...\n", "Calculating pr auc curves...\n", "Calculating liftcurve_dfs...\n", "Calculating shap interaction values... (this may take a while)\n", "Reminder: TreeShap computational complexity is O(TLD^2), where T is the number of trees, L is the maximum number of leaves in any tree and D the maximal depth of any tree. So reducing these will speed up the calculation.\n", "Calculating dependencies...\n", "Calculating permutation importances (if slow, try setting n_jobs parameter)...\n", "Calculating pred_percentiles...\n", "Calculating predictions...\n", "Reminder: you can store the explainer (including calculated dependencies) with explainer.dump('explainer.joblib') and reload with e.g. ClassifierExplainer.from_file('explainer.joblib')\n", "Registering callbacks...\n", "Starting ExplainerDashboard inline (terminate it with ExplainerDashboard.terminate(8050))\n" ] }, { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# dashboard function\n", "dashboard(dt, display_format ='inline')" ] }, { "attachments": {}, "cell_type": "markdown", "id": "58fd3e5a", "metadata": {}, "source": [ "## ✅Create App\n", "This function creates a basic gradio app for inference." ] }, { "cell_type": "code", "execution_count": 79, "id": "5cf989d3", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Running on local URL: http://127.0.0.1:7860\n", "\n", "To create a public link, set `share=True` in `launch()`.\n" ] }, { "data": { "text/html": [ "
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [] }, "execution_count": 79, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# create gradio app\n", "create_app(best)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "a2d8e21d", "metadata": {}, "source": [ "## ✅ Create API\n", "This function takes an input model and creates a POST API for inference." ] }, { "cell_type": "code", "execution_count": 80, "id": "978413c9", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "API successfully created. This function only creates a POST API, it doesn't run it automatically. To run your API, please run this command --> !python my_first_api.py\n" ] } ], "source": [ "# create api\n", "create_api(best, api_name = 'my_first_api')" ] }, { "cell_type": "code", "execution_count": 81, "id": "68e539aa", "metadata": {}, "outputs": [], "source": [ "# !python my_first_api.py" ] }, { "cell_type": "code", "execution_count": 82, "id": "a3de3327", "metadata": {}, "outputs": [], "source": [ "# check out the .py file created with this magic command\n", "# %load my_first_api.py" ] }, { "attachments": {}, "cell_type": "markdown", "id": "1023f7df", "metadata": {}, "source": [ "## ✅ Create Docker\n", "This function creates a `Dockerfile` and `requirements.txt` for productionalizing API end-point." ] }, { "cell_type": "code", "execution_count": 83, "id": "452ced14", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Writing requirements.txt\n", "Writing Dockerfile\n", "Dockerfile and requirements.txt successfully created.\n", " To build image you have to run --> !docker image build -f \"Dockerfile\" -t IMAGE_NAME:IMAGE_TAG .\n", " \n" ] } ], "source": [ "create_docker('my_first_api')" ] }, { "cell_type": "code", "execution_count": 84, "id": "301e1fa5", "metadata": {}, "outputs": [], "source": [ "# check out the DockerFile file created with this magic command\n", "# %load DockerFile" ] }, { "cell_type": "code", "execution_count": 85, "id": "ca1e9ef7", "metadata": {}, "outputs": [], "source": [ "# check out the requirements file created with this magic command\n", "# %load requirements.txt" ] }, { "attachments": {}, "cell_type": "markdown", "id": "e27c212b", "metadata": {}, "source": [ "## ✅ Finalize Model\n", "This function trains a given model on the entire dataset including the hold-out set." ] }, { "cell_type": "code", "execution_count": 86, "id": "65225684", "metadata": {}, "outputs": [], "source": [ "final_best = finalize_model(best)" ] }, { "cell_type": "code", "execution_count": 87, "id": "80d17fec", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Pipeline(memory=FastMemory(location=C:\\Users\\owner\\AppData\\Local\\Temp\\joblib),\n",
       "         steps=[('label_encoding',\n",
       "                 TransformerWrapperWithInverse(exclude=None, include=None,\n",
       "                                               transformer=LabelEncoder())),\n",
       "                ('numerical_imputer',\n",
       "                 TransformerWrapper(exclude=None,\n",
       "                                    include=['sepal_length', 'sepal_width',\n",
       "                                             'petal_length', 'petal_width'],\n",
       "                                    transformer=SimpleImputer(add_indicator=F...\n",
       "                                    transformer=SimpleImputer(add_indicator=False,\n",
       "                                                              copy=True,\n",
       "                                                              fill_value=None,\n",
       "                                                              missing_values=nan,\n",
       "                                                              strategy='most_frequent',\n",
       "                                                              verbose='deprecated'))),\n",
       "                ('normalize',\n",
       "                 TransformerWrapper(exclude=None, include=None,\n",
       "                                    transformer=MinMaxScaler(clip=False,\n",
       "                                                             copy=True,\n",
       "                                                             feature_range=(0,\n",
       "                                                                            1)))),\n",
       "                ('actual_estimator',\n",
       "                 QuadraticDiscriminantAnalysis(priors=None, reg_param=0.0,\n",
       "                                               store_covariance=False,\n",
       "                                               tol=0.0001))],\n",
       "         verbose=False)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "Pipeline(memory=FastMemory(location=C:\\Users\\owner\\AppData\\Local\\Temp\\joblib),\n", " steps=[('label_encoding',\n", " TransformerWrapperWithInverse(exclude=None, include=None,\n", " transformer=LabelEncoder())),\n", " ('numerical_imputer',\n", " TransformerWrapper(exclude=None,\n", " include=['sepal_length', 'sepal_width',\n", " 'petal_length', 'petal_width'],\n", " transformer=SimpleImputer(add_indicator=F...\n", " transformer=SimpleImputer(add_indicator=False,\n", " copy=True,\n", " fill_value=None,\n", " missing_values=nan,\n", " strategy='most_frequent',\n", " verbose='deprecated'))),\n", " ('normalize',\n", " TransformerWrapper(exclude=None, include=None,\n", " transformer=MinMaxScaler(clip=False,\n", " copy=True,\n", " feature_range=(0,\n", " 1)))),\n", " ('actual_estimator',\n", " QuadraticDiscriminantAnalysis(priors=None, reg_param=0.0,\n", " store_covariance=False,\n", " tol=0.0001))],\n", " verbose=False)" ] }, "execution_count": 87, "metadata": {}, "output_type": "execute_result" } ], "source": [ "final_best" ] }, { "attachments": {}, "cell_type": "markdown", "id": "b4693f88", "metadata": {}, "source": [ "## ✅ Convert Model\n", "This function transpiles the trained machine learning model's decision function in different programming languages such as Python, C, Java, Go, C#, etc. It is very useful if you want to deploy models into environments where you can't install your normal Python stack to support model inference." ] }, { "cell_type": "code", "execution_count": 88, "id": "dbe0e9fe", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "public class Model {\n", " public static double[] score(double[] input) {\n", " double[] var0;\n", " if (input[2] <= 0.23275858908891678) {\n", " var0 = new double[] {1.0, 0.0, 0.0};\n", " } else {\n", " if (input[2] <= 0.62931028008461) {\n", " if (input[0] <= 0.180555522441864) {\n", " var0 = new double[] {0.0, 0.0, 1.0};\n", " } else {\n", " var0 = new double[] {0.0, 1.0, 0.0};\n", " }\n", " } else {\n", " if (input[2] <= 0.6637930274009705) {\n", " if (input[1] <= 0.3958333134651184) {\n", " var0 = new double[] {0.0, 0.0, 1.0};\n", " } else {\n", " var0 = new double[] {0.0, 1.0, 0.0};\n", " }\n", " } else {\n", " if (input[3] <= 0.6666666269302368) {\n", " if (input[3] <= 0.6041666567325592) {\n", " var0 = new double[] {0.0, 0.0, 1.0};\n", " } else {\n", " if (input[0] <= 0.6388888359069824) {\n", " var0 = new double[] {0.0, 1.0, 0.0};\n", " } else {\n", " var0 = new double[] {0.0, 0.0, 1.0};\n", " }\n", " }\n", " } else {\n", " var0 = new double[] {0.0, 0.0, 1.0};\n", " }\n", " }\n", " }\n", " }\n", " return var0;\n", " }\n", "}\n", "\n" ] } ], "source": [ "# transpiles learned function to java\n", "print(convert_model(dt, language = 'java'))" ] }, { "attachments": {}, "cell_type": "markdown", "id": "ed00202c", "metadata": {}, "source": [ "## ✅ Deploy Model\n", "This function deploys the entire ML pipeline on the cloud.\n", "\n", "**AWS:** When deploying model on AWS S3, environment variables must be configured using the command-line interface. To configure AWS environment variables, type `aws configure` in terminal. The following information is required which can be generated using the Identity and Access Management (IAM) portal of your amazon console account:\n", "\n", "- AWS Access Key ID\n", "- AWS Secret Key Access\n", "- Default Region Name (can be seen under Global settings on your AWS console)\n", "- Default output format (must be left blank)\n", "\n", "**GCP:** To deploy a model on Google Cloud Platform ('gcp'), the project must be created using the command-line or GCP console. Once the project is created, you must create a service account and download the service account key as a JSON file to set environment variables in your local environment. Learn more about it: https://cloud.google.com/docs/authentication/production\n", "\n", "**Azure:** To deploy a model on Microsoft Azure ('azure'), environment variables for the connection string must be set in your local environment. Go to settings of storage account on Azure portal to access the connection string required.\n", "AZURE_STORAGE_CONNECTION_STRING (required as environment variable)\n", "Learn more about it: https://docs.microsoft.com/en-us/azure/storage/blobs/storage-quickstart-blobs-python?toc=%2Fpython%2Fazure%2FTOC.json" ] }, { "cell_type": "code", "execution_count": 89, "id": "40b20a18", "metadata": {}, "outputs": [], "source": [ "# deploy model on aws s3\n", "# deploy_model(best, model_name = 'my_first_platform_on_aws',\n", "# platform = 'aws', authentication = {'bucket' : 'pycaret-test'})" ] }, { "cell_type": "code", "execution_count": 90, "id": "9e236516", "metadata": {}, "outputs": [], "source": [ "# load model from aws s3\n", "# loaded_from_aws = load_model(model_name = 'my_first_platform_on_aws', platform = 'aws',\n", "# authentication = {'bucket' : 'pycaret-test'})\n", "\n", "# loaded_from_aws" ] }, { "attachments": {}, "cell_type": "markdown", "id": "e169ae86", "metadata": {}, "source": [ "## ✅ Save / Load Model\n", "This function saves the transformation pipeline and a trained model object into the current working directory as a pickle file for later use." ] }, { "cell_type": "code", "execution_count": 91, "id": "bc5cf24a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Transformation Pipeline and Model Successfully Saved\n" ] }, { "data": { "text/plain": [ "(Pipeline(memory=FastMemory(location=C:\\Users\\owner\\AppData\\Local\\Temp\\joblib),\n", " steps=[('label_encoding',\n", " TransformerWrapperWithInverse(exclude=None, include=None,\n", " transformer=LabelEncoder())),\n", " ('numerical_imputer',\n", " TransformerWrapper(exclude=None,\n", " include=['sepal_length', 'sepal_width',\n", " 'petal_length', 'petal_width'],\n", " transformer=SimpleImputer(add_indicator=F...\n", " transformer=SimpleImputer(add_indicator=False,\n", " copy=True,\n", " fill_value=None,\n", " missing_values=nan,\n", " strategy='most_frequent',\n", " verbose='deprecated'))),\n", " ('normalize',\n", " TransformerWrapper(exclude=None, include=None,\n", " transformer=MinMaxScaler(clip=False,\n", " copy=True,\n", " feature_range=(0,\n", " 1)))),\n", " ('trained_model',\n", " QuadraticDiscriminantAnalysis(priors=None, reg_param=0.0,\n", " store_covariance=False,\n", " tol=0.0001))],\n", " verbose=False),\n", " 'my_first_model.pkl')" ] }, "execution_count": 91, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# save model\n", "save_model(best, 'my_first_model')" ] }, { "cell_type": "code", "execution_count": 92, "id": "e8478d34", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Transformation Pipeline and Model Successfully Loaded\n" ] }, { "data": { "text/html": [ "
Pipeline(memory=FastMemory(location=C:\\Users\\owner\\AppData\\Local\\Temp\\joblib),\n",
       "         steps=[('label_encoding',\n",
       "                 TransformerWrapperWithInverse(exclude=None, include=None,\n",
       "                                               transformer=LabelEncoder())),\n",
       "                ('numerical_imputer',\n",
       "                 TransformerWrapper(exclude=None,\n",
       "                                    include=['sepal_length', 'sepal_width',\n",
       "                                             'petal_length', 'petal_width'],\n",
       "                                    transformer=SimpleImputer(add_indicator=F...\n",
       "                                    transformer=SimpleImputer(add_indicator=False,\n",
       "                                                              copy=True,\n",
       "                                                              fill_value=None,\n",
       "                                                              missing_values=nan,\n",
       "                                                              strategy='most_frequent',\n",
       "                                                              verbose='deprecated'))),\n",
       "                ('normalize',\n",
       "                 TransformerWrapper(exclude=None, include=None,\n",
       "                                    transformer=MinMaxScaler(clip=False,\n",
       "                                                             copy=True,\n",
       "                                                             feature_range=(0,\n",
       "                                                                            1)))),\n",
       "                ('trained_model',\n",
       "                 QuadraticDiscriminantAnalysis(priors=None, reg_param=0.0,\n",
       "                                               store_covariance=False,\n",
       "                                               tol=0.0001))],\n",
       "         verbose=False)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "Pipeline(memory=FastMemory(location=C:\\Users\\owner\\AppData\\Local\\Temp\\joblib),\n", " steps=[('label_encoding',\n", " TransformerWrapperWithInverse(exclude=None, include=None,\n", " transformer=LabelEncoder())),\n", " ('numerical_imputer',\n", " TransformerWrapper(exclude=None,\n", " include=['sepal_length', 'sepal_width',\n", " 'petal_length', 'petal_width'],\n", " transformer=SimpleImputer(add_indicator=F...\n", " transformer=SimpleImputer(add_indicator=False,\n", " copy=True,\n", " fill_value=None,\n", " missing_values=nan,\n", " strategy='most_frequent',\n", " verbose='deprecated'))),\n", " ('normalize',\n", " TransformerWrapper(exclude=None, include=None,\n", " transformer=MinMaxScaler(clip=False,\n", " copy=True,\n", " feature_range=(0,\n", " 1)))),\n", " ('trained_model',\n", " QuadraticDiscriminantAnalysis(priors=None, reg_param=0.0,\n", " store_covariance=False,\n", " tol=0.0001))],\n", " verbose=False)" ] }, "execution_count": 92, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# load model\n", "loaded_from_disk = load_model('my_first_model')\n", "loaded_from_disk" ] }, { "attachments": {}, "cell_type": "markdown", "id": "de5eee8c", "metadata": {}, "source": [ "## ✅ Save / Load Experiment\n", "This function saves all the experiment variables on disk, allowing to later resume without rerunning the setup function." ] }, { "cell_type": "code", "execution_count": 93, "id": "6a3c61b6", "metadata": {}, "outputs": [], "source": [ "# save experiment\n", "save_experiment('my_experiment')" ] }, { "cell_type": "code", "execution_count": 94, "id": "83252c09", "metadata": {}, "outputs": [ { "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", "
 DescriptionValue
0Session id123
1Targetspecies
2Target typeMulticlass
3Target mappingIris-setosa: 0, Iris-versicolor: 1, Iris-virginica: 2
4Original data shape(150, 5)
5Transformed data shape(150, 5)
6Transformed train set shape(105, 5)
7Transformed test set shape(45, 5)
8Numeric features4
9PreprocessTrue
10Imputation typesimple
11Numeric imputationmean
12Categorical imputationmode
13NormalizeTrue
14Normalize methodminmax
15Fold GeneratorStratifiedKFold
16Fold Number10
17CPU Jobs-1
18Use GPUFalse
19Log ExperimentFalse
20Experiment Nameclf-default-name
21USI9a69
\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# load experiment from disk\n", "exp_from_disk = load_experiment('my_experiment', data=data)" ] } ], "metadata": { "kernelspec": { "display_name": "clean", "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.8.10" } }, "nbformat": 4, "nbformat_minor": 5 }