diff --git a/notebooks/modeling.ipynb b/notebooks/modeling.ipynb
index 24d3e2e..377a6e2 100644
--- a/notebooks/modeling.ipynb
+++ b/notebooks/modeling.ipynb
@@ -1,806 +1,773 @@
{
- "cells": [
- {
- "cell_type": "markdown",
- "id": "d4f4e2b7",
- "metadata": {},
- "source": [
- "# Modeling\n",
- "\n",
- "In this tutorial, we will show you how to use `zephyr_ml`'s `Zephyr` class to train models. This tutorial builds on top of the previous one where we create EntitySets, generate label times, and do automated feature engineering. To do any of these previous steps, please refer to `feature_engineering` notebook.\n",
- "\n",
- "## 1) Load the Feature Matrix\n",
- "\n",
- "Load the feature matrix which is the result of the `feature_engineering` notebook. For the purpose of this tutorial, we use a dummy feature matrix stored in the `data/` folder."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 1,
- "id": "4a6724ad",
- "metadata": {},
- "outputs": [
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "d4f4e2b7",
+ "metadata": {},
+ "source": [
+ "# Modeling\n",
+ "\n",
+ "In this tutorial, we will show you how to use `zephyr_ml`'s `Zephyr` class to train models. This tutorial builds on top of the previous one where we create EntitySets, generate label times, and do automated feature engineering. To do any of these previous steps, please refer to `feature_engineering` notebook.\n",
+ "\n",
+ "## 1) Load the Feature Matrix\n",
+ "\n",
+ "Load the feature matrix which is the result of the `feature_engineering` notebook. For the purpose of this tutorial, we use a dummy feature matrix stored in the `data/` folder."
+ ]
+ },
{
- "data": {
- "text/html": [
- "
\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " COUNT(alarms) \n",
- " MAX(alarms.IND_DURATION) \n",
- " MIN(alarms.IND_DURATION) \n",
- " SUM(alarms.IND_DURATION) \n",
- " COUNT(stoppages) \n",
- " MAX(stoppages.COD_WO) \n",
- " MAX(stoppages.IND_DURATION) \n",
- " MAX(stoppages.IND_LOST_GEN) \n",
- " MIN(stoppages.COD_WO) \n",
- " MIN(stoppages.IND_DURATION) \n",
- " ... \n",
- " DES_CORE_ELEMENT_T12 \n",
- " DES_CORE_ELEMENT_T13 \n",
- " DES_CORE_ELEMENT_T14 \n",
- " DES_CORE_ELEMENT_T15 \n",
- " SITE_LOCATION \n",
- " DES_CORE_PLANT_LOC \n",
- " COD_PLANT_SAP_ABC \n",
- " COD_PLANT_SAP_XYZ \n",
- " PI_COLLECTOR_SITE_NAME_LOC0 \n",
- " PI_LOCAL_SITE_NAME_LOC0 \n",
- " \n",
- " \n",
- " \n",
- " \n",
- " 0 \n",
- " 1 \n",
- " NaN \n",
- " NaN \n",
- " 0.0 \n",
- " 1 \n",
- " 12345.0 \n",
- " NaN \n",
- " NaN \n",
- " 12345.0 \n",
- " NaN \n",
- " ... \n",
- " 0 \n",
- " 0 \n",
- " 0 \n",
- " 0 \n",
- " 1 \n",
- " 1 \n",
- " 1 \n",
- " 0 \n",
- " 1 \n",
- " 1 \n",
- " \n",
- " \n",
- " 1 \n",
- " 0 \n",
- " NaN \n",
- " NaN \n",
- " 0.0 \n",
- " 1 \n",
- " 37452.0 \n",
- " NaN \n",
- " NaN \n",
- " 37452.0 \n",
- " NaN \n",
- " ... \n",
- " 0 \n",
- " 0 \n",
- " 0 \n",
- " 0 \n",
- " 1 \n",
- " 1 \n",
- " 1 \n",
- " 0 \n",
- " 1 \n",
- " 1 \n",
- " \n",
- " \n",
- " 2 \n",
- " 0 \n",
- " NaN \n",
- " NaN \n",
- " 0.0 \n",
- " 1 \n",
- " 23432.0 \n",
- " NaN \n",
- " NaN \n",
- " 23432.0 \n",
- " NaN \n",
- " ... \n",
- " 0 \n",
- " 0 \n",
- " 0 \n",
- " 0 \n",
- " 1 \n",
- " 1 \n",
- " 1 \n",
- " 0 \n",
- " 1 \n",
- " 1 \n",
- " \n",
- " \n",
- " 3 \n",
- " 0 \n",
- " NaN \n",
- " NaN \n",
- " 0.0 \n",
- " 1 \n",
- " 12452.0 \n",
- " NaN \n",
- " NaN \n",
- " 12452.0 \n",
- " NaN \n",
- " ... \n",
- " 0 \n",
- " 0 \n",
- " 0 \n",
- " 0 \n",
- " 1 \n",
- " 1 \n",
- " 1 \n",
- " 0 \n",
- " 1 \n",
- " 1 \n",
- " \n",
- " \n",
- " 4 \n",
- " 0 \n",
- " NaN \n",
- " NaN \n",
- " 0.0 \n",
- " 1 \n",
- " 32435.0 \n",
- " NaN \n",
- " NaN \n",
- " 32435.0 \n",
- " NaN \n",
- " ... \n",
- " 0 \n",
- " 0 \n",
- " 0 \n",
- " 0 \n",
- " 1 \n",
- " 1 \n",
- " 1 \n",
- " 0 \n",
- " 1 \n",
- " 1 \n",
- " \n",
- " \n",
- " 5 \n",
- " 0 \n",
- " NaN \n",
- " NaN \n",
- " 0.0 \n",
- " 1 \n",
- " 23534.0 \n",
- " NaN \n",
- " NaN \n",
- " 23534.0 \n",
- " NaN \n",
- " ... \n",
- " 0 \n",
- " 0 \n",
- " 0 \n",
- " 0 \n",
- " 1 \n",
- " 1 \n",
- " 1 \n",
- " 0 \n",
- " 1 \n",
- " 1 \n",
- " \n",
- " \n",
- " 6 \n",
- " 0 \n",
- " NaN \n",
- " NaN \n",
- " 0.0 \n",
- " 1 \n",
- " 65431.0 \n",
- " NaN \n",
- " NaN \n",
- " 65431.0 \n",
- " NaN \n",
- " ... \n",
- " 0 \n",
- " 0 \n",
- " 0 \n",
- " 0 \n",
- " 1 \n",
- " 1 \n",
- " 1 \n",
- " 0 \n",
- " 1 \n",
- " 1 \n",
- " \n",
- " \n",
- " 7 \n",
- " 0 \n",
- " NaN \n",
- " NaN \n",
- " 0.0 \n",
- " 1 \n",
- " 35742.0 \n",
- " NaN \n",
- " NaN \n",
- " 35742.0 \n",
- " NaN \n",
- " ... \n",
- " 0 \n",
- " 0 \n",
- " 0 \n",
- " 0 \n",
- " 1 \n",
- " 1 \n",
- " 0 \n",
- " 1 \n",
- " 1 \n",
- " 1 \n",
- " \n",
- " \n",
- " 8 \n",
- " 0 \n",
- " NaN \n",
- " NaN \n",
- " 0.0 \n",
- " 1 \n",
- " 21343.0 \n",
- " NaN \n",
- " NaN \n",
- " 21343.0 \n",
- " NaN \n",
- " ... \n",
- " 0 \n",
- " 0 \n",
- " 0 \n",
- " 0 \n",
- " 1 \n",
- " 1 \n",
- " 0 \n",
- " 1 \n",
- " 1 \n",
- " 1 \n",
- " \n",
- " \n",
- " 9 \n",
- " 0 \n",
- " NaN \n",
- " NaN \n",
- " 0.0 \n",
- " 1 \n",
- " 43565.0 \n",
- " NaN \n",
- " NaN \n",
- " 43565.0 \n",
- " NaN \n",
- " ... \n",
- " 0 \n",
- " 0 \n",
- " 0 \n",
- " 0 \n",
- " 1 \n",
- " 1 \n",
- " 0 \n",
- " 1 \n",
- " 1 \n",
- " 1 \n",
- " \n",
- " \n",
- " 10 \n",
- " 0 \n",
- " NaN \n",
- " NaN \n",
- " 0.0 \n",
- " 1 \n",
- " 24525.0 \n",
- " NaN \n",
- " NaN \n",
- " 24525.0 \n",
- " NaN \n",
- " ... \n",
- " 0 \n",
- " 1 \n",
- " 0 \n",
- " 0 \n",
- " 1 \n",
- " 1 \n",
- " 0 \n",
- " 1 \n",
- " 1 \n",
- " 1 \n",
- " \n",
- " \n",
- " 11 \n",
- " 0 \n",
- " NaN \n",
- " NaN \n",
- " 0.0 \n",
- " 1 \n",
- " 67432.0 \n",
- " NaN \n",
- " NaN \n",
- " 67432.0 \n",
- " NaN \n",
- " ... \n",
- " 0 \n",
- " 0 \n",
- " 1 \n",
- " 0 \n",
- " 1 \n",
- " 1 \n",
- " 0 \n",
- " 1 \n",
- " 1 \n",
- " 1 \n",
- " \n",
- " \n",
- " 12 \n",
- " 0 \n",
- " NaN \n",
- " NaN \n",
- " 0.0 \n",
- " 1 \n",
- " 21342.0 \n",
- " NaN \n",
- " NaN \n",
- " 21342.0 \n",
- " NaN \n",
- " ... \n",
- " 0 \n",
- " 0 \n",
- " 0 \n",
- " 1 \n",
- " 1 \n",
- " 1 \n",
- " 0 \n",
- " 1 \n",
- " 1 \n",
- " 1 \n",
- " \n",
- " \n",
- "
\n",
- "
13 rows × 101 columns
\n",
- "
"
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "4a6724ad",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " COUNT(alarms) \n",
+ " MAX(alarms.IND_DURATION) \n",
+ " MIN(alarms.IND_DURATION) \n",
+ " SUM(alarms.IND_DURATION) \n",
+ " COUNT(stoppages) \n",
+ " MAX(stoppages.COD_WO) \n",
+ " MAX(stoppages.IND_DURATION) \n",
+ " MAX(stoppages.IND_LOST_GEN) \n",
+ " MIN(stoppages.COD_WO) \n",
+ " MIN(stoppages.IND_DURATION) \n",
+ " ... \n",
+ " DES_CORE_ELEMENT_T12 \n",
+ " DES_CORE_ELEMENT_T13 \n",
+ " DES_CORE_ELEMENT_T14 \n",
+ " DES_CORE_ELEMENT_T15 \n",
+ " SITE_LOCATION \n",
+ " DES_CORE_PLANT_LOC \n",
+ " COD_PLANT_SAP_ABC \n",
+ " COD_PLANT_SAP_XYZ \n",
+ " PI_COLLECTOR_SITE_NAME_LOC0 \n",
+ " PI_LOCAL_SITE_NAME_LOC0 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " 1 \n",
+ " NaN \n",
+ " NaN \n",
+ " 0.0 \n",
+ " 1 \n",
+ " 12345.0 \n",
+ " NaN \n",
+ " NaN \n",
+ " 12345.0 \n",
+ " NaN \n",
+ " ... \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 1 \n",
+ " 1 \n",
+ " 1 \n",
+ " 0 \n",
+ " 1 \n",
+ " 1 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 0 \n",
+ " NaN \n",
+ " NaN \n",
+ " 0.0 \n",
+ " 1 \n",
+ " 37452.0 \n",
+ " NaN \n",
+ " NaN \n",
+ " 37452.0 \n",
+ " NaN \n",
+ " ... \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 1 \n",
+ " 1 \n",
+ " 1 \n",
+ " 0 \n",
+ " 1 \n",
+ " 1 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 0 \n",
+ " NaN \n",
+ " NaN \n",
+ " 0.0 \n",
+ " 1 \n",
+ " 23432.0 \n",
+ " NaN \n",
+ " NaN \n",
+ " 23432.0 \n",
+ " NaN \n",
+ " ... \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 1 \n",
+ " 1 \n",
+ " 1 \n",
+ " 0 \n",
+ " 1 \n",
+ " 1 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 0 \n",
+ " NaN \n",
+ " NaN \n",
+ " 0.0 \n",
+ " 1 \n",
+ " 12452.0 \n",
+ " NaN \n",
+ " NaN \n",
+ " 12452.0 \n",
+ " NaN \n",
+ " ... \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 1 \n",
+ " 1 \n",
+ " 1 \n",
+ " 0 \n",
+ " 1 \n",
+ " 1 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 0 \n",
+ " NaN \n",
+ " NaN \n",
+ " 0.0 \n",
+ " 1 \n",
+ " 32435.0 \n",
+ " NaN \n",
+ " NaN \n",
+ " 32435.0 \n",
+ " NaN \n",
+ " ... \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 1 \n",
+ " 1 \n",
+ " 1 \n",
+ " 0 \n",
+ " 1 \n",
+ " 1 \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " 0 \n",
+ " NaN \n",
+ " NaN \n",
+ " 0.0 \n",
+ " 1 \n",
+ " 23534.0 \n",
+ " NaN \n",
+ " NaN \n",
+ " 23534.0 \n",
+ " NaN \n",
+ " ... \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 1 \n",
+ " 1 \n",
+ " 1 \n",
+ " 0 \n",
+ " 1 \n",
+ " 1 \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " 0 \n",
+ " NaN \n",
+ " NaN \n",
+ " 0.0 \n",
+ " 1 \n",
+ " 65431.0 \n",
+ " NaN \n",
+ " NaN \n",
+ " 65431.0 \n",
+ " NaN \n",
+ " ... \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 1 \n",
+ " 1 \n",
+ " 1 \n",
+ " 0 \n",
+ " 1 \n",
+ " 1 \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " 0 \n",
+ " NaN \n",
+ " NaN \n",
+ " 0.0 \n",
+ " 1 \n",
+ " 35742.0 \n",
+ " NaN \n",
+ " NaN \n",
+ " 35742.0 \n",
+ " NaN \n",
+ " ... \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 1 \n",
+ " 1 \n",
+ " 0 \n",
+ " 1 \n",
+ " 1 \n",
+ " 1 \n",
+ " \n",
+ " \n",
+ " 8 \n",
+ " 0 \n",
+ " NaN \n",
+ " NaN \n",
+ " 0.0 \n",
+ " 1 \n",
+ " 21343.0 \n",
+ " NaN \n",
+ " NaN \n",
+ " 21343.0 \n",
+ " NaN \n",
+ " ... \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 1 \n",
+ " 1 \n",
+ " 0 \n",
+ " 1 \n",
+ " 1 \n",
+ " 1 \n",
+ " \n",
+ " \n",
+ " 9 \n",
+ " 0 \n",
+ " NaN \n",
+ " NaN \n",
+ " 0.0 \n",
+ " 1 \n",
+ " 43565.0 \n",
+ " NaN \n",
+ " NaN \n",
+ " 43565.0 \n",
+ " NaN \n",
+ " ... \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 1 \n",
+ " 1 \n",
+ " 0 \n",
+ " 1 \n",
+ " 1 \n",
+ " 1 \n",
+ " \n",
+ " \n",
+ " 10 \n",
+ " 0 \n",
+ " NaN \n",
+ " NaN \n",
+ " 0.0 \n",
+ " 1 \n",
+ " 24525.0 \n",
+ " NaN \n",
+ " NaN \n",
+ " 24525.0 \n",
+ " NaN \n",
+ " ... \n",
+ " 0 \n",
+ " 1 \n",
+ " 0 \n",
+ " 0 \n",
+ " 1 \n",
+ " 1 \n",
+ " 0 \n",
+ " 1 \n",
+ " 1 \n",
+ " 1 \n",
+ " \n",
+ " \n",
+ " 11 \n",
+ " 0 \n",
+ " NaN \n",
+ " NaN \n",
+ " 0.0 \n",
+ " 1 \n",
+ " 67432.0 \n",
+ " NaN \n",
+ " NaN \n",
+ " 67432.0 \n",
+ " NaN \n",
+ " ... \n",
+ " 0 \n",
+ " 0 \n",
+ " 1 \n",
+ " 0 \n",
+ " 1 \n",
+ " 1 \n",
+ " 0 \n",
+ " 1 \n",
+ " 1 \n",
+ " 1 \n",
+ " \n",
+ " \n",
+ " 12 \n",
+ " 0 \n",
+ " NaN \n",
+ " NaN \n",
+ " 0.0 \n",
+ " 1 \n",
+ " 21342.0 \n",
+ " NaN \n",
+ " NaN \n",
+ " 21342.0 \n",
+ " NaN \n",
+ " ... \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 1 \n",
+ " 1 \n",
+ " 1 \n",
+ " 0 \n",
+ " 1 \n",
+ " 1 \n",
+ " 1 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
13 rows × 101 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " COUNT(alarms) MAX(alarms.IND_DURATION) MIN(alarms.IND_DURATION) \\\n",
+ "0 1 NaN NaN \n",
+ "1 0 NaN NaN \n",
+ "2 0 NaN NaN \n",
+ "3 0 NaN NaN \n",
+ "4 0 NaN NaN \n",
+ "5 0 NaN NaN \n",
+ "6 0 NaN NaN \n",
+ "7 0 NaN NaN \n",
+ "8 0 NaN NaN \n",
+ "9 0 NaN NaN \n",
+ "10 0 NaN NaN \n",
+ "11 0 NaN NaN \n",
+ "12 0 NaN NaN \n",
+ "\n",
+ " SUM(alarms.IND_DURATION) COUNT(stoppages) MAX(stoppages.COD_WO) \\\n",
+ "0 0.0 1 12345.0 \n",
+ "1 0.0 1 37452.0 \n",
+ "2 0.0 1 23432.0 \n",
+ "3 0.0 1 12452.0 \n",
+ "4 0.0 1 32435.0 \n",
+ "5 0.0 1 23534.0 \n",
+ "6 0.0 1 65431.0 \n",
+ "7 0.0 1 35742.0 \n",
+ "8 0.0 1 21343.0 \n",
+ "9 0.0 1 43565.0 \n",
+ "10 0.0 1 24525.0 \n",
+ "11 0.0 1 67432.0 \n",
+ "12 0.0 1 21342.0 \n",
+ "\n",
+ " MAX(stoppages.IND_DURATION) MAX(stoppages.IND_LOST_GEN) \\\n",
+ "0 NaN NaN \n",
+ "1 NaN NaN \n",
+ "2 NaN NaN \n",
+ "3 NaN NaN \n",
+ "4 NaN NaN \n",
+ "5 NaN NaN \n",
+ "6 NaN NaN \n",
+ "7 NaN NaN \n",
+ "8 NaN NaN \n",
+ "9 NaN NaN \n",
+ "10 NaN NaN \n",
+ "11 NaN NaN \n",
+ "12 NaN NaN \n",
+ "\n",
+ " MIN(stoppages.COD_WO) MIN(stoppages.IND_DURATION) ... \\\n",
+ "0 12345.0 NaN ... \n",
+ "1 37452.0 NaN ... \n",
+ "2 23432.0 NaN ... \n",
+ "3 12452.0 NaN ... \n",
+ "4 32435.0 NaN ... \n",
+ "5 23534.0 NaN ... \n",
+ "6 65431.0 NaN ... \n",
+ "7 35742.0 NaN ... \n",
+ "8 21343.0 NaN ... \n",
+ "9 43565.0 NaN ... \n",
+ "10 24525.0 NaN ... \n",
+ "11 67432.0 NaN ... \n",
+ "12 21342.0 NaN ... \n",
+ "\n",
+ " DES_CORE_ELEMENT_T12 DES_CORE_ELEMENT_T13 DES_CORE_ELEMENT_T14 \\\n",
+ "0 0 0 0 \n",
+ "1 0 0 0 \n",
+ "2 0 0 0 \n",
+ "3 0 0 0 \n",
+ "4 0 0 0 \n",
+ "5 0 0 0 \n",
+ "6 0 0 0 \n",
+ "7 0 0 0 \n",
+ "8 0 0 0 \n",
+ "9 0 0 0 \n",
+ "10 0 1 0 \n",
+ "11 0 0 1 \n",
+ "12 0 0 0 \n",
+ "\n",
+ " DES_CORE_ELEMENT_T15 SITE_LOCATION DES_CORE_PLANT_LOC \\\n",
+ "0 0 1 1 \n",
+ "1 0 1 1 \n",
+ "2 0 1 1 \n",
+ "3 0 1 1 \n",
+ "4 0 1 1 \n",
+ "5 0 1 1 \n",
+ "6 0 1 1 \n",
+ "7 0 1 1 \n",
+ "8 0 1 1 \n",
+ "9 0 1 1 \n",
+ "10 0 1 1 \n",
+ "11 0 1 1 \n",
+ "12 1 1 1 \n",
+ "\n",
+ " COD_PLANT_SAP_ABC COD_PLANT_SAP_XYZ PI_COLLECTOR_SITE_NAME_LOC0 \\\n",
+ "0 1 0 1 \n",
+ "1 1 0 1 \n",
+ "2 1 0 1 \n",
+ "3 1 0 1 \n",
+ "4 1 0 1 \n",
+ "5 1 0 1 \n",
+ "6 1 0 1 \n",
+ "7 0 1 1 \n",
+ "8 0 1 1 \n",
+ "9 0 1 1 \n",
+ "10 0 1 1 \n",
+ "11 0 1 1 \n",
+ "12 0 1 1 \n",
+ "\n",
+ " PI_LOCAL_SITE_NAME_LOC0 \n",
+ "0 1 \n",
+ "1 1 \n",
+ "2 1 \n",
+ "3 1 \n",
+ "4 1 \n",
+ "5 1 \n",
+ "6 1 \n",
+ "7 1 \n",
+ "8 1 \n",
+ "9 1 \n",
+ "10 1 \n",
+ "11 1 \n",
+ "12 1 \n",
+ "\n",
+ "[13 rows x 101 columns]"
+ ]
+ },
+ "execution_count": 1,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
],
- "text/plain": [
- " COUNT(alarms) MAX(alarms.IND_DURATION) MIN(alarms.IND_DURATION) \\\n",
- "0 1 NaN NaN \n",
- "1 0 NaN NaN \n",
- "2 0 NaN NaN \n",
- "3 0 NaN NaN \n",
- "4 0 NaN NaN \n",
- "5 0 NaN NaN \n",
- "6 0 NaN NaN \n",
- "7 0 NaN NaN \n",
- "8 0 NaN NaN \n",
- "9 0 NaN NaN \n",
- "10 0 NaN NaN \n",
- "11 0 NaN NaN \n",
- "12 0 NaN NaN \n",
- "\n",
- " SUM(alarms.IND_DURATION) COUNT(stoppages) MAX(stoppages.COD_WO) \\\n",
- "0 0.0 1 12345.0 \n",
- "1 0.0 1 37452.0 \n",
- "2 0.0 1 23432.0 \n",
- "3 0.0 1 12452.0 \n",
- "4 0.0 1 32435.0 \n",
- "5 0.0 1 23534.0 \n",
- "6 0.0 1 65431.0 \n",
- "7 0.0 1 35742.0 \n",
- "8 0.0 1 21343.0 \n",
- "9 0.0 1 43565.0 \n",
- "10 0.0 1 24525.0 \n",
- "11 0.0 1 67432.0 \n",
- "12 0.0 1 21342.0 \n",
- "\n",
- " MAX(stoppages.IND_DURATION) MAX(stoppages.IND_LOST_GEN) \\\n",
- "0 NaN NaN \n",
- "1 NaN NaN \n",
- "2 NaN NaN \n",
- "3 NaN NaN \n",
- "4 NaN NaN \n",
- "5 NaN NaN \n",
- "6 NaN NaN \n",
- "7 NaN NaN \n",
- "8 NaN NaN \n",
- "9 NaN NaN \n",
- "10 NaN NaN \n",
- "11 NaN NaN \n",
- "12 NaN NaN \n",
- "\n",
- " MIN(stoppages.COD_WO) MIN(stoppages.IND_DURATION) ... \\\n",
- "0 12345.0 NaN ... \n",
- "1 37452.0 NaN ... \n",
- "2 23432.0 NaN ... \n",
- "3 12452.0 NaN ... \n",
- "4 32435.0 NaN ... \n",
- "5 23534.0 NaN ... \n",
- "6 65431.0 NaN ... \n",
- "7 35742.0 NaN ... \n",
- "8 21343.0 NaN ... \n",
- "9 43565.0 NaN ... \n",
- "10 24525.0 NaN ... \n",
- "11 67432.0 NaN ... \n",
- "12 21342.0 NaN ... \n",
- "\n",
- " DES_CORE_ELEMENT_T12 DES_CORE_ELEMENT_T13 DES_CORE_ELEMENT_T14 \\\n",
- "0 0 0 0 \n",
- "1 0 0 0 \n",
- "2 0 0 0 \n",
- "3 0 0 0 \n",
- "4 0 0 0 \n",
- "5 0 0 0 \n",
- "6 0 0 0 \n",
- "7 0 0 0 \n",
- "8 0 0 0 \n",
- "9 0 0 0 \n",
- "10 0 1 0 \n",
- "11 0 0 1 \n",
- "12 0 0 0 \n",
- "\n",
- " DES_CORE_ELEMENT_T15 SITE_LOCATION DES_CORE_PLANT_LOC \\\n",
- "0 0 1 1 \n",
- "1 0 1 1 \n",
- "2 0 1 1 \n",
- "3 0 1 1 \n",
- "4 0 1 1 \n",
- "5 0 1 1 \n",
- "6 0 1 1 \n",
- "7 0 1 1 \n",
- "8 0 1 1 \n",
- "9 0 1 1 \n",
- "10 0 1 1 \n",
- "11 0 1 1 \n",
- "12 1 1 1 \n",
- "\n",
- " COD_PLANT_SAP_ABC COD_PLANT_SAP_XYZ PI_COLLECTOR_SITE_NAME_LOC0 \\\n",
- "0 1 0 1 \n",
- "1 1 0 1 \n",
- "2 1 0 1 \n",
- "3 1 0 1 \n",
- "4 1 0 1 \n",
- "5 1 0 1 \n",
- "6 1 0 1 \n",
- "7 0 1 1 \n",
- "8 0 1 1 \n",
- "9 0 1 1 \n",
- "10 0 1 1 \n",
- "11 0 1 1 \n",
- "12 0 1 1 \n",
- "\n",
- " PI_LOCAL_SITE_NAME_LOC0 \n",
- "0 1 \n",
- "1 1 \n",
- "2 1 \n",
- "3 1 \n",
- "4 1 \n",
- "5 1 \n",
- "6 1 \n",
- "7 1 \n",
- "8 1 \n",
- "9 1 \n",
- "10 1 \n",
- "11 1 \n",
- "12 1 \n",
- "\n",
- "[13 rows x 101 columns]"
+ "source": [
+ "import pandas as pd\n",
+ "\n",
+ "feature_matrix = pd.read_csv('data/feature_matrix.csv')\n",
+ "feature_matrix"
]
- },
- "execution_count": 1,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "import pandas as pd\n",
- "\n",
- "feature_matrix = pd.read_csv('data/feature_matrix.csv')\n",
- "feature_matrix"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "2be92488",
- "metadata": {},
- "source": [
- "## 2) Preparing Model Inputs\n",
- "\n",
- "Prepare the data for modeling. Depending on the data, you might need to: normalize the data, impute missing values, etc.\n",
- "\n",
- "In this part of the notebook, we do the following:\n",
- "* create `X` and `y` variables from the feature matrix\n",
- "* impute missing values using a SimpleImpute\n",
- "* pass the data into our `Zephyr` instance and split the data into training and testing"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "id": "b3be626a",
- "metadata": {},
- "outputs": [
+ },
{
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "/Users/raymondpan/zephyr/Zephyr-repo/venv/lib/python3.8/site-packages/sklearn/impute/_base.py:555: UserWarning: Skipping features without any observed values: [ 1 2 6 7 9 10 15 16 17 18]. At least one non-missing value is needed for imputation with strategy='mean'.\n",
- " warnings.warn(\n",
- "[GUIDE] STALE WARNING: \n",
- "\tPerforming step 2 from step -1 with set_feature_matrix.\n",
- "\tThis is a forward step via a set method.\n",
- "\tThe current step is -1.\n",
- "\tAll previous steps will be considered stale.\n",
- "[GUIDE] Successfully performed set_feature_matrix.\n",
- "\tYou can perform the next step by calling generate_train_test_split.\n",
- "[GUIDE] Successfully performed generate_train_test_split.\n",
- "\tYou can perform the next step by calling fit_pipeline.\n"
- ]
+ "cell_type": "markdown",
+ "id": "2be92488",
+ "metadata": {},
+ "source": [
+ "## 2) Preparing Model Inputs\n",
+ "\n",
+ "Prepare the data for modeling. Depending on the data, you might need to: normalize the data, impute missing values, etc.\n",
+ "\n",
+ "In this part of the notebook, we do the following:\n",
+ "* create `X` and `y` variables from the feature matrix\n",
+ "* impute missing values using a SimpleImpute\n",
+ "* pass the data into our `Zephyr` instance and split the data into training and testing"
+ ]
},
{
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "[True, False, True, False, True, False, False, False, False, True, False, False, False]\n"
- ]
- }
- ],
- "source": [
- "from sklearn.impute import SimpleImputer\n",
- "from zephyr_ml import Zephyr\n",
- "\n",
- "# pop the target labels\n",
- "y = list(feature_matrix.pop('label'))\n",
- "print(y)\n",
- "X = feature_matrix.values\n",
- "\n",
- "\n",
- "# impute missing values\n",
- "imputer = SimpleImputer()\n",
- "X = pd.DataFrame(imputer.fit_transform(X))\n",
- "\n",
- "zephyr = Zephyr()\n",
- "zephyr.set_feature_matrix(X, labels = y)\n",
- "X_train, X_test, y_train, y_test = zephyr.generate_train_test_split(test_size=0.2, random_state=33)"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "3c8b00e2",
- "metadata": {},
- "source": [
- "## 3) Train a Model\n",
- "\n",
- "We train a model using `Zephyr`'s `fit_pipeline` method.\n",
- "In this notebook, we use an `xgb_classifier` pipeline which consists of two primitives:\n",
- "\n",
- "```\n",
- " \"xgboost.XGBClassifier\"\n",
- " \"zephyr_ml.primitives.postprocessing.FindThreshold\"\n",
- "```\n",
- "\n",
- "An `XGBClassifier` primitive is an XGB model that returns the probability of each class, and `FindThreshold` primitive creates binary labels from the output of the XGB model by choosing a threshold that produces the best metric value (F1 Score by default)\n",
- "\n",
- "To use a pipeline, we simply pass the name of the pipeline to our `Zephyr` instance.\n",
- "Optionally, you can change the default settings of the primitive by passing a hyperparameter dictionary. For example, we can change the number of trees in the classifier to be 50 instead of the default value (100)."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "id": "edffee03",
- "metadata": {},
- "outputs": [
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "b3be626a",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/raymondpan/zephyr/Zephyr-repo/venv/lib/python3.8/site-packages/sklearn/impute/_base.py:555: UserWarning: Skipping features without any observed values: [ 1 2 6 7 9 10 15 16 17 18]. At least one non-missing value is needed for imputation with strategy='mean'.\n",
+ " warnings.warn(\n",
+ "[GUIDE] Successfully performed set_feature_matrix.\n",
+ "\tYou can perform the next step by calling generate_train_test_split.\n",
+ "[GUIDE] Successfully performed generate_train_test_split.\n",
+ "\tYou can perform the next step by calling fit_pipeline.\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[True, False, True, False, True, False, False, False, False, True, False, False, False]\n"
+ ]
+ }
+ ],
+ "source": [
+ "from sklearn.impute import SimpleImputer\n",
+ "from zephyr_ml import Zephyr\n",
+ "\n",
+ "# pop the target labels\n",
+ "y = list(feature_matrix.pop('label'))\n",
+ "print(y)\n",
+ "X = feature_matrix.values\n",
+ "\n",
+ "\n",
+ "# impute missing values\n",
+ "imputer = SimpleImputer()\n",
+ "X = pd.DataFrame(imputer.fit_transform(X))\n",
+ "\n",
+ "zephyr = Zephyr()\n",
+ "zephyr.set_feature_matrix(X, labels = y)\n",
+ "X_train, X_test, y_train, y_test = zephyr.generate_train_test_split(test_size=0.2, random_state=33)"
+ ]
+ },
{
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "[GUIDE] Successfully performed fit_pipeline.\n",
- "\tYou can perform the next step by calling predict or evaluate.\n"
- ]
- }
- ],
- "source": [
- "hyperparameters = {\n",
- " \"xgboost.XGBClassifier#1\": {\n",
- " \"n_estimators\": 50\n",
- " }\n",
- "}\n",
- "\n",
- "zephyr.fit_pipeline(pipeline = \"xgb_classifier\", pipeline_hyperparameters = hyperparameters)"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "445afd22",
- "metadata": {},
- "source": [
- "Now that the pipeline is trained, we can use it to predict the values of the test data using `predict` function\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "id": "78187756",
- "metadata": {},
- "outputs": [
+ "cell_type": "markdown",
+ "id": "3c8b00e2",
+ "metadata": {},
+ "source": [
+ "## 3) Train a Model\n",
+ "\n",
+ "We train a model using `Zephyr`'s `fit_pipeline` method.\n",
+ "In this notebook, we use an `xgb_classifier` pipeline which consists of two primitives:\n",
+ "\n",
+ "```\n",
+ " \"xgboost.XGBClassifier\"\n",
+ " \"zephyr_ml.primitives.postprocessing.FindThreshold\"\n",
+ "```\n",
+ "\n",
+ "An `XGBClassifier` primitive is an XGB model that returns the probability of each class, and `FindThreshold` primitive creates binary labels from the output of the XGB model by choosing a threshold that produces the best metric value (F1 Score by default)\n",
+ "\n",
+ "To use a pipeline, we simply pass the name of the pipeline to our `Zephyr` instance.\n",
+ "Optionally, you can change the default settings of the primitive by passing a hyperparameter dictionary. For example, we can change the number of trees in the classifier to be 50 instead of the default value (100)."
+ ]
+ },
{
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "[GUIDE] Successfully performed predict.\n",
- "\tYou have reached the end of the predictive engineering workflow.\n",
- "\tYou can call predict or evaluate again or re-perform previous steps based on results.\n"
- ]
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "edffee03",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "hyperparameters = {\n",
+ " \"xgboost.XGBClassifier#1\": {\n",
+ " \"n_estimators\": 50\n",
+ " }\n",
+ "}\n",
+ "\n",
+ "zephyr.fit_pipeline(pipeline = \"xgb_classifier\", pipeline_hyperparameters = hyperparameters)"
+ ]
},
{
- "data": {
- "text/plain": [
- "[1, 0, 1]"
+ "cell_type": "markdown",
+ "id": "445afd22",
+ "metadata": {},
+ "source": [
+ "Now that the pipeline is trained, we can use it to predict the values of the test data using `predict` function\n"
]
- },
- "execution_count": 4,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "zephyr.predict()"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "24cda971",
- "metadata": {},
- "source": [
- "Lastly, we can evaluate the performance of the pipeline using `evaluate` function\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "id": "cd097853",
- "metadata": {},
- "outputs": [
+ },
{
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "[GUIDE] Successfully performed evaluate.\n",
- "\tYou have reached the end of the predictive engineering workflow.\n",
- "\tYou can call predict or evaluate again or re-perform previous steps based on results.\n"
- ]
- }
- ],
- "source": [
- "res = zephyr.evaluate()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "id": "8df0f26c",
- "metadata": {},
- "outputs": [
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "78187756",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[1, 0, 1]"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "zephyr.predict()"
+ ]
+ },
{
- "data": {
- "text/plain": [
- "{'sklearn.metrics.accuracy_score': 0.6666666666666666,\n",
- " 'sklearn.metrics.precision_score': 0.5,\n",
- " 'sklearn.metrics.f1_score': 0.6666666666666666,\n",
- " 'sklearn.metrics.recall_score': 1.0,\n",
- " 'zephyr_ml.primitives.postprocessing.confusion_matrix': (array([[1, 1],\n",
- " [0, 1]]),\n",
- " ),\n",
- " 'zephyr_ml.primitives.postprocessing.roc_auc_score_and_curve': (0.5,\n",
- " )}"
+ "cell_type": "markdown",
+ "id": "24cda971",
+ "metadata": {},
+ "source": [
+ "Lastly, we can evaluate the performance of the pipeline using `evaluate` function\n"
]
- },
- "execution_count": 6,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "res"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "e2657da3",
- "metadata": {},
- "source": [
- "The `confusion_matrix` and `roc_auc_score_and_curve` evaluation metrics return some `matplotlib.figure.Figure` objects, which we can display, as shown below."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "id": "b74c3618",
- "metadata": {},
- "outputs": [
+ },
{
- "data": {
- "image/png": "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ytqyZYuuXr2q0qVL26wwAABQ+NjkQ+JMJhOhAwAAKxXETaG2kuPgYc0Hxh05ciTXBQEAUNg5cO7IefDI7gPjbt68qf379+vMmTMaNmyYzYoDAACFS46Dx90+MO7NN9/UoUOH9Nxzz91XUQAAFGYFcVOordj0bqthYWHavHmzLQ8JAEChY7Lhn4LGpsHjzJkzSktLs+UhAQBAIZLjpZa5c+dmGcvIyFBMTIw2b96sZs2a2aQwAAAKK0dearFJ8JAkDw8PNW/eXCNHjrzvogAAKMwIHjlw+3NZAABA7tzrthSFWY73eIwcOVJnz57N9rnff/9dr7322n0XBQAACierOh7nz5+3fL127Vo1b95czs7OWebt3LlTP/74o+2qAwCgEGKp5R4mTJignTt3SrrVHhowYEC288xms5588knbVQcAQCHkwCst1gWPiRMn6scff5TZbNaoUaPUt29fValSJdMcJycnlShRQo0aNcqTQgEAQMFnVfAoV66cwsLCJN3qeAQHB6tEiRKW5ZakpCSlpqbK09Mz7yoFAKCQyC8fEpeRkaG5c+fqiy++0I0bNxQQEKBx48apcuXK93zt+vXr9cYbb2jbtm2qVKmS1efM8ebSdu3aafbs2XrhhRcsY/v371dQUJCmTp2qjIyMnB4SAACH4mSy3eN+REZGasWKFZo0aZJWrlypjIwM9erVSykpKXd93Z9//qmJEyfm6pw5Dh5z5szR+vXr1a5dO8tY3bp1NWzYMH3++ef68MMPc1UIAAAwTkpKipYsWaLw8HAFBwerdu3amjVrlmJiYrR169Y7vi4jI0NvvPGGfHx8cnXeHAePDRs2aPjw4erRo4dlrGTJkurevbsGDx6s1atX56oQAAAchclku0duHT16VDdv3lRQUJBlrESJEqpbt6727t17x9fNnz9fqampevXVV3N13hzfQOzq1at3XPupXr26YmJiclUIAACOwsmGH+4WGhp61+e3bduW7fjt39cVKlTINO7l5XXH3+X//e9/tWTJEq1evVoXL17MRbW56HhUr15dX3/9dbbPfffdd6patWquCgEAAMZJTEyUJLm6umYad3NzU3Jycpb5CQkJGjZsmIYNG6Zq1arl+rw57nh069ZNI0aM0LVr19S8eXOVKVNGV65c0fbt27VlyxZNmTIl18UAAOAIbHlRy506Gvfi7u4u6dZe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AADDEDwAAIBhCB4AAMAwBA8AAGAYggcAADAMwQMAABiG4AEAAAxD8AAAAIYheAAAAMMQPAAAgGEIHgAAwDAEDwAAYBiCBwAAMAzBAwAAGIbgAQAADEPwAAAAhiF4AIWI2Wy2dwkAcFcED+B/XnrpJXl7e2d6+Pr6Kjg4WBMmTND169fz7NxRUVHy9vbWuXPnJElz5syRt7e31a+PiYlRnz599Oeff953LefOnZO3t7eioqKyfX7evHny9vbWf//73zseY9KkSfL391d8fPw9zzdixAiFhITkul4ABUsRexcA5Cd169bVW2+9Zfl7amqqfvvtN7333ns6cuSIPvvsM5lMpjyv4/nnn1eTJk2snv/jjz9qx44deVjR/xcWFqaIiAht2LBB9erVy/J8SkqKNm7cqKeffloeHh6G1ASg4CB4AH/j4eGh+vXrZxoLCAjQzZs3FRERoV9//TXL83mhfPnyKl++fJ6fJzfKly+vxo0ba/PmzRoxYoScnZ0zPb9jxw5du3ZNHTt2tFOFAPIzlloAK/j6+kqSzp8/L+nWssywYcMUHh6u+vXrq0ePHpKk5ORkTZs2TU899ZR8fX31r3/9S5s3b850rIyMDEVGRio4OFh+fn7q169flmWc7JZa1q1bp7CwMPn5+Sk4OFgzZ85USkqKoqKiNHLkSElSaGioRowYYXnNF198obZt21qWjObMmaP09PRMx926daueeeYZ1atXT2FhYTp69Og9vx/PPfec/vrrL/30009Znlu7dq2qV6+uBg0aKD09XQsXLlS7du1Ur1491a9fX506ddLu3bvveGxvb2/NmTPnnt+Pffv2qWvXrvLz81NgYKCGDx+uK1euWJ7PyMjQrFmzFBISIl9fX4WEhGjmzJlKTU295/sDkHcIHoAVTp06JUmqXLmyZWzLli0qXry45s2bp169eslsNqt///5auXKlevTooXnz5snf31+DBw/WunXrLK+bPn26PvjgA3Xs2FFz585VyZIlNXPmzLuef/ny5Ro+fLh8fHw0d+5c9enTR59++qkmT56s4OBg9e3bV5I0d+5c9evXT5K0YMECjR07VkFBQZo/f766dOmiRYsWaezYsZbjfvfddwoPD5e3t7c++OADtW7dWm+88cY9vx8hISEqVaqUNmzYkGn8ypUr2rlzp6XbMWPGDEVGRurf//63PvzwQ02a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",
- "text/plain": [
- ""
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "cd097853",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "res = zephyr.evaluate()"
]
- },
- "execution_count": 7,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "%matplotlib inline\n",
- "_, conf_matrix_fig = res[\"zephyr_ml.primitives.postprocessing.confusion_matrix\"]\n",
- "conf_matrix_fig"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 8,
- "id": "d59e86b1",
- "metadata": {},
- "outputs": [
+ },
{
- "data": {
- "image/png": "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",
- "text/plain": [
- ""
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "8df0f26c",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'sklearn.metrics.accuracy_score': 0.6666666666666666,\n",
+ " 'sklearn.metrics.precision_score': 0.5,\n",
+ " 'sklearn.metrics.f1_score': 0.6666666666666666,\n",
+ " 'sklearn.metrics.recall_score': 1.0,\n",
+ " 'zephyr_ml.primitives.postprocessing.confusion_matrix': (array([[1, 1],\n",
+ " [0, 1]]),\n",
+ " ),\n",
+ " 'zephyr_ml.primitives.postprocessing.roc_auc_score_and_curve': (0.5,\n",
+ " )}"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "res"
]
- },
- "execution_count": 8,
- "metadata": {},
- "output_type": "execute_result"
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e2657da3",
+ "metadata": {},
+ "source": [
+ "The `confusion_matrix` and `roc_auc_score_and_curve` evaluation metrics return some `matplotlib.figure.Figure` objects, which we can display, as shown below."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "b74c3618",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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ytqyZYuuXr2q0qVL26wwAABQ+NjkQ+JMJhOhAwAAKxXETaG2kuPgYc0Hxh05ciTXBQEAUNg5cO7IefDI7gPjbt68qf379+vMmTMaNmyYzYoDAACFS46Dx90+MO7NN9/UoUOH9Nxzz91XUQAAFGYFcVOordj0bqthYWHavHmzLQ8JAEChY7Lhn4LGpsHjzJkzSktLs+UhAQBAIZLjpZa5c+dmGcvIyFBMTIw2b96sZs2a2aQwAAAKK0dearFJ8JAkDw8PNW/eXCNHjrzvogAAKMwIHjlw+3NZAABA7tzrthSFWY73eIwcOVJnz57N9rnff/9dr7322n0XBQAACierOh7nz5+3fL127Vo1b95czs7OWebt3LlTP/74o+2qAwCgEGKp5R4mTJignTt3SrrVHhowYEC288xms5588knbVQcAQCHkwCst1gWPiRMn6scff5TZbNaoUaPUt29fValSJdMcJycnlShRQo0aNcqTQgEAQMFnVfAoV66cwsLCJN3qeAQHB6tEiRKW5ZakpCSlpqbK09Mz7yoFAKCQyC8fEpeRkaG5c+fqiy++0I0bNxQQEKBx48apcuXK93zt+vXr9cYbb2jbtm2qVKmS1efM8ebSdu3aafbs2XrhhRcsY/v371dQUJCmTp2qjIyMnB4SAACH4mSy3eN+REZGasWKFZo0aZJWrlypjIwM9erVSykpKXd93Z9//qmJEyfm6pw5Dh5z5szR+vXr1a5dO8tY3bp1NWzYMH3++ef68MMPc1UIAAAwTkpKipYsWaLw8HAFBwerdu3amjVrlmJiYrR169Y7vi4jI0NvvPGGfHx8cnXeHAePDRs2aPjw4erRo4dlrGTJkurevbsGDx6s1atX56oQAAAchclku0duHT16VDdv3lRQUJBlrESJEqpbt6727t17x9fNnz9fqampevXVV3N13hzfQOzq1at3XPupXr26YmJiclUIAACOwsmGH+4WGhp61+e3bduW7fjt39cVKlTINO7l5XXH3+X//e9/tWTJEq1evVoXL17MRbW56HhUr15dX3/9dbbPfffdd6patWquCgEAAMZJTEyUJLm6umYad3NzU3Jycpb5CQkJGjZsmIYNG6Zq1arl+rw57nh069ZNI0aM0LVr19S8eXOVKVNGV65c0fbt27VlyxZNmTIl18UAAOAIbHlRy506Gvfi7u4u6dZe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AADDEDwAAIBhCB4AAMAwBA8AAGAYggcAADAMwQMAABiG4AEAAAxD8AAAAIYheAAAAMMQPAAAgGEIHgAAwDAEDwAAYBiCBwAAMAzBAwAAGIbgAQAADEPwAAAAhiF4AIWI2Wy2dwkAcFcED+B/XnrpJXl7e2d6+Pr6Kjg4WBMmTND169fz7NxRUVHy9vbWuXPnJElz5syRt7e31a+PiYlRnz599Oeff953LefOnZO3t7eioqKyfX7evHny9vbWf//73zseY9KkSfL391d8fPw9zzdixAiFhITkul4ABUsRexcA5Cd169bVW2+9Zfl7amqqfvvtN7333ns6cuSIPvvsM5lMpjyv4/nnn1eTJk2snv/jjz9qx44deVjR/xcWFqaIiAht2LBB9erVy/J8SkqKNm7cqKeffloeHh6G1ASg4CB4AH/j4eGh+vXrZxoLCAjQzZs3FRERoV9//TXL83mhfPnyKl++fJ6fJzfKly+vxo0ba/PmzRoxYoScnZ0zPb9jxw5du3ZNHTt2tFOFAPIzlloAK/j6+kqSzp8/L+nWssywYcMUHh6u+vXrq0ePHpKk5ORkTZs2TU899ZR8fX31r3/9S5s3b850rIyMDEVGRio4OFh+fn7q169flmWc7JZa1q1bp7CwMPn5+Sk4OFgzZ85USkqKoqKiNHLkSElSaGioRowYYXnNF198obZt21qWjObMmaP09PRMx926daueeeYZ1atXT2FhYTp69Og9vx/PPfec/vrrL/30009Znlu7dq2qV6+uBg0aKD09XQsXLlS7du1Ur1491a9fX506ddLu3bvveGxvb2/NmTPnnt+Pffv2qWvXrvLz81NgYKCGDx+uK1euWJ7PyMjQrFmzFBISIl9fX4WEhGjmzJlKTU295/sDkHcIHoAVTp06JUmqXLmyZWzLli0qXry45s2bp169eslsNqt///5auXKlevTooXnz5snf31+DBw/WunXrLK+bPn26PvjgA3Xs2FFz585VyZIlNXPmzLuef/ny5Ro+fLh8fHw0d+5c9enTR59++qkmT56s4OBg9e3bV5I0d+5c9evXT5K0YMECjR07VkFBQZo/f766dOmiRYsWaezYsZbjfvfddwoPD5e3t7c++OADtW7dWm+88cY9vx8hISEqVaqUNmzYkGn8ypUr2rlzp6XbMWPGDEVGRurf//63PvzwQ02a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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "%matplotlib inline\n",
+ "_, conf_matrix_fig = res[\"zephyr_ml.primitives.postprocessing.confusion_matrix\"]\n",
+ "conf_matrix_fig"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "d59e86b1",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "\n",
+ "_, roc_fig = res[\"zephyr_ml.primitives.postprocessing.roc_auc_score_and_curve\"]\n",
+ "\n",
+ "roc_fig\n"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "venv",
+ "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.0"
}
- ],
- "source": [
- "\n",
- "_, roc_fig = res[\"zephyr_ml.primitives.postprocessing.roc_auc_score_and_curve\"]\n",
- "\n",
- "roc_fig\n"
- ]
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "venv",
- "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.0"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 5
+ "nbformat": 4,
+ "nbformat_minor": 5
}
diff --git a/notebooks/visualization.ipynb b/notebooks/visualization.ipynb
index 3e5f9fb..86e34b5 100644
--- a/notebooks/visualization.ipynb
+++ b/notebooks/visualization.ipynb
@@ -1,297 +1,283 @@
{
- "cells": [
- {
- "cell_type": "markdown",
- "id": "3674a18e",
- "metadata": {},
- "source": [
- "# Visualization\n",
- "\n",
- "In this tutorial, we will show you how to use Zephyr class to obtain intermediate results of the pipeline for visualization purposes during the fitting stage. To know more about pipelines and Zephyr class please refer to the modeling notebook. We also used a demo feature matrix, to know how you can create features, please refer to feature_engineering notebook.\n",
- "\n",
- "## Load the Feature Matrix\n",
- "\n",
- "Load the feature matrix which is the result of the `feature_engineering` notebook. For the purpose of this tutorial, we use a dummy feature matrix stored in the `data/` folder."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 1,
- "id": "d6f954db",
- "metadata": {},
- "outputs": [],
- "source": [
- "import pandas as pd\n",
- "\n",
- "feature_matrix = pd.read_csv('data/feature_matrix.csv')"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "4ba7879c",
- "metadata": {},
- "source": [
- "## Prepare data\n",
- "\n",
- "Prepare the data for training by creating a `y` variable to hold the labels, imputing missing values, and normlizing the data. We then initialize a `Zephyr` instance, set our data, and split it into training and testing."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "id": "23ec49dd",
- "metadata": {},
- "outputs": [
+ "cells": [
{
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "/Users/raymondpan/zephyr/Zephyr-repo/venv/lib/python3.8/site-packages/sklearn/impute/_base.py:555: UserWarning: Skipping features without any observed values: [ 1 2 6 7 9 10 15 16 17 18]. At least one non-missing value is needed for imputation with strategy='mean'.\n",
- " warnings.warn(\n",
- "[GUIDE] STALE WARNING: \n",
- "\tPerforming step 2 from step -1 with set_feature_matrix.\n",
- "\tThis is a forward step via a set method.\n",
- "\tThe current step is -1.\n",
- "\tAll previous steps will be considered stale.\n",
- "[GUIDE] Successfully performed set_feature_matrix.\n",
- "\tYou can perform the next step by calling generate_train_test_split.\n",
- "[GUIDE] Successfully performed generate_train_test_split.\n",
- "\tYou can perform the next step by calling fit_pipeline.\n"
- ]
+ "cell_type": "markdown",
+ "id": "3674a18e",
+ "metadata": {},
+ "source": [
+ "# Visualization\n",
+ "\n",
+ "In this tutorial, we will show you how to use Zephyr class to obtain intermediate results of the pipeline for visualization purposes during the fitting stage. To know more about pipelines and Zephyr class please refer to the modeling notebook. We also used a demo feature matrix, to know how you can create features, please refer to feature_engineering notebook.\n",
+ "\n",
+ "## Load the Feature Matrix\n",
+ "\n",
+ "Load the feature matrix which is the result of the `feature_engineering` notebook. For the purpose of this tutorial, we use a dummy feature matrix stored in the `data/` folder."
+ ]
},
{
- "data": {
- "text/plain": [
- "( 0 1 2 3 4 5 6 7 8 9 ... \\\n",
- " 10 -0.288675 0.0 0.0 -0.463185 -0.463185 -0.463185 0.0 0.0 0.0 0.0 ... \n",
- " 5 -0.288675 0.0 0.0 -0.521570 -0.521570 -0.521570 0.0 0.0 0.0 0.0 ... \n",
- " 3 -0.288675 0.0 0.0 -1.174466 -1.174466 -1.174466 0.0 0.0 0.0 0.0 ... \n",
- " 11 -0.288675 0.0 0.0 2.064680 2.064680 2.064680 0.0 0.0 0.0 0.0 ... \n",
- " 1 -0.288675 0.0 0.0 0.298409 0.298409 0.298409 0.0 0.0 0.0 0.0 ... \n",
- " 9 -0.288675 0.0 0.0 0.658556 0.658556 0.658556 0.0 0.0 0.0 0.0 ... \n",
- " 2 -0.288675 0.0 0.0 -0.527579 -0.527579 -0.527579 0.0 0.0 0.0 0.0 ... \n",
- " 8 -0.288675 0.0 0.0 -0.650653 -0.650653 -0.650653 0.0 0.0 0.0 0.0 ... \n",
- " 7 -0.288675 0.0 0.0 0.197664 0.197664 0.197664 0.0 0.0 0.0 0.0 ... \n",
- " 4 -0.288675 0.0 0.0 0.002832 0.002832 0.002832 0.0 0.0 0.0 0.0 ... \n",
- " \n",
- " 80 81 82 83 84 85 86 87 88 89 \n",
- " 10 0.0 3.464102 -0.288675 -0.288675 0.0 0.0 -1.080123 1.080123 0.0 0.0 \n",
- " 5 0.0 -0.288675 -0.288675 -0.288675 0.0 0.0 0.925820 -0.925820 0.0 0.0 \n",
- " 3 0.0 -0.288675 -0.288675 -0.288675 0.0 0.0 0.925820 -0.925820 0.0 0.0 \n",
- " 11 0.0 -0.288675 3.464102 -0.288675 0.0 0.0 -1.080123 1.080123 0.0 0.0 \n",
- " 1 0.0 -0.288675 -0.288675 -0.288675 0.0 0.0 0.925820 -0.925820 0.0 0.0 \n",
- " 9 0.0 -0.288675 -0.288675 -0.288675 0.0 0.0 -1.080123 1.080123 0.0 0.0 \n",
- " 2 0.0 -0.288675 -0.288675 -0.288675 0.0 0.0 0.925820 -0.925820 0.0 0.0 \n",
- " 8 0.0 -0.288675 -0.288675 -0.288675 0.0 0.0 -1.080123 1.080123 0.0 0.0 \n",
- " 7 0.0 -0.288675 -0.288675 -0.288675 0.0 0.0 -1.080123 1.080123 0.0 0.0 \n",
- " 4 0.0 -0.288675 -0.288675 -0.288675 0.0 0.0 0.925820 -0.925820 0.0 0.0 \n",
- " \n",
- " [10 rows x 90 columns],\n",
- " 0 1 2 3 4 5 6 7 8 9 ... \\\n",
- " 6 -0.288675 0.0 0.0 1.946791 1.946791 1.946791 0.0 0.0 0.0 0.0 ... \n",
- " 12 -0.288675 0.0 0.0 -0.650711 -0.650711 -0.650711 0.0 0.0 0.0 0.0 ... \n",
- " 0 3.464102 0.0 0.0 -1.180770 -1.180770 -1.180770 0.0 0.0 0.0 0.0 ... \n",
- " \n",
- " 80 81 82 83 84 85 86 87 88 89 \n",
- " 6 0.0 -0.288675 -0.288675 -0.288675 0.0 0.0 0.925820 -0.925820 0.0 0.0 \n",
- " 12 0.0 -0.288675 -0.288675 3.464102 0.0 0.0 -1.080123 1.080123 0.0 0.0 \n",
- " 0 0.0 -0.288675 -0.288675 -0.288675 0.0 0.0 0.925820 -0.925820 0.0 0.0 \n",
- " \n",
- " [3 rows x 90 columns],\n",
- " 10 False\n",
- " 5 False\n",
- " 3 False\n",
- " 11 False\n",
- " 1 False\n",
- " 9 True\n",
- " 2 True\n",
- " 8 False\n",
- " 7 False\n",
- " 4 True\n",
- " Name: label, dtype: bool,\n",
- " 6 False\n",
- " 12 False\n",
- " 0 True\n",
- " Name: label, dtype: bool)"
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "d6f954db",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pandas as pd\n",
+ "\n",
+ "feature_matrix = pd.read_csv('data/feature_matrix.csv')"
]
- },
- "execution_count": 2,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "from sklearn.impute import SimpleImputer\n",
- "from sklearn.preprocessing import StandardScaler\n",
- "from zephyr_ml import Zephyr\n",
- "\n",
- "# pop the target labels\n",
- "y = list(feature_matrix.pop('label'))\n",
- "X = feature_matrix.values\n",
- "\n",
- "# impute missing values\n",
- "imputer = SimpleImputer()\n",
- "X = imputer.fit_transform(X)\n",
- "\n",
- "# normalize the data\n",
- "scaler = StandardScaler()\n",
- "X = pd.DataFrame(scaler.fit_transform(X))\n",
- "\n",
- "zephyr = Zephyr()\n",
- "zephyr.set_feature_matrix(feature_matrix=X, labels = y)\n",
- "zephyr.generate_train_test_split(test_size=0.2, random_state=33)\n",
- "\n"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "733a854b",
- "metadata": {},
- "source": [
- "## Select Model\n",
- "\n",
- "Select a model that has a `visual` block such as the `xgb_classifier` pipeline.\n",
- "\n",
- "The visual block in the pipeline json defines what are the intermediate results you want to capture and return during the fitting process. For example, in the `xgb` pipeline, we are interested to see what is the best threshold it found. In addition, we are interested to see the different scores obtained at each threshold.\n",
- "Then the block would look something like:\n",
- "\n",
- "```\n",
- "\"visual\": [\n",
- " {\n",
- " \"name\": \"threshold\",\n",
- " \"variable\": \"zephyr_ml.primitives.postprocessing.FindThreshold#1.threshold\"\n",
- " },\n",
- " {\n",
- " \"name\": \"scores\",\n",
- " \"variable\": \"zephyr_ml.primitives.postprocessing.FindThreshold#1.scores\"\n",
- " }\n",
- "]\n",
- "```\n",
- "\n",
- "Where we have a _name_ and a _variable_ defining the intermediate outputs. "
- ]
- },
- {
- "cell_type": "markdown",
- "id": "531d157d",
- "metadata": {},
- "source": [
- "## Visualize\n",
- "\n",
- "When training the pipeline using the `fit` function, you can specify `zephyr.fit_pipeline(.., visual=True)` to indicate you are interested in obtaining the intermediate outputs."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "id": "683393df",
- "metadata": {},
- "outputs": [
+ },
{
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "[GUIDE] Successfully performed fit_pipeline.\n",
- "\tYou can perform the next step by calling predict or evaluate.\n"
- ]
- }
- ],
- "source": [
- "output = zephyr.fit_pipeline(pipeline = \"xgb_classifier\", visual=True)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "id": "13221b40",
- "metadata": {},
- "outputs": [
+ "cell_type": "markdown",
+ "id": "4ba7879c",
+ "metadata": {},
+ "source": [
+ "## Prepare data\n",
+ "\n",
+ "Prepare the data for training by creating a `y` variable to hold the labels, imputing missing values, and normlizing the data. We then initialize a `Zephyr` instance, set our data, and split it into training and testing."
+ ]
+ },
{
- "data": {
- "text/plain": [
- "dict_keys(['threshold', 'scores'])"
+ "cell_type": "code",
+ "execution_count": 11,
+ "id": "23ec49dd",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/raymondpan/zephyr/Zephyr-repo/venv/lib/python3.8/site-packages/sklearn/impute/_base.py:555: UserWarning: Skipping features without any observed values: [ 1 2 6 7 9 10 15 16 17 18]. At least one non-missing value is needed for imputation with strategy='mean'.\n",
+ " warnings.warn(\n",
+ "[GUIDE] Successfully performed set_feature_matrix.\n",
+ "\tYou can perform the next step by calling generate_train_test_split.\n",
+ "[GUIDE] Successfully performed generate_train_test_split.\n",
+ "\tYou can perform the next step by calling fit_pipeline.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "( 0 1 2 3 4 5 6 7 8 9 ... \\\n",
+ " 10 -0.288675 0.0 0.0 -0.463185 -0.463185 -0.463185 0.0 0.0 0.0 0.0 ... \n",
+ " 5 -0.288675 0.0 0.0 -0.521570 -0.521570 -0.521570 0.0 0.0 0.0 0.0 ... \n",
+ " 3 -0.288675 0.0 0.0 -1.174466 -1.174466 -1.174466 0.0 0.0 0.0 0.0 ... \n",
+ " 11 -0.288675 0.0 0.0 2.064680 2.064680 2.064680 0.0 0.0 0.0 0.0 ... \n",
+ " 1 -0.288675 0.0 0.0 0.298409 0.298409 0.298409 0.0 0.0 0.0 0.0 ... \n",
+ " 9 -0.288675 0.0 0.0 0.658556 0.658556 0.658556 0.0 0.0 0.0 0.0 ... \n",
+ " 2 -0.288675 0.0 0.0 -0.527579 -0.527579 -0.527579 0.0 0.0 0.0 0.0 ... \n",
+ " 8 -0.288675 0.0 0.0 -0.650653 -0.650653 -0.650653 0.0 0.0 0.0 0.0 ... \n",
+ " 7 -0.288675 0.0 0.0 0.197664 0.197664 0.197664 0.0 0.0 0.0 0.0 ... \n",
+ " 4 -0.288675 0.0 0.0 0.002832 0.002832 0.002832 0.0 0.0 0.0 0.0 ... \n",
+ " \n",
+ " 80 81 82 83 84 85 86 87 88 89 \n",
+ " 10 0.0 3.464102 -0.288675 -0.288675 0.0 0.0 -1.080123 1.080123 0.0 0.0 \n",
+ " 5 0.0 -0.288675 -0.288675 -0.288675 0.0 0.0 0.925820 -0.925820 0.0 0.0 \n",
+ " 3 0.0 -0.288675 -0.288675 -0.288675 0.0 0.0 0.925820 -0.925820 0.0 0.0 \n",
+ " 11 0.0 -0.288675 3.464102 -0.288675 0.0 0.0 -1.080123 1.080123 0.0 0.0 \n",
+ " 1 0.0 -0.288675 -0.288675 -0.288675 0.0 0.0 0.925820 -0.925820 0.0 0.0 \n",
+ " 9 0.0 -0.288675 -0.288675 -0.288675 0.0 0.0 -1.080123 1.080123 0.0 0.0 \n",
+ " 2 0.0 -0.288675 -0.288675 -0.288675 0.0 0.0 0.925820 -0.925820 0.0 0.0 \n",
+ " 8 0.0 -0.288675 -0.288675 -0.288675 0.0 0.0 -1.080123 1.080123 0.0 0.0 \n",
+ " 7 0.0 -0.288675 -0.288675 -0.288675 0.0 0.0 -1.080123 1.080123 0.0 0.0 \n",
+ " 4 0.0 -0.288675 -0.288675 -0.288675 0.0 0.0 0.925820 -0.925820 0.0 0.0 \n",
+ " \n",
+ " [10 rows x 90 columns],\n",
+ " 0 1 2 3 4 5 6 7 8 9 ... \\\n",
+ " 6 -0.288675 0.0 0.0 1.946791 1.946791 1.946791 0.0 0.0 0.0 0.0 ... \n",
+ " 12 -0.288675 0.0 0.0 -0.650711 -0.650711 -0.650711 0.0 0.0 0.0 0.0 ... \n",
+ " 0 3.464102 0.0 0.0 -1.180770 -1.180770 -1.180770 0.0 0.0 0.0 0.0 ... \n",
+ " \n",
+ " 80 81 82 83 84 85 86 87 88 89 \n",
+ " 6 0.0 -0.288675 -0.288675 -0.288675 0.0 0.0 0.925820 -0.925820 0.0 0.0 \n",
+ " 12 0.0 -0.288675 -0.288675 3.464102 0.0 0.0 -1.080123 1.080123 0.0 0.0 \n",
+ " 0 0.0 -0.288675 -0.288675 -0.288675 0.0 0.0 0.925820 -0.925820 0.0 0.0 \n",
+ " \n",
+ " [3 rows x 90 columns],\n",
+ " 10 False\n",
+ " 5 False\n",
+ " 3 False\n",
+ " 11 False\n",
+ " 1 False\n",
+ " 9 True\n",
+ " 2 True\n",
+ " 8 False\n",
+ " 7 False\n",
+ " 4 True\n",
+ " Name: label, dtype: bool,\n",
+ " 6 False\n",
+ " 12 False\n",
+ " 0 True\n",
+ " Name: label, dtype: bool)"
+ ]
+ },
+ "execution_count": 11,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from sklearn.impute import SimpleImputer\n",
+ "from sklearn.preprocessing import StandardScaler\n",
+ "from zephyr_ml import Zephyr\n",
+ "\n",
+ "# pop the target labels\n",
+ "y = list(feature_matrix.pop('label'))\n",
+ "X = feature_matrix.values\n",
+ "\n",
+ "# impute missing values\n",
+ "imputer = SimpleImputer()\n",
+ "X = imputer.fit_transform(X)\n",
+ "\n",
+ "# normalize the data\n",
+ "scaler = StandardScaler()\n",
+ "X = pd.DataFrame(scaler.fit_transform(X))\n",
+ "\n",
+ "zephyr = Zephyr()\n",
+ "zephyr.set_feature_matrix(feature_matrix=X, labels = y)\n",
+ "zephyr.generate_train_test_split(test_size=0.2, random_state=33)\n",
+ "\n"
]
- },
- "execution_count": 4,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "output.keys()"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "d1672fc6",
- "metadata": {},
- "source": [
- "The output is a dictionary containing two values: `threshold`, and `scores`. Let's visualize these results."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "id": "c7a88d5b",
- "metadata": {},
- "outputs": [
+ },
{
- "data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjoAAAHJCAYAAACMppPqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/OQEPoAAAACXBIWXMAAA9hAAAPYQGoP6dpAABLmklEQVR4nO3de1xUdf7H8fcwA4IgAusF87LZRUlTsRQ18dpmbVlr5VYWmprXMvJG1q6VqZXl/bJ4y0s313bNtXL97VZb2d3bttWuWVZm3gAVBLkIwszvD5zRCTQG55zDjK/n4+FDOHNm+M5nRubt93ZsLpfLJQAAgCAUYnUDAAAAjELQAQAAQYugAwAAghZBBwAABC2CDgAACFoEHQAAELQIOgAAIGgRdAAAQNAi6AA1jNl7eAbLnqHB8jysRh0RbAg6wFkMHDhQLVu29PrToUMHDRo0SFu3bvX7zyspKdHTTz+tN99887wfa+DAgRo4cOA5z8nIyNCIESN04MABnx77kUceUe/evc+neT7p3bu3HnnkkbPenpeXp4cffljbt2/3HKvK8zfS+vXr1bJlS+3fv/+8H6tly5ZauHDhOc/x1/P961//qmefffYXz/vqq680cOBAtW/fXsnJyZozZ45KSkqq/HMyMjLUoUMHbdmypcJt7733nvr37682bdqoe/fuevrpp1VQUODT8wDORNABzqFVq1Z69dVX9eqrr2rNmjWaMWOGQkNDdd9992n37t1+/VlZWVl64YUXVFpa6tfHPZtPPvlEmzdv9vl+999/vxYtWmRAi6rn66+/1uuvvy6n02l1UwLe4sWLdezYsXOes2/fPg0ZMkS1atXSvHnzNHToUK1atUrTp0+v0s84dOiQhg4dquPHj1e47e2339bo0aNVu3ZtzZs3T3/4wx/02WefafDgwab9u0DwcVjdAKAmi4qKUmJiotexa665Rl26dNH69es1adIkaxpmoWbNmlndBFho+fLlioyMVHp6usLCwtSjRw+Fh4dr2rRpGjVqlC666KJK7+d0OrVhw4Zz9hgtXLhQl156qZ5//nmFhYVJkjp06KDrrrtO69ev1x133GHIc0Jwo0cH8FFERIRq1aolm83mdfydd97RbbfdpjZt2qhr166aPn26CgsLPbefOHFCU6ZMUffu3XXllVfqhhtu0IoVKyRJ+/fv17XXXitJevTRR885NFRcXKw//elPuuGGG9SmTRv16dNHy5Ytq7RH409/+pOuueYatW/fXvfff7/27dsnqXxo5dFHH5UkXXvttZ6hoRMnTmj27Nnq06ePrrzySl111VUaMmSIvv76a89j/nzoqnfv3lqwYIGeffZZXXPNNWrbtq3uu+8+/fjjj15t2b59u1JSUtSuXTslJSVp0qRJys7O9jpn165dGjJkiNq3b69evXrpjTfeOGsdJGnLli0aNGiQJGnQoEFewzcul0vLly9Xz5491bZtW91555368ssvPbcvXLhQ1113nRYtWqSkpCQlJycrNzdXUvkQzk033aQrr7xSPXv21MKFC1VWVua5b3Z2tiZMmKCuXbuqTZs2+t3vfqcNGzZUaN8XX3yhu+66S23atFHPnj31/PPPe91+/PhxPfPMM/rNb36jNm3aqG/fvlq3bt05n/PBgwc1ZswYXX311eratatWrVp1zvPddu3apTFjxqhz585q3bq1unXrpunTp+vEiROSyl/HAwcO6G9/+9s5h90++ugj9ejRwxNEJOmGG26Q0+nURx99dNaf/8033+iJJ55Qv3799Nxzz1V6zg8//KDk5GSvx65Xr54uueQSvf/++1V6nsDP0aMDnIPL5fJ0mbtcLh07dkwvvPCCSkpKdPvtt3vOe/PNNzVx4kTdfPPNGjt2rA4cOKC5c+fqu+++06pVq2Sz2fT000/ro48+0qRJk1SvXj198MEHeu655xQTE6Obb75ZixYt0pgxYzR69Gj16dPnrO0ZNWqU/vOf/2jMmDFKSEjQli1bNG/ePO3bt0/Tpk3znLtjxw4dPXpUjz/+uMrKyjR79mwNGjRIb775pnr27KnRo0dr8eLFWrRokVq2bClJnrku48ePV7NmzbR3717Nnz9fEyZM0N///vcK4c7txRdf1NVXX61nnnlGubm5euqppzRp0iS9+uqrkqRt27ZpyJAh6ty5s+bNm6fc3FzNnz9fgwYN0rp16xQeHq7MzEylpKTo4osv1syZM5Wfn69Zs2bp6NGjZ319Wrdurccff1xTp07V448/rk6dOnk9/5KSEj322GMqLS3VjBkzNHr0aG3evFkOR/mvvoMHD2rz5s2aO3eujh07prp162rp0qWaO3euUlJS9Oijj+rrr7/WwoULdejQIT399NOSpLS0NB09elRPPvmkoqKi9Prrr2vS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R1VQUOAZzq2uLVu2qKSkRN26dfP0WpWWlurbb7/Vrbfeel6PjQsXq66Aavjyyy9lt9vVtGlTXXLJJfrVr36l/fv3q02bNp4/DRs21OzZs7Vz506dOHFC119/vVauXClJuuiii3TPPffopptu8ky+/HkvTWWSkpJUWlqqf/zjH17H3auTrr76as+xHTt2ePXwfPHFFzpw4IBnsqy7h8Ptv//9r4qLizVixAg1a9bMMwzhDjnV3TE3KipKrVq10g8//OBVn8svv1wLFy70TEzt3LmzPv/8c2VmZnru+91333lWip1NVepWVe3atVNoaKgyMzO92upwODRnzhzt379fBw4cUI8ePTyvwSWXXKLhw4frmmuuqTCR9lw6duyoAwcO6PPPP/c6/sYbbyg0NFRt27atcJ/OnTtr//79+uqrrzzHsrOz9Z///OecP2vHjh267LLLdPvtt3tCTmZmpr799luvHq6fvycq07VrV73//vteQ5n//Oc/ZbfbvSZiV8c///lPPfbYYzp58qTn2Guvvaa8vDzPfCjAV/ToAOeQn5/v9SFSUlKid999V6+99pruvPNOz3yScePG6fHHH5fdblevXr2Ul5en9PR0ZWZmqnXr1goPD1fr1q21aNEihYaGqmXLltqzZ4/+9re/6frrr5ckzwfQp59+qksvvVTt2rWr0J7u3burU6dOmjx5sjIzM5WQkKCtW7dq+fLluvXWW73mbjidTo0YMUKjRo1STk6OZs+erRYtWuiWW26RdLr34u2331b37t3VunVrORwOzZw5U0OHDlVJSYnWr1/vWdZ75lJ5X40fP14jRozQhAkTdMstt6isrEwrV67UF198ofvvv1+SdO+992rdunW67777PHM15s6dq9DQ0HM+trtu77//vurWrVvlYcDKxMbGatiwYZo/f77y8/PVqVMnZWZmav78+bLZbEpISFCdOnUUHx+v6dOnKz8/X82aNdN///tfbd68WSNHjqzyz7rtttu0Zs0aPfDAA0pNTVWTJk08760xY8Z4Xp8z/e53v9OLL76oMWPGaNy4cYqKitLixYt/ce5M27ZtlZ6ermXLlikxMVF79+7V0qVLVVJSoqKiIs950dHR2rlzp7Zu3aq2bdsqPDy8wmMNGzZMf//73zVs2DANGTJEP/74o+bMmaM77rjDM5+qpKREO3fuVHx8vNc8sV9y11136S9/+YseeeQR9e/fX7t27dLs2bN14403VtpbClQFQQc4h507d+rOO+/0fF+rVi01a9ZM48aN03333ec5/vvf/16RkZF6/vnn9eqrr6p27dq66qqrNGvWLDVt2lSSNHXqVM2bN08rV67U4cOH9atf/Ur9+/fXQw89JKm852PIkCF69dVXtXnzZn388ccVPuRtNpuWLl2qBQsWaPXq1crOzlaTJk00fvx4DRkyxOvc3/zmN7rooouUlpam0tJS9erVS3/84x898zI6deqka665RrNnz9ann36qZcuWafbs2Vq0aJFGjx6tunXrKjExUS+99JIGDhyo7du3e5ah+yo5OVkrVqzQokWLlJqaqtDQULVu3VqrVq3yTKSNjY3Vn//8Zz311FN65JFHFBkZqWHDhmnTpk3nfOzLL79cffv29Qyxbdy4sVptdBs7dqzq16+vNWvW6Pnnn1fdunXVpUsXjR8/3hOqFi1apDlz5mj+/PnKyclRo0aNNGbMmLPO7alMRESEXnrpJc2ePdsTrC655BI99dRTZx1SCgsL0wsvvKCnn35aTz31lGw2m+644w41bdr0nMvwR44cqZycHL344ov605/+pEaNGul3v/ud5/2Ul5en6OhoDR06VE8//bTuu+8+rVq1ymsytdull16qlStX6rnnnlNqaqpiY2M1ePBgpaames7JysrSnXfeqTFjxujBBx+sck1atGihpUuXavbs2Ro1apTq1aunUaNG+RQggZ+zubiCGwAACFLM0QEAAEGLoAMAAIIWQQcAAAQtgg4AAAhaBB0AABC0CDoAACBoEXQAAEDQYsNAlW9t73Qas51QSIjNsMe+IDmdsu/7SZJU1rSZdMaW9dTaPNTaPNTaPNTaPP6odUiIzXOpmnMh6EhyOl3Kzq54Nd7z5XCEKDY2Unl5hSotPfcW7aiiggLVP3XhwOw9h6RTV56m1uah1uah1uah1ubxV63j4iJlt/9y0GHoCgAABC2CDgAACFoEHQAAELQIOgAAIGgRdAAAQNAi6AAAgKBF0AEAAEGLoAMAAIIWQQcAAAQtgg4AAAhaBB0AABC0CDoAACBoEXQAAEDQ4urlCFhz3vteJeERkiSbzaZatRwqLi6Vy+WyuGWVc4TY1D/xIl0cV9vqpgDABYOgg4ByZojZ8FWGisLCLWyN744VndT0m66wuhkAcMEg6CCgFJ4s83w9OKmJympHSpJCQmyKCA9T0YkSOZ01r0fnu8MFenf3ER0rOml1UwDggkLQQUDJKTypi099PbTzr6XI8qDjcIQoNjZSOTkFKi11Wta+s3l/9xG9u/uICkvKfvlkAIDfMBkZASW7MDB7RGqH2SVJBQQdADAVQQcBJSdAh34iTwUdenQAwFwEHQSUnIISq5tQLbXDykeJz5xjBAAwHkEHASVQJ/OeOXRVU5e/A0AwIuggoATqHB330FWZ06WSMoIOAJiFoIOAEqhzdCJC7Z6vC0tKLWwJAFxYCDoIKDmFgTlHxx5iU7ij/J8bK68AwDwEHQSUQO3RkU7P02HlFQCYh6CDgJIToHN0JJaYA4AVCDoIGMWlTuUXB25IcC8xL2CJOQCYhqCDgBGo83PcGLoCAPMRdBAwAnVpudvpoStWXQGAWQg6CBiBPD9HkmqHcr0rADAbQQcB42iQDF0RdADAPAQdBIzsAL3OlRtzdADAfAQdBIxA3kNHYnk5AFiBoIOAcTTge3ROLS9nMjIAmIagg4AR8JOR6dEBANMRdBAwAn55+alVV4VsGAgApiHoIGBkB8mqK3p0AMA8BB0EhDKnS8cCfDIyy8sBwHyWBx2n06kFCxaoW7duSkxM1PDhw7Vv376znv/GG2+oZcuWFf7s37/fxFbDbLknTsrpsroV54dVVwBgPofVDUhPT9eaNWs0Y8YMxcfHa+bMmRo2bJjefPNNhYWFVTj/m2++UVJSkubMmeN1PC4uzqwmwwLu+Tl1wy1/y1abe9UVQQcAzGNpj05JSYlWrlyp1NRU9ezZUwkJCZo7d64yMjL01ltvVXqfb7/9Vi1btlT9+vW9/tjtdpNbDzO5NwuMjQy1uCXV55mjc7JMTleAd08BQICw9L/Hu3btUkFBgbp06eI5Fh0drVatWmnbtm3q27dvhft888036t27t9/b4nD4P/PZ7SFef6P6covL956Jq326l8/hCJEc3jWuybWuG3E6pJ10uhRZKzDDeSDUOlhQa/NQa/OYXWtLg05GRoYkqVGjRl7HGzRo4LntTLm5ucrMzNT27du1Zs0a5eTkqG3btkpLS1Pz5s2r3Y6QEJtiYyOrff9fEh0dYdhjXyiKXDZJUsO6p2sZGxspRXq/bjW51jEul0JsktMlhdaupdjocKubdF5qcq2DDbU2D7U2j1m1tjToFBUVSVKFuTi1atVSbm5uhfN3794tSXK5XHrmmWd04sQJLV68WHfffbfefPNN1atXr1rtcDpdyssrrNZ9z8VuD1F0dITy8opUVub0++NfSA4cyZckRYae/h9ATk6BdGrFeaDUunaoXfklZTqYdVxhZYE5VydQah0MqLV5qLV5/FXr6OiIKvUKWRp0wsPL/0dbUlLi+VqSiouLFRFRMel16NBBn376qWJjY2Wzlf8Pf9GiRerZs6fWr1+vESNGVLstpaXGvbHLypyGPv6F4Eh+sSQp9ozJyKWlTulnda3pta4dVh508opO1uh2VkVNr3UwodbmodbmMavWlg5GuoessrKyvI5nZWWpYcOGld4nLi7OE3IkKSIiQk2aNFFmZqZxDYXl3KuuYiICdzKyxKaBAGA2S4NOQkKCoqKitGXLFs+xvLw87dy5Ux07dqxw/quvvqpOnTqpsPD0MFN+fr5+/PFHXXbZZaa0GdZwB53Y2hW3HAgkpy/sSdABADNYGnTCwsKUkpKiWbNm6V//+pd27dqlcePGKT4+Xn369FFZWZkOHz6sEydOSJK6d+8up9Ophx9+WLt379ZXX32lBx98UHFxcbrtttusfCowmGd5ee0g6dE5yRXMAcAMlq+jS01NVf/+/TV58mQNGDBAdrtdK1asUGhoqA4dOqTk5GRt2rRJUvlQ1+rVq1VYWKgBAwZo8ODBqlOnjl588UXVqlXL4mcCo7hcLuWcuvxDXO3A3TBQkqIYugIAU1n+qWG325WWlqa0tLQKtzVp0kTffPON17HWrVtr5cqVZjUPNUBBSZmKT01YC/yhK4IOAJjJ8h4d4JfknJqfExEaonBHYG6y51Y7lAt7AoCZCDqo8bILy+fnxAV4b47E9a4AwGwEHdR47hVXcQE+EVniCuYAYDaCDmq84OrRYegKAMxE0EGNl13g3kMn8Ht0WF4OAOYi6KDG8/ToRAZ+jw5DVwBgLoIOajz3HJ1fBVGPDkNXAGAOgg5qvJxC967Igd+j415eTo8OAJiDoIMa72hQrbpieTkAmImggxovxxN0gqBHxzMZmaADAGYg6KBGKyl16nhx+QqlYOjRcQed4lKnSp0ui1sDAMGPoIMazb3iyh5iU51wyy/Ndt7cq64kqbCEJeYAYDSCDmq001ctD1WIzWZxa85fqD1Eofby58E8HQAwHkEHNZp7s8BgmJ/jxoU9AcA8BB3UaNmepeWBPz/HjU0DAcA8gT/poYb6OvO4ntj0jQpOlsnpcknMO62WolOrk4Jhs0C38iuYFxN0AMAEBB2DHMw9oT3ZhVY3I2i0io+2ugl+49kdmSXmAGA4go5Brm1RX38fFS1bWJjyjheprNRpdZMCVkSoXU1jI6xuht949tJh1RUAGI6gY6CL6kYoNjZSOTl2lRJ0cApzdADAPExGBkzGqisAMA9BBzBZbXp0AMA0BB3AZAxdAYB5CDqAyWqfuoI5q64AwHgEHcBkDF0BgHkIOoDJIlleDgCmIegAJnOvuqJHBwCMR9ABTObZGZmgAwCGI+gAJmPVFQCYh6ADmMy96qqQVVcAYDiCDmCyM4euXC4uaw8ARiLoACZzD12VOV0qKSPoAICRCDqAySJOrbqSWGIOAEYj6AAms4fYFO4o/6fHyisAMBZBB7AAuyMDgDkIOoAFWGIOAOYg6AAW4MKeAGAOgg5gAYauAMAcBB3AAlzYEwDMQdABLOC+sCerrgDAWAQdwAIMXQGAOQg6gAUIOgBgDoIOYAHPHB1WXQGAoQg6gAU8y8vp0QEAQxF0AAswdAUA5iDoABaIDGV5OQCYgaADWMDdo8PQFQAYi6ADWIChKwAwB0EHsACrrgDAHAQdwALuVVf06ACAsSwPOk6nUwsWLFC3bt2UmJio4cOHa9++fVW67xtvvKGWLVtq//79BrcS8K8zh65cLpfFrQGA4GV50ElPT9eaNWs0bdo0rV27Vk6nU8OGDVNJSck573fgwAFNnTrVpFYC/uUeunJJKjrptLYxABDELA06JSUlWrlypVJTU9WzZ08lJCRo7ty5ysjI0FtvvXXW+zmdTqWlpal169Ymthbwn3BHiEJs5V+zxBwAjGNp0Nm1a5cKCgrUpUsXz7Ho6Gi1atVK27ZtO+v9lixZopMnT2rkyJFmNBPwO5vNpgiuYA4AhnNY+cMzMjIkSY0aNfI63qBBA89tP/fll19q5cqVWrdunTIzM/3WFofD/5nPbg/x+ht+cMbr5HCEeL4PxFpHhtlVUFKm/qu2y2Z1Y3xlU/m429lutkl3XtVYD//mctOaFIwC8X0dqKi1ecyutaVBp6ioSJIUFhbmdbxWrVrKzc2tcH5hYaEmTpyoiRMn6uKLL/Zb0AkJsSk2NtIvj1WZ6OgIwx77gnPGWyU2NlKK9H7dAqnWyZfX1/rPD0g6Z2aomX6hwS6X9N7uo3rm94mmNCfYBdL7OtBRa/OYVWtLg054eLik8rk67q8lqbi4WBERFQswffp0NW/eXHfddZdf2+F0upSXV+jXx5TK02p0dITy8opUVsaEU78oKFDsqS9zcgqkU3PWA7HWk6+7TA90/XXAhRx7SIii6oQr//gJlTkr1nrP0QIN//MXKiktK3+NUG2B+L4OVNTaPP6qdXR0RJV6hSwNOu4hq6ysLDVr1sxzPCsrSy1btqxw/muvvaawsDC1b99eklRWVj63oW/fvho1apRGjRpV7baUlhr3xi4rcxr6+BeUM+pYWur0+l4KvFpH17L0n2C1OBwhiq1TS47S0kprXbdWqCSp1OkKqNeiJgu093Ugo9bmMavWlv6WTUhIUFRUlLZs2eIJOnl5edq5c6dSUlIqnP/zlVhffPGF0tLStGzZMrVo0cKUNgM4N8ep5WRlzkDrqwIQjCwNOmFhYUpJSdGsWbMUFxenxo0ba+bMmYqPj1efPn1UVlam7Oxs1alTR+Hh4fr1r3/tdX/3hOWLLrpIMTExFjwDAD9nPxV0Sgk6AGoAy6eXp6amqn///po8ebIGDBggu92uFStWKDQ0VIcOHVJycrI2bdpkdTMBVJG7R6eUeQ4AagDLJwjY7XalpaUpLS2twm1NmjTRN998c9b7durU6Zy3AzCfw35q6MoluVwu2WwBt3geQBCxvEcHQHCxnxFsmKcDwGoEHQB+5e7RkZinA8B6BB0AfuUIOf1rhaADwGoEHQB+5Z6MLBF0AFiPoAPAr87IOQQdAJYj6ADwK5vNxhJzADUGQQeA3znYNBBADUHQAeB3nr10CDoALEbQAeB37r106NEBYDWCDgC/c9jLf7UQdABYjaADwO+YowOgpiDoAPA7d9Bhjg4AqxF0APid3dOjw/JyANYi6ADwu9P76NCjA8BaBB0AfucZunIRdABYi6ADwO/s9OgAqCEIOgD8zn0Fc1ZdAbAaQQeA37l3RiboALAaQQeA37G8HEBNQdAB4HcsLwdQUxB0APgdy8sB1BQEHQB+xyUgANQUBB0AfudedcUcHQBWI+gA8LtTFy+nRweA5Qg6APzOYWcfHQA1A0EHgN+xvBxATUHQAeB3DpaXA6ghCDoA/I5VVwBqCoIOAL/jop4AagqCDgC/8ywvdxF0AFiLoAPA7xzu5eX06ACwGEEHgN+5e3SYowPAagQdAH7nsLPqCkDNQNAB4HfsowOgpiDoAPA7O8vLAdQQBB0Afsc+OgBqCoIOAL9zsI8OgBqCoAPA79hHB0BNQdAB4HfsjAygpiDoAPA7LuoJoKYg6ADwO/c+OiwvB2A1gg4Av7PbWHUFoGYg6ADwu9M7IxN0AFiLoAPA79hHB0BN4ajuHXNzc7V9+3ZlZWXp+uuv17Fjx9S8eXPZTnVZA7hwcVFPADVFtYLO4sWLtXTpUp04cUI2m01t27bVvHnzlJOTo5UrVyo6Otrf7QQQQOxc6wpADeHz0NXLL7+shQsXasiQIfrLX/4i16kNwVJSUrRv3z7Nnz/f740EEFhO74zM8nIA1vI56Lz00ksaMWKEHnroIbVu3dpzvEePHho7dqzeffddvzYQQOBhMjKAmsLnoHPw4EElJSVVetsll1yiI0eOnHejAAQ2JiMDqCl8DjqNGjXS559/Xult//3vf9WoUaPzbhSAwMYcHQA1hc9Bp3///lqyZIlWrFihH3/8UZJUWFiof/7zn1q6dKluvfVWnx7P6XRqwYIF6tatmxITEzV8+HDt27fvrOf/73//07333qv27durc+fOevzxx3X8+HFfnwYAA7HqCkBN4XPQGT58uG699VbNmjVLffv2lSQNGjRIY8eOVc+ePTVy5EifHi89PV1r1qzRtGnTtHbtWjmdTg0bNkwlJSUVzj1y5IiGDBmixo0ba/369UpPT9eOHTv0yCOP+Po0ABiIoSsANUW1lpdPnTpVQ4cO1WeffaZjx46pTp066tixo1q0aOHT45SUlGjlypWaOHGievbsKUmaO3euunXrprfeessTpNwOHDig5ORkTZ06VQ6HQ82bN9cdd9yhuXPnVudpADCInaADoIbwOejcfPPNmjBhgnr16qWLL774vH74rl27VFBQoC5duniORUdHq1WrVtq2bVuFoNOuXTvNmTPH8/3333+v119/XV27dj2vdgDwL8cZc3RcLhcbiQKwjM9B59ChQ4qIiPDLD8/IyJCkChOYGzRo4LntbK6//nr9+OOPaty4sRYtWnTebXE4/H81DLs9xOtv+MEZr5PDEeL5nlqbpyq1Dg+zn/4mxCYHr0u18L42D7U2j9m1rlaPzurVq3XJJZeoQYMG5/XDi4qKJElhYWFex2vVqqXc3Nxz3nfWrFkqKirSzJkzNWjQIL3++uuKjIysVjtCQmyKja3efasiOto/wRCSznirxMZGSj97zam1ec5V69DapafPq1tb4aH2s56LX8b72jzU2jxm1drnoPPjjz9q+/bt6tGjh2JiYlS7dm2v2202m955550qPVZ4eLik8rk67q8lqbi4+Bd7jdq0aSNJWrRokXr06KG3335b/fr18+GZnOZ0upSXV1it+56L3R6i6OgI5eUVqYwdYv2joECxp77MySmQTs1Zp9bmqUqtT5ws83x9+Gi+ompV+7J6FzTe1+ah1ubxV62joyOq1Cvk82+fRo0a6eabb65Woyp7LEnKyspSs2bNPMezsrLUsmXLCuf/8MMP+umnnzwTlyWpYcOGiomJUWZm5nm1pbTUuDd2WZnT0Me/oJxRx9JSp9f3ErU20zlrfcYc5BMlZQpnOOC88L42D7U2j1m19jnoPPPMM3774QkJCYqKitKWLVs8QScvL087d+5USkpKhfM/+eQTPffcc/roo488Fw796aeflJOTo0svvdRv7QJwfuxnzD1m5RUAK1W7P/mDDz7Q1q1blZeXp9jYWHXo0EHdunXz6THCwsKUkpKiWbNmKS4uTo0bN9bMmTMVHx+vPn36qKysTNnZ2apTp47Cw8PVt29fLVu2TGlpaZo4caJyc3M1ffp0tW3bVr169aruUwHgZzabTY4Qm0qdLnZHBmApn4NOSUmJ7r//fn300Uey2+2KjY1VTk6Oli1bps6dO2vp0qUVJhefS2pqqkpLSzV58mSdOHFCHTt21IoVKxQaGqr9+/fr2muv1TPPPKPbbrtNMTExeuGFFzRjxgwNGDBAdrtd1157rR555BHZ7Ux2BGoS+6mgU+pkGACAdXwOOgsXLtSOHTv03HPP6aabbpLdbldpaak2btyoJ598UosXL9ZDDz1U5cez2+1KS0tTWlpahduaNGmib775xutY8+bNtXTpUl+bDcBkjhCbiiWVltGjA8A6Ps8Q3Lhxo8aMGaNbbrnF04vicDjUr18/jRkzRm+++abfGwkg8HAZCAA1gc9BJzs7W61atar0tlatWp336icAwcG9SSBzdABYyeeg06xZM+3YsaPS27Zt21Zhl2MAFyb3yit6dABYyec5OnfddZdmzJih8PBw3XTTTapXr56OHDmijRs3avny5RozZowR7QQQYNw9OgQd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nRo2bJhKSkoqPT81NVV79+7V6tWrNX/+fG3evFlTpkwxt9EBypda5+TkaMiQIQoPD9dLL72k5cuXKzs7W8OGDVNxcbEFrQ8svr6v3Q4cOKCpU6ea1Mrg4Gutp0yZovXr1+vpp5/Wa6+9pri4OA0fPlzHjx83ueWBx9dajx07VgcPHtSqVau0atUqHTx4UA888IDJrQ5sr7zyiubNm/eL5xn+2ehCtRQXF7vat2/veuWVVzzHcnNzXW3btnW9+eabFc7/97//7WrRooXru+++8xz78MMPXS1btnRlZGSY0uZA5Wut//KXv7jat2/vKioq8hw7ePCgq0WLFq5PPvnElDYHKl9r7VZWVuYaMGCAa9CgQa4WLVq49u3bZ0ZzA5qvtf7pp59cLVu2dL333nte5/fq1Yv39S/wtda5ubmuFi1auP71r395jr3zzjuuFi1auHJycsxockDLyMhwjRw50pWYmOi64YYbXCkpKWc914zPRnp0qmnXrl0qKChQly5dPMeio6PVqlUrbdu2rcL527dvV/369XXppZd6jiUlJclms2nHjh2mtDlQ+VrrLl26KD09XeHh4Z5jISHlb/W8vDzjGxzAfK2125IlS3Ty5EmNHDnSjGYGBV9r/fHHH6tOnTrq3r271/nvvvuu12OgIl9rHR4ersjISG3YsEH5+fnKz8/X66+/rubNmys6OtrMpgek//3vfwoNDdUbb7yhdu3anfNcMz4bHX55lAtQRkaGJKlRo0Zexxs0aOC57UyZmZkVzg0LC1NMTIwOHTpkXEODgK+1btKkiZo0aeJ1bNmyZQoPD1fHjh2Na2gQ8LXWkvTll19q5cqVWrduHXMYfOBrrffs2aOmTZvqrbfe0rJly5SZmalWrVrpkUce8fqQQEW+1josLEwzZszQ448/rg4dOshms6lBgwZ6+eWXPf9pwtn17t1bvXv3rtK5Znw28opVk3uiVFhYmNfxWrVqVToPpKioqMK55zofp/la65976aWX9PLLL2vixImKi4szpI3BwtdaFxYWauLEiZo4caIuvvhiM5oYNHytdX5+vvbu3av09HSNHz9eixcvlsPh0N13362jR4+a0uZA5WutXS6Xvv76a7Vv316vvPKKXnjhBV100UW6//77lZ+fb0qbLxRmfDYSdKrJPSzy84lsxcXFioiIqPT8yia9FRcXq3bt2sY0Mkj4Wms3l8ulefPmafr06Ro9evQvzvyH77WePn26mjdvrrvuusuU9gUTX2vtcDiUn5+vuXPnKjk5WW3bttXcuXMlSX/729+Mb3AA87XW//d//6eXX35ZM2fO1NVXX62kpCQtWbJEBw4c0Lp160xp84XCjM9Ggk41ubvasrKyvI5nZWWpYcOGFc6Pj4+vcG5JSYmOHTumBg0aGNfQIOBrraXyZbhpaWlasmSJHn30UY0dO9boZgYFX2v92muv6ZNPPlH79u3Vvn17DR8+XJLUt29fLVmyxPgGB7Dq/A5xOBxew1Th4eFq2rQpy/l/ga+13r59u5o3b66oqCjPsbp166p58+bau3evsY29wJjx2UjQqaaEhARFRUVpy5YtnmN5eXnauXNnpfNAOnbsqIyMDK9/JFu3bpUkXX311cY3OID5WmtJevjhh/WPf/xDs2fP1uDBg01qaeDztdZvvfWWNm7cqA0bNmjDhg2aPn26pPI5UfTynFt1foeUlpbqq6++8hw7ceKE9u3bp1//+temtDlQ+Vrr+Ph47d2712vopLCwUPv372eI1s/M+GxkMnI1hYWFKSUlRbNmzVJcXJwaN26smTNnKj4+Xn369FFZWZmys7NVp04dhYeHq127drrqqqs0btw4TZkyRYWFhXr88cfVr1+/s/ZKoJyvtV6/fr02bdqkhx9+WElJSTp8+LDnsdznoHK+1vrnH7DuiZ0XXXSRYmJiLHgGgcPXWnfo0EHXXHONJk2apKlTpyomJkYLFiyQ3W7X7373O6ufTo3ma6379eunFStWaOzYsXrooYckSfPmzVOtWrV02223WfxsApsln41+WaR+gSotLXU999xzrs6dO7sSExNdw4cP9+wfsm/fPleLFi1cr732muf8I0eOuB588EFXYmKiq1OnTq4nnnjCdeLECauaH1B8qfWQIUNcLVq0qPTPma8HKufr+/pMn332Gfvo+MDXWh8/ftz1xBNPuDp16uRq166da8iQIa7du3db1fyA4mutv/vuO9fIkSNdSUlJrs6dO7vGjBnD+7oaJk2a5LWPjhWfjTaXy+XyT2QCAACoWZijAwAAghZBBwAABC2CDgAACFoEHQAAELQIOgAAIGgRdAAAQNAi6AAAgKBF0AFgKLbqAmAlgg4Aw/zrX//SpEmTJElbtmxRy5Ytva43ZLbevXvrkUceOe/HWbhwoVq2bHnOc2rC8wXAta4AGGj16tVWNwHABY4eHQAAELQIOgAMMXDgQG3dulVbt271Gub54YcfdN9996ldu3bq2rWrZs2apdLSUs/tLVu21KJFi3Tbbbepbdu2WrRokSTp4MGDGj9+vJKSktSuXTvde++92rlzp9fP3Lhxo2655Ra1bdtWnTt31sSJE5WZmel1zsmTJ/Xcc8+pa9euSkxM1NChQ7V3716vcz7++GPdfffduvrqq9WpUydNmDBBhw4dOufzXbt2ra6//nq1bdtWKSkpOnjwYLXqBsC/CDoADPHEE0+oVatWatWqlV599VXl5+dLkp555hldffXVWrJkiX77299q+fLlWrt2rdd9lyxZoptvvlkLFizQ9ddfr+zsbN1111363//+p8cee0yzZ8+W0+nUPffco++//16StGPHDj388MPq06ePli9frkcffVSfffaZJkyY4PXYmzZt0u7duzVjxgw98cQT+u9//6tx48Z5bt+wYYOGDh2qRo0aac6cOXr00Uf1+eef684779TRo0crfa4vv/yynnjiCfXo0UPp6elq166dHnvsMX+WE0A1MUcHgCEuu+wyRUVFSZISExM9k3IHDRqk+++/X5LUuXNnvfPOO/rss8+UkpLiuW+HDh00ZMgQz/dz587VsWPH9Oc//1mNGzeWJHXv3l033nij5s+frwULFmjHjh0KDw/XiBEjFBYWJkmKiYnRV199JZfLJZvNJklq2LCh0tPTFRoaKknau3evFi9erPz8fNWuXVuzZs1ScnKyZs+e7fn5V111lW688UatWLFCDz/8sNfzdLlcSk9P14033qg//OEPkqTk5GTl5+dXCHAAzEePDgBTdejQwfO1zWZT48aNlZeX53XOFVdc4fX9p59+qiuuuEINGzZUaWmpSktLFRISou7du+uTTz6RJHXs2FFFRUXq27evZs+ere3btys5OVljxozxhBxJatu2rSfkSFKTJk0kSXl5edqzZ48OHz6svn37ev38Zs2aqX379tq6dWuF5/PDDz/o6NGj6tWrl9fx3/72t76UBYBB6NEBYKqIiAiv70NCQirstVO7dm2v748dO6a9e/eqdevWlT5mUVGR2rdvr2XLlmn16tVatWqVli1bpnr16mnUqFEaOHDgWR87JKT8/3tOp1PHjh2TJNWrV6/Cz6hXr16FOUGSlJubK0mKjY31Ol6/fv1K2wrAXAQdADVenTp1lJSUVGHYyM09VNWtWzd169ZNRUVF+uyzz/Tiiy9q+vTpateundq2bfuLPycmJkaSdOTIkQq3HT58uEKYkU4HnJ/P33GHJgDWYugKgGHcvSXnKykpSXv27FHz5s3Vpk0bz5/XX39d69atk91u17PPPqvbb79dLpdLERER6tWrl2ezwqqugGrevLnq16+vjRs3eh3ft2+f/vOf/+iqq66qcJ+LL75YjRo10j/+8Q+v4++99141ny0AfyLoADBMdHS09uzZo08//bTCPBxfDB48WE6nU4MHD9amTZv06aef6rHHHtNLL72k5s2bSyqf2Py///1PjzzyiD7++GO9//77mj59umJiYtS5c+cq/ZyQkBCNHz9eH330kSZMmKDNmzdrw4YNGjJkiOrWres1QdrNZrNp4sSJeu+99zR58mR99NFHWrRokf785z9X+/kC8B+CDgDD3HPPPQoNDdXw4cN14sSJaj9Ow4YNtXbtWjVu3FhTpkzRqFGj9OWXX+qpp57S4MGDJUk9evTQrFmztHv3bo0ZM0bjx49XRESEXnzxRc+QVFXcdtttWrBggfbs2aMHHnhAM2bMUPv27bVu3bqzzrvp27ev5s6dq//85z8aPXq03nvvPU2dOrXazxeA/9hcXHEPAAAEKXp0AABA0CLoAACAoEXQAQAAQYugAwAAghZBBwAABC2CDgAACFoEHQAAELQIOgAAIGgRdAAAQNAi6AAAgKBF0AEAAEHr/wGtYmJ5hLGwVgAAAABJRU5ErkJggg==",
- "text/plain": [
- ""
+ "cell_type": "markdown",
+ "id": "733a854b",
+ "metadata": {},
+ "source": [
+ "## Select Model\n",
+ "\n",
+ "Select a model that has a `visual` block such as the `xgb_classifier` pipeline.\n",
+ "\n",
+ "The visual block in the pipeline json defines what are the intermediate results you want to capture and return during the fitting process. For example, in the `xgb` pipeline, we are interested to see what is the best threshold it found. In addition, we are interested to see the different scores obtained at each threshold.\n",
+ "Then the block would look something like:\n",
+ "\n",
+ "```\n",
+ "\"visual\": [\n",
+ " {\n",
+ " \"name\": \"threshold\",\n",
+ " \"variable\": \"zephyr_ml.primitives.postprocessing.FindThreshold#1.threshold\"\n",
+ " },\n",
+ " {\n",
+ " \"name\": \"scores\",\n",
+ " \"variable\": \"zephyr_ml.primitives.postprocessing.FindThreshold#1.scores\"\n",
+ " }\n",
+ "]\n",
+ "```\n",
+ "\n",
+ "Where we have a _name_ and a _variable_ defining the intermediate outputs. "
]
- },
- "metadata": {},
- "output_type": "display_data"
+ },
+ {
+ "cell_type": "markdown",
+ "id": "531d157d",
+ "metadata": {},
+ "source": [
+ "## Visualize\n",
+ "\n",
+ "When training the pipeline using the `fit` function, you can specify `zephyr.fit_pipeline(.., visual=True)` to indicate you are interested in obtaining the intermediate outputs."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "id": "683393df",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "output = zephyr.fit_pipeline(pipeline = \"xgb_classifier\", visual=True)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "id": "13221b40",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "dict_keys(['threshold', 'scores'])"
+ ]
+ },
+ "execution_count": 13,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "output.keys()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d1672fc6",
+ "metadata": {},
+ "source": [
+ "The output is a dictionary containing two values: `threshold`, and `scores`. Let's visualize these results."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "id": "c7a88d5b",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjoAAAHJCAYAAACMppPqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/OQEPoAAAACXBIWXMAAA9hAAAPYQGoP6dpAABLmklEQVR4nO3de1xUdf7H8fcwA4IgAusF87LZRUlTsRQ18dpmbVlr5VYWmprXMvJG1q6VqZXl/bJ4y0s313bNtXL97VZb2d3bttWuWVZm3gAVBLkIwszvD5zRCTQG55zDjK/n4+FDOHNm+M5nRubt93ZsLpfLJQAAgCAUYnUDAAAAjELQAQAAQYugAwAAghZBBwAABC2CDgAACFoEHQAAELQIOgAAIGgRdAAAQNAi6AA1jNl7eAbLnqHB8jysRh0RbAg6wFkMHDhQLVu29PrToUMHDRo0SFu3bvX7zyspKdHTTz+tN99887wfa+DAgRo4cOA5z8nIyNCIESN04MABnx77kUceUe/evc+neT7p3bu3HnnkkbPenpeXp4cffljbt2/3HKvK8zfS+vXr1bJlS+3fv/+8H6tly5ZauHDhOc/x1/P961//qmefffYXz/vqq680cOBAtW/fXsnJyZozZ45KSkqq/HMyMjLUoUMHbdmypcJt7733nvr37682bdqoe/fuevrpp1VQUODT8wDORNABzqFVq1Z69dVX9eqrr2rNmjWaMWOGQkNDdd9992n37t1+/VlZWVl64YUXVFpa6tfHPZtPPvlEmzdv9vl+999/vxYtWmRAi6rn66+/1uuvvy6n02l1UwLe4sWLdezYsXOes2/fPg0ZMkS1atXSvHnzNHToUK1atUrTp0+v0s84dOiQhg4dquPHj1e47e2339bo0aNVu3ZtzZs3T3/4wx/02WefafDgwab9u0DwcVjdAKAmi4qKUmJiotexa665Rl26dNH69es1adIkaxpmoWbNmlndBFho+fLlioyMVHp6usLCwtSjRw+Fh4dr2rRpGjVqlC666KJK7+d0OrVhw4Zz9hgtXLhQl156qZ5//nmFhYVJkjp06KDrrrtO69ev1x133GHIc0Jwo0cH8FFERIRq1aolm83mdfydd97RbbfdpjZt2qhr166aPn26CgsLPbefOHFCU6ZMUffu3XXllVfqhhtu0IoVKyRJ+/fv17XXXitJevTRR885NFRcXKw//elPuuGGG9SmTRv16dNHy5Ytq7RH409/+pOuueYatW/fXvfff7/27dsnqXxo5dFHH5UkXXvttZ6hoRMnTmj27Nnq06ePrrzySl111VUaMmSIvv76a89j/nzoqnfv3lqwYIGeffZZXXPNNWrbtq3uu+8+/fjjj15t2b59u1JSUtSuXTslJSVp0qRJys7O9jpn165dGjJkiNq3b69evXrpjTfeOGsdJGnLli0aNGiQJGnQoEFewzcul0vLly9Xz5491bZtW91555368ssvPbcvXLhQ1113nRYtWqSkpCQlJycrNzdXUvkQzk033aQrr7xSPXv21MKFC1VWVua5b3Z2tiZMmKCuXbuqTZs2+t3vfqcNGzZUaN8XX3yhu+66S23atFHPnj31/PPPe91+/PhxPfPMM/rNb36jNm3aqG/fvlq3bt05n/PBgwc1ZswYXX311eratatWrVp1zvPddu3apTFjxqhz585q3bq1unXrpunTp+vEiROSyl/HAwcO6G9/+9s5h90++ugj9ejRwxNEJOmGG26Q0+nURx99dNaf/8033+iJJ55Qv3799Nxzz1V6zg8//KDk5GSvx65Xr54uueQSvf/++1V6nsDP0aMDnIPL5fJ0mbtcLh07dkwvvPCCSkpKdPvtt3vOe/PNNzVx4kTdfPPNGjt2rA4cOKC5c+fqu+++06pVq2Sz2fT000/ro48+0qRJk1SvXj198MEHeu655xQTE6Obb75ZixYt0pgxYzR69Gj16dPnrO0ZNWqU/vOf/2jMmDFKSEjQli1bNG/ePO3bt0/Tpk3znLtjxw4dPXpUjz/+uMrKyjR79mwNGjRIb775pnr27KnRo0dr8eLFWrRokVq2bClJnrku48ePV7NmzbR3717Nnz9fEyZM0N///vcK4c7txRdf1NVXX61nnnlGubm5euqppzRp0iS9+uqrkqRt27ZpyJAh6ty5s+bNm6fc3FzNnz9fgwYN0rp16xQeHq7MzEylpKTo4osv1syZM5Wfn69Zs2bp6NGjZ319Wrdurccff1xTp07V448/rk6dOnk9/5KSEj322GMqLS3VjBkzNHr0aG3evFkOR/mvvoMHD2rz5s2aO3eujh07prp162rp0qWaO3euUlJS9Oijj+rrr7/WwoULdejQIT399NOSpLS0NB09elRPPvmkoqKi9Prrr2vS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R1VQUOAZzq2uLVu2qKSkRN26dfP0WpWWlurbb7/Vrbfeel6PjQsXq66Aavjyyy9lt9vVtGlTXXLJJfrVr36l/fv3q02bNp4/DRs21OzZs7Vz506dOHFC119/vVauXClJuuiii3TPPffopptu8ky+/HkvTWWSkpJUWlqqf/zjH17H3auTrr76as+xHTt2ePXwfPHFFzpw4IBnsqy7h8Ptv//9r4qLizVixAg1a9bMMwzhDjnV3TE3KipKrVq10g8//OBVn8svv1wLFy70TEzt3LmzPv/8c2VmZnru+91333lWip1NVepWVe3atVNoaKgyMzO92upwODRnzhzt379fBw4cUI8ePTyvwSWXXKLhw4frmmuuqTCR9lw6duyoAwcO6PPPP/c6/sYbbyg0NFRt27atcJ/OnTtr//79+uqrrzzHsrOz9Z///OecP2vHjh267LLLdPvtt3tCTmZmpr799luvHq6fvycq07VrV73//vteQ5n//Oc/ZbfbvSZiV8c///lPPfbYYzp58qTn2Guvvaa8vDzPfCjAV/ToAOeQn5/v9SFSUlKid999V6+99pruvPNOz3yScePG6fHHH5fdblevXr2Ul5en9PR0ZWZmqnXr1goPD1fr1q21aNEihYaGqmXLltqzZ4/+9re/6frrr5ckzwfQp59+qksvvVTt2rWr0J7u3burU6dOmjx5sjIzM5WQkKCtW7dq+fLluvXWW73mbjidTo0YMUKjRo1STk6OZs+erRYtWuiWW26RdLr34u2331b37t3VunVrORwOzZw5U0OHDlVJSYnWr1/vWdZ75lJ5X40fP14jRozQhAkTdMstt6isrEwrV67UF198ofvvv1+SdO+992rdunW67777PHM15s6dq9DQ0HM+trtu77//vurWrVvlYcDKxMbGatiwYZo/f77y8/PVqVMnZWZmav78+bLZbEpISFCdOnUUHx+v6dOnKz8/X82aNdN///tfbd68WSNHjqzyz7rtttu0Zs0aPfDAA0pNTVWTJk08760xY8Z4Xp8z/e53v9OLL76oMWPGaNy4cYqKitLixYt/ce5M27ZtlZ6ermXLlikxMVF79+7V0qVLVVJSoqKiIs950dHR2rlzp7Zu3aq2bdsqPDy8wmMNGzZMf//73zVs2DANGTJEP/74o+bMmaM77rjDM5+qpKREO3fuVHx8vNc8sV9y11136S9/+YseeeQR9e/fX7t27dLs2bN14403VtpbClQFQQc4h507d+rOO+/0fF+rVi01a9ZM48aN03333ec5/vvf/16RkZF6/vnn9eqrr6p27dq66qqrNGvWLDVt2lSSNHXqVM2bN08rV67U4cOH9atf/Ur9+/fXQw89JKm852PIkCF69dVXtXnzZn388ccVPuRtNpuWLl2qBQsWaPXq1crOzlaTJk00fvx4DRkyxOvc3/zmN7rooouUlpam0tJS9erVS3/84x898zI6deqka665RrNnz9ann36qZcuWafbs2Vq0aJFGjx6tunXrKjExUS+99JIGDhyo7du3e5ah+yo5OVkrVqzQokWLlJqaqtDQULVu3VqrVq3yTKSNjY3Vn//8Zz311FN65JFHFBkZqWHDhmnTpk3nfOzLL79cffv29Qyxbdy4sVptdBs7dqzq16+vNWvW6Pnnn1fdunXVpUsXjR8/3hOqFi1apDlz5mj+/PnKyclRo0aNNGbMmLPO7alMRESEXnrpJc2ePdsTrC655BI99dRTZx1SCgsL0wsvvKCnn35aTz31lGw2m+644w41bdr0nMvwR44cqZycHL344ov605/+pEaNGul3v/ud5/2Ul5en6OhoDR06VE8//bTuu+8+rVq1ymsytdull16qlStX6rnnnlNqaqpiY2M1ePBgpaames7JysrSnXfeqTFjxujBBx+sck1atGihpUuXavbs2Ro1apTq1aunUaNG+RQggZ+zubiCGwAACFLM0QEAAEGLoAMAAIIWQQcAAAQtgg4AAAhaBB0AABC0CDoAACBoEXQAAEDQYsNAlW9t73Qas51QSIjNsMe+IDmdsu/7SZJU1rSZdMaW9dTaPNTaPNTaPNTaPP6odUiIzXOpmnMh6EhyOl3Kzq54Nd7z5XCEKDY2Unl5hSotPfcW7aiiggLVP3XhwOw9h6RTV56m1uah1uah1uah1ubxV63j4iJlt/9y0GHoCgAABC2CDgAACFoEHQAAELQIOgAAIGgRdAAAQNAi6AAAgKBF0AEAAEGLoAMAAIIWQQcAAAQtgg4AAAhaBB0AABC0CDoAACBoEXQAAEDQ4urlCFhz3vteJeERkiSbzaZatRwqLi6Vy+WyuGWVc4TY1D/xIl0cV9vqpgDABYOgg4ByZojZ8FWGisLCLWyN744VndT0m66wuhkAcMEg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3nfWrFkqKirSzJkzNWjQIL3++uuKjIysVjtCQmyKja3efasiOto/wRCSznirxMZGSj97zam1ec5V69DapafPq1tb4aH2s56LX8b72jzU2jxm1drnoPPjjz9q+/bt6tGjh2JiYlS7dm2v2202m955550qPVZ4eLik8rk67q8lqbi4+Bd7jdq0aSNJWrRokXr06KG3335b/fr18+GZnOZ0upSXV1it+56L3R6i6OgI5eUVqYwdYv2joECxp77MySmQTs1Zp9bmqUqtT5ws83x9+Gi+ompV+7J6FzTe1+ah1ubxV62joyOq1Cvk82+fRo0a6eabb65Woyp7LEnKyspSs2bNPMezsrLUsmXLCuf/8MMP+umnnzwTlyWpYcOGiomJUWZm5nm1pbTUuDd2WZnT0Me/oJxRx9JSp9f3ErU20zlrfcYc5BMlZQpnOOC88L42D7U2j1m19jnoPPPMM3774QkJCYqKitKWLVs8QScvL087d+5USkpKhfM/+eQTPffcc/roo488Fw796aeflJOTo0svvdRv7QJwfuxnzD1m5RUAK1W7P/mDDz7Q1q1blZeXp9jYWHXo0EHdunXz6THCwsKUkpKiWbNmKS4uTo0bN9bMmTMVHx+vPn36qKysTNnZ2apTp47Cw8PVt29fLVu2TGlpaZo4caJyc3M1ffp0tW3bVr169aruUwHgZzabTY4Qm0qdLnZHBmApn4NOSUmJ7r//fn300Uey2+2KjY1VTk6Oli1bps6dO2vp0qUVJhefS2pqqkpLSzV58mSdOHFCHTt21IoVKxQaGqr9+/fr2muv1TPPPKPbbrtNMTExeuGFFzRjxgwNGDBAdrtd1157rR555BHZ7Ux2BGoS+6mgU+pkGACAdXwOOgsXLtSOHTv03HPP6aabbpLdbldpaak2btyoJ598UosXL9ZDDz1U5cez2+1KS0tTWlpahduaNGmib775xutY8+bNtXTpUl+bDcBkjhCbiiWVltGjA8A6Ps8Q3Lhxo8aMGaNbbrnF04vicDjUr18/jRkzRm+++abfGwkg8HAZCAA1gc9BJzs7W61atar0tlatWp336icAwcG9SSBzdABYyeeg06xZM+3YsaPS27Zt21Zhl2MAFyb3yit6dABYyec5OnfddZdmzJih8PBw3XTTTapXr56OHDmijRs3avny5RozZowR7QQQYNw9OgQd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nRo2bJhKSkoqPT81NVV79+7V6tWrNX/+fG3evFlTpkwxt9EBypda5+TkaMiQIQoPD9dLL72k5cuXKzs7W8OGDVNxcbEFrQ8svr6v3Q4cOKCpU6ea1Mrg4Gutp0yZovXr1+vpp5/Wa6+9pri4OA0fPlzHjx83ueWBx9dajx07VgcPHtSqVau0atUqHTx4UA888IDJrQ5sr7zyiubNm/eL5xn+2ehCtRQXF7vat2/veuWVVzzHcnNzXW3btnW9+eabFc7/97//7WrRooXru+++8xz78MMPXS1btnRlZGSY0uZA5Wut//KXv7jat2/vKioq8hw7ePCgq0WLFq5PPvnElDYHKl9r7VZWVuYaMGCAa9CgQa4WLVq49u3bZ0ZzA5qvtf7pp59cLVu2dL333nte5/fq1Yv39S/wtda5ubmuFi1auP71r395jr3zzjuuFi1auHJycsxockDLyMhwjRw50pWYmOi64YYbXCkpKWc914zPRnp0qmnXrl0qKChQly5dPMeio6PVqlUrbdu2rcL527dvV/369XXppZd6jiUlJclms2nHjh2mtDlQ+VrrLl26KD09XeHh4Z5jISHlb/W8vDzjGxzAfK2125IlS3Ty5EmNHDnSjGYGBV9r/fHHH6tOnTrq3r271/nvvvuu12OgIl9rHR4ersjISG3YsEH5+fnKz8/X66+/rubNmys6OtrMpgek//3vfwoNDdUbb7yhdu3anfNcMz4bHX55lAtQRkaGJKlRo0Zexxs0aOC57UyZmZkVzg0LC1NMTIwOHTpkXEODgK+1btKkiZo0aeJ1bNmyZQoPD1fHjh2Na2gQ8LXWkvTll19q5cqVWrduHXMYfOBrrffs2aOmTZvqrbfe0rJly5SZmalWrVrpkUce8fqQQEW+1josLEwzZszQ448/rg4dOshms6lBgwZ6+eWXPf9pwtn17t1bvXv3rtK5Znw28opVk3uiVFhYmNfxWrVqVToPpKioqMK55zofp/la65976aWX9PLLL2vixImKi4szpI3BwtdaFxYWauLEiZo4caIuvvhiM5oYNHytdX5+vvbu3av09HSNHz9eixcvlsPh0N13362jR4+a0uZA5WutXS6Xvv76a7Vv316vvPKKXnjhBV100UW6//77lZ+fb0qbLxRmfDYSdKrJPSzy84lsxcXFioiIqPT8yia9FRcXq3bt2sY0Mkj4Wms3l8ulefPmafr06Ro9evQvzvyH77WePn26mjdvrrvuusuU9gUTX2vtcDiUn5+vuXPnKjk5WW3bttXcuXMlSX/729+Mb3AA87XW//d//6eXX35ZM2fO1NVXX62kpCQtWbJEBw4c0Lp160xp84XCjM9Ggk41ubvasrKyvI5nZWWpYcOGFc6Pj4+vcG5JSYmOHTumBg0aGNfQIOBrraXyZbhpaWlasmSJHn30UY0dO9boZgYFX2v92muv6ZNPPlH79u3Vvn17DR8+XJLUt29fLVmyxPgGB7Dq/A5xOBxew1Th4eFq2rQpy/l/ga+13r59u5o3b66oqCjPsbp166p58+bau3evsY29wJjx2UjQqaaEhARFRUVpy5YtnmN5eXnauXNnpfNAOnbsqIyMDK9/JFu3bpUkXX311cY3OID5WmtJevjhh/WPf/xDs2fP1uDBg01qaeDztdZvvfWWNm7cqA0bNmjDhg2aPn26pPI5UfTynFt1foeUlpbqq6++8hw7ceKE9u3bp1//+temtDlQ+Vrr+Ph47d2712vopLCwUPv372eI1s/M+GxkMnI1hYWFKSUlRbNmzVJcXJwaN26smTNnKj4+Xn369FFZWZmys7NVp04dhYeHq127drrqqqs0btw4TZkyRYWFhXr88cfVr1+/s/ZKoJyvtV6/fr02bdqkhx9+WElJSTp8+LDnsdznoHK+1vrnH7DuiZ0XXXSRYmJiLHgGgcPXWnfo0EHXXHONJk2apKlTpyomJkYLFiyQ3W7X7373O6ufTo3ma6379eunFStWaOzYsXrooYckSfPmzVOtWrV02223WfxsApsln41+WaR+gSotLXU999xzrs6dO7sSExNdw4cP9+wfsm/fPleLFi1cr732muf8I0eOuB588EFXYmKiq1OnTq4nnnjCdeLECauaH1B8qfWQIUNcLVq0qPTPma8HKufr+/pMn332Gfvo+MDXWh8/ftz1xBNPuDp16uRq166da8iQIa7du3db1fyA4mutv/vuO9fIkSNdSUlJrs6dO7vGjBnD+7oaJk2a5LWPjhWfjTaXy+XyT2QCAACoWZijAwAAghZBBwAABC2CDgAACFoEHQAAELQIOgAAIGgRdAAAQNAi6AAAgKBF0AFgKLbqAmAlgg4Aw/zrX//SpEmTJElbtmxRy5Ytva43ZLbevXvrkUceOe/HWbhwoVq2bHnOc2rC8wXAta4AGGj16tVWNwHABY4eHQAAELQIOgAMMXDgQG3dulVbt271Gub54YcfdN9996ldu3bq2rWrZs2apdLSUs/tLVu21KJFi3Tbbbepbdu2WrRokSTp4MGDGj9+vJKSktSuXTvde++92rlzp9fP3Lhxo2655Ra1bdtWnTt31sSJE5WZmel1zsmTJ/Xcc8+pa9euSkxM1NChQ7V3716vcz7++GPdfffduvrqq9WpUydNmDBBhw4dOufzXbt2ra6//nq1bdtWKSkpOnjwYLXqBsC/CDoADPHEE0+oVatWatWqlV599VXl5+dLkp555hldffXVWrJkiX77299q+fLlWrt2rdd9lyxZoptvvlkLFizQ9ddfr+zsbN1111363//+p8cee0yzZ8+W0+nUPffco++//16StGPHDj388MPq06ePli9frkcffVSfffaZJkyY4PXYmzZt0u7duzVjxgw98cQT+u9//6tx48Z5bt+wYYOGDh2qRo0aac6cOXr00Uf1+eef684779TRo0crfa4vv/yynnjiCfXo0UPp6elq166dHnvsMX+WE0A1MUcHgCEuu+wyRUVFSZISExM9k3IHDRqk+++/X5LUuXNnvfPOO/rss8+UkpLiuW+HDh00ZMgQz/dz587VsWPH9Oc//1mNGzeWJHXv3l033nij5s+frwULFmjHjh0KDw/XiBEjFBYWJkmKiYnRV199JZfLJZvNJklq2LCh0tPTFRoaKknau3evFi9erPz8fNWuXVuzZs1ScnKyZs+e7fn5V111lW688UatWLFCDz/8sNfzdLlcSk9P14033qg//OEPkqTk5GTl5+dXCHAAzEePDgBTdejQwfO1zWZT48aNlZeX53XOFVdc4fX9p59+qiuuuEINGzZUaWmpSktLFRISou7du+uTTz6RJHXs2FFFRUXq27evZs+ere3btys5OVljxozxhBxJatu2rSfkSFKTJk0kSXl5edqzZ48OHz6svn37ev38Zs2aqX379tq6dWuF5/PDDz/o6NGj6tWrl9fx3/72t76UBYBB6NEBYKqIiAiv70NCQirstVO7dm2v748dO6a9e/eqdevWlT5mUVGR2rdvr2XLlmn16tVatWqVli1bpnr16mnUqFEaOHDgWR87JKT8/3tOp1PHjh2TJNWrV6/Cz6hXr16FOUGSlJubK0mKjY31Ol6/fv1K2wrAXAQdADVenTp1lJSUVGHYyM09VNWtWzd169ZNRUVF+uyzz/Tiiy9q+vTpateundq2bfuLPycmJkaSdOTIkQq3HT58uEKYkU4HnJ/P33GHJgDWYugKgGHcvSXnKykpSXv27FHz5s3Vpk0bz5/XX39d69atk91u17PPPqvbb79dLpdLERER6tWrl2ezwqqugGrevLnq16+vjRs3eh3ft2+f/vOf/+iqq66qcJ+LL75YjRo10j/+8Q+v4++99141ny0AfyLoADBMdHS09uzZo08//bTCPBxfDB48WE6nU4MHD9amTZv06aef6rHHHtNLL72k5s2bSyqf2Py///1PjzzyiD7++GO9//77mj59umJiYtS5c+cq/ZyQkBCNHz9eH330kSZMmKDNmzdrw4YNGjJkiOrWres1QdrNZrNp4sSJeu+99zR58mR99NFHWrRokf785z9X+/kC8B+CDgDD3HPPPQoNDdXw4cN14sSJaj9Ow4YNtXbtWjVu3FhTpkzRqFGj9OWXX+qpp57S4MGDJUk9evTQrFmztHv3bo0ZM0bjx49XRESEXnzxRc+QVFXcdtttWrBggfbs2aMHHnhAM2bMUPv27bVu3bqzzrvp27ev5s6dq//85z8aPXq03nvvPU2dOrXazxeA/9hcXHEPAAAEKXp0AABA0CLoAACAoEXQAQAAQYugAwAAghZBBwAABC2CDgAACFoEHQAAELQIOgAAIGgRdAAAQNAi6AAAgKBF0AEAAEHr/wGtYmJ5hLGwVgAAAABJRU5ErkJggg==",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "import matplotlib.pyplot as plt\n",
+ "import numpy as np\n",
+ "\n",
+ "scores = output['scores']\n",
+ "threshold = output['threshold']\n",
+ "\n",
+ "line = np.arange(0, 1.0, 0.01)\n",
+ "\n",
+ "%matplotlib inline\n",
+ "plt.plot(line, scores)\n",
+ "plt.axvline(threshold, color='r')\n",
+ "plt.ylabel(\"f1 score\")\n",
+ "plt.xlabel(\"threshold\")\n",
+ "plt.title(f\"Best obtained threshold at {threshold}\")\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "aa0b487c",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "venv",
+ "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.0"
}
- ],
- "source": [
- "import matplotlib.pyplot as plt\n",
- "import numpy as np\n",
- "\n",
- "scores = output['scores']\n",
- "threshold = output['threshold']\n",
- "\n",
- "line = np.arange(0, 1.0, 0.01)\n",
- "\n",
- "%matplotlib inline\n",
- "plt.plot(line, scores)\n",
- "plt.axvline(threshold, color='r')\n",
- "plt.ylabel(\"f1 score\")\n",
- "plt.xlabel(\"threshold\")\n",
- "plt.title(f\"Best obtained threshold at {threshold}\")\n",
- "plt.show()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "aa0b487c",
- "metadata": {},
- "outputs": [],
- "source": []
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "venv",
- "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.0"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 5
+ "nbformat": 4,
+ "nbformat_minor": 5
}
diff --git a/zephyr_ml/core.py b/zephyr_ml/core.py
index 8b8e0c2..aa0e9ca 100644
--- a/zephyr_ml/core.py
+++ b/zephyr_ml/core.py
@@ -107,17 +107,20 @@ def perform_producer_step(self, zephyr, method,
return res
def try_log_forward_set_method_warning(self, name, next_step):
+ if self.current_step != -1:
+ from_str = (f"Going from step {self.current_step} to "
+ f"step {next_step} by performing {name}.")
+ else:
+ from_str = (f"Performing step {next_step} with {name}.")
LOGGER.warning((f"[GUIDE] STALE WARNING: \n"
- f"\tPerforming step {next_step} from "
- f"step {self.current_step} with {name}.\n"
+ f"\t{from_str}\n"
f"\tThis is a forward step via a set method.\n"
- f"\tThe current step is {self.current_step}.\n"
f"\tAll previous steps will be considered stale."))
def try_log_backwards_set_method_warning(self, name, next_step):
LOGGER.warning((f"[GUIDE] STALE WARNING: \n"
- f"\tPerforming step {next_step} from "
- f"step {self.current_step} with {name}.\n"
+ f"\tGoing from step {self.current_step} to "
+ f"step {next_step} by performing {name}.\n"
f"\tThis is a backwards step via a set method.\n"
f"\tAll other steps will be considered stale."))
@@ -126,8 +129,8 @@ def try_log_backwards_key_method_warning(self, name, next_step):
self.get_steps_in_between(
self.current_step, next_step))
LOGGER.warning((f"[GUIDE] STALE WARNING:\n"
- f"\tPerforming step {next_step} from "
- f"step {self.current_step} via {name}.\n"
+ f"\tGoing from step {self.current_step} to "
+ f"step {next_step} by performing {name}.\n"
f"\tThis is a backwards step via a key method.\n"
f"\tThe following steps will be considered stale:\n"
f"{steps_in_between}"))