{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "564dfa7f-55ae-423a-ae59-22ac4f00364f", "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "from sklearn.model_selection import StratifiedShuffleSplit, cross_val_score, train_test_split\n", "from sklearn.ensemble import RandomForestClassifier\n", "from sklearn.preprocessing import LabelEncoder, MinMaxScaler\n", "from sklearn.metrics import classification_report, confusion_matrix\n", "import numpy as np\n", "import seaborn as sns\n", "import matplotlib.pyplot as plt\n", "import pickle\n", "import os\n", "import subprocess\n", "np.random.seed(42)" ] }, { "cell_type": "code", "execution_count": 2, "id": "b0867074-62b1-4bff-9188-0c6e73f814d0", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CSV Loaded, Dataset shape: (154, 6)\n" ] } ], "source": [ "# Load the data\n", "df = pd.read_csv(\"csv/ems_data.csv\")\n", "print(\"CSV Loaded, Dataset shape:\", df.shape)" ] }, { "cell_type": "code", "execution_count": 3, "id": "0e2ebde8-90f1-483a-a3cb-4119878459d2", "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", "
speciesemsConcentrationsoakDurationlowestTemphighestTempresult
0Cotton - TM-11.5018020.032.01
1Hemp - Lembang A0.2536025.030.00
2Cotton - TM-13.5036020.032.00
3Hyoscyamus niger - Black Henbane0.026025.028.01
4Sunflower - Helianthus annuus (BBS-1)1.0048022.025.00
.....................
149Maize - Zea mays (B73)1.2072025.030.00
150Hyoscyamus niger - Black Henbane0.096025.028.00
151Hemp - Kumamoto0.2536025.030.00
152Chinese cabbage - Brassica rapa ssp. pekinensis0.304804.020.00
153Marigold - Tagetes erecta0.0836025.030.00
\n", "

154 rows × 6 columns

\n", "
" ], "text/plain": [ " species emsConcentration \\\n", "0 Cotton - TM-1 1.50 \n", "1 Hemp - Lembang A 0.25 \n", "2 Cotton - TM-1 3.50 \n", "3 Hyoscyamus niger - Black Henbane 0.02 \n", "4 Sunflower - Helianthus annuus (BBS-1) 1.00 \n", ".. ... ... \n", "149 Maize - Zea mays (B73) 1.20 \n", "150 Hyoscyamus niger - Black Henbane 0.09 \n", "151 Hemp - Kumamoto 0.25 \n", "152 Chinese cabbage - Brassica rapa ssp. pekinensis 0.30 \n", "153 Marigold - Tagetes erecta 0.08 \n", "\n", " soakDuration lowestTemp highestTemp result \n", "0 180 20.0 32.0 1 \n", "1 360 25.0 30.0 0 \n", "2 360 20.0 32.0 0 \n", "3 60 25.0 28.0 1 \n", "4 480 22.0 25.0 0 \n", ".. ... ... ... ... \n", "149 720 25.0 30.0 0 \n", "150 60 25.0 28.0 0 \n", "151 360 25.0 30.0 0 \n", "152 480 4.0 20.0 0 \n", "153 360 25.0 30.0 0 \n", "\n", "[154 rows x 6 columns]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "code", "execution_count": 4, "id": "d9e0823c-72bc-4c8f-959a-bcbd973f2a2c", "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", "
speciessum
0Chinese cabbage - Brassica rapa ssp. pekinensis5
1Cotton - Luyanmian218
2Cotton - TM-18
3Fenugreek - Trigonella foenum-graecum4
4Fodder Barley - Hordeum vulgare25
5Hemp - Bandung A8
6Hemp - Indochina8
7Hemp - Kumamoto8
8Hemp - Lembang A8
9Hemp - Seiki Selskin8
10Hyoscyamus niger - Black Henbane10
11Jasmine - Jasminum grandiflorum4
12Maize - Zea mays (B73)4
13Marigold - Tagetes erecta9
14Marigold - Tagetes patula13
15Sesame - Tilottama9
16Sunflower - Helianthus annuus (BBS-1)6
17Watermelon - G429
\n", "
" ], "text/plain": [ " species sum\n", "0 Chinese cabbage - Brassica rapa ssp. pekinensis 5\n", "1 Cotton - Luyanmian21 8\n", "2 Cotton - TM-1 8\n", "3 Fenugreek - Trigonella foenum-graecum 4\n", "4 Fodder Barley - Hordeum vulgare 25\n", "5 Hemp - Bandung A 8\n", "6 Hemp - Indochina 8\n", "7 Hemp - Kumamoto 8\n", "8 Hemp - Lembang A 8\n", "9 Hemp - Seiki Selskin 8\n", "10 Hyoscyamus niger - Black Henbane 10\n", "11 Jasmine - Jasminum grandiflorum 4\n", "12 Maize - Zea mays (B73) 4\n", "13 Marigold - Tagetes erecta 9\n", "14 Marigold - Tagetes patula 13\n", "15 Sesame - Tilottama 9\n", "16 Sunflower - Helianthus annuus (BBS-1) 6\n", "17 Watermelon - G42 9" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.groupby('species').size().reset_index(name='sum')" ] }, { "cell_type": "code", "execution_count": 5, "id": "dd25961d-14b9-4818-bd2e-cdd090729839", "metadata": {}, "outputs": [], "source": [ "if not os.path.exists(\"pickles\"):\n", " os.makedirs(\"pickles\")" ] }, { "cell_type": "code", "execution_count": 6, "id": "ebed42cc-3fc6-49c0-9512-f1b40a878ca6", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 Cotton - TM-1\n", "1 Hemp - Lembang A\n", "2 Cotton - TM-1\n", "3 Hyoscyamus niger - Black Henbane\n", "4 Sunflower - Helianthus annuus (BBS-1)\n", " ... \n", "149 Maize - Zea mays (B73)\n", "150 Hyoscyamus niger - Black Henbane\n", "151 Hemp - Kumamoto\n", "152 Chinese cabbage - Brassica rapa ssp. pekinensis\n", "153 Marigold - Tagetes erecta\n", "Name: species, Length: 154, dtype: object" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['species']" ] }, { "cell_type": "code", "execution_count": 7, "id": "d80c362c-21c3-43ae-b3e1-699ce68fba2f", "metadata": {}, "outputs": [], "source": [ "# Label encode the species column\n", "le = LabelEncoder()\n", "df['species'] = le.fit_transform(df['species'])" ] }, { "cell_type": "code", "execution_count": 8, "id": "ef7b15fa-cbf8-4501-88d4-983c3f336555", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 2\n", "1 8\n", "2 2\n", "3 10\n", "4 16\n", " ..\n", "149 12\n", "150 10\n", "151 7\n", "152 0\n", "153 13\n", "Name: species, Length: 154, dtype: int64" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['species']" ] }, { "cell_type": "code", "execution_count": 9, "id": "6d9432cb-1b76-4257-a11a-aeda39dc9de1", "metadata": {}, "outputs": [], "source": [ "# Save label encoder\n", "with open('pickles/label_encoding.pkl', 'wb') as f:\n", " pickle.dump(le, f)" ] }, { "cell_type": "code", "execution_count": 10, "id": "23b88731-5bb4-4944-9bef-582147039330", "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", "
soakDurationlowestTemphighestTemp
018020.032.0
136025.030.0
236020.032.0
36025.028.0
448022.025.0
............
14972025.030.0
1506025.028.0
15136025.030.0
1524804.020.0
15336025.030.0
\n", "

154 rows × 3 columns

\n", "
" ], "text/plain": [ " soakDuration lowestTemp highestTemp\n", "0 180 20.0 32.0\n", "1 360 25.0 30.0\n", "2 360 20.0 32.0\n", "3 60 25.0 28.0\n", "4 480 22.0 25.0\n", ".. ... ... ...\n", "149 720 25.0 30.0\n", "150 60 25.0 28.0\n", "151 360 25.0 30.0\n", "152 480 4.0 20.0\n", "153 360 25.0 30.0\n", "\n", "[154 rows x 3 columns]" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "numerical_columns = ['soakDuration', 'lowestTemp', 'highestTemp']\n", "df[numerical_columns]" ] }, { "cell_type": "code", "execution_count": 11, "id": "998ed801-8791-46e6-86ef-8652439ea797", "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", "
soakDurationlowestTemphighestTemp
00.0605430.681.000000
10.1231730.880.857143
20.1231730.681.000000
30.0187890.880.714286
40.1649270.760.500000
............
1490.2484340.880.857143
1500.0187890.880.714286
1510.1231730.880.857143
1520.1649270.040.142857
1530.1231730.880.857143
\n", "

154 rows × 3 columns

\n", "
" ], "text/plain": [ " soakDuration lowestTemp highestTemp\n", "0 0.060543 0.68 1.000000\n", "1 0.123173 0.88 0.857143\n", "2 0.123173 0.68 1.000000\n", "3 0.018789 0.88 0.714286\n", "4 0.164927 0.76 0.500000\n", ".. ... ... ...\n", "149 0.248434 0.88 0.857143\n", "150 0.018789 0.88 0.714286\n", "151 0.123173 0.88 0.857143\n", "152 0.164927 0.04 0.142857\n", "153 0.123173 0.88 0.857143\n", "\n", "[154 rows x 3 columns]" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Scale numerical features\n", "scaler = MinMaxScaler()\n", "df[numerical_columns] = scaler.fit_transform(df[numerical_columns])\n", "df[numerical_columns]" ] }, { "cell_type": "code", "execution_count": 12, "id": "750d729d-fcb6-4ac6-b12e-c072656f53c0", "metadata": {}, "outputs": [], "source": [ "# Save scaler\n", "with open('pickles/scaler_encoding.pkl', 'wb') as f:\n", " pickle.dump(scaler, f)" ] }, { "cell_type": "code", "execution_count": 13, "id": "14bc165d-f845-45bf-bc70-19f0e8620d66", "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", "
speciesemsConcentrationsoakDurationlowestTemphighestTempresult
021.500.0605430.681.0000001
180.250.1231730.880.8571430
223.500.1231730.681.0000000
3100.020.0187890.880.7142861
4161.000.1649270.760.5000000
.....................
149121.200.2484340.880.8571430
150100.090.0187890.880.7142860
15170.250.1231730.880.8571430
15200.300.1649270.040.1428570
153130.080.1231730.880.8571430
\n", "

154 rows × 6 columns

\n", "
" ], "text/plain": [ " species emsConcentration soakDuration lowestTemp highestTemp result\n", "0 2 1.50 0.060543 0.68 1.000000 1\n", "1 8 0.25 0.123173 0.88 0.857143 0\n", "2 2 3.50 0.123173 0.68 1.000000 0\n", "3 10 0.02 0.018789 0.88 0.714286 1\n", "4 16 1.00 0.164927 0.76 0.500000 0\n", ".. ... ... ... ... ... ...\n", "149 12 1.20 0.248434 0.88 0.857143 0\n", "150 10 0.09 0.018789 0.88 0.714286 0\n", "151 7 0.25 0.123173 0.88 0.857143 0\n", "152 0 0.30 0.164927 0.04 0.142857 0\n", "153 13 0.08 0.123173 0.88 0.857143 0\n", "\n", "[154 rows x 6 columns]" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "code", "execution_count": 14, "id": "a3a563bd-e60d-46aa-9ad9-6ba0e72a82bf", "metadata": {}, "outputs": [], "source": [ "# Prepare features and target\n", "X = df[['species', 'emsConcentration', 'soakDuration', 'lowestTemp', 'highestTemp']]\n", "y = df['result']" ] }, { "cell_type": "code", "execution_count": 15, "id": "2bb98509-dce7-4e3a-8fed-c1a76287036d", "metadata": {}, "outputs": [], "source": [ "# Split the data\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)" ] }, { "cell_type": "code", "execution_count": 16, "id": "8dd3a818-c206-4993-be54-f3933c0a3276", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
RandomForestClassifier(random_state=42)
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": [ "RandomForestClassifier(random_state=42)" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Initialize and train the model\n", "rf_model = RandomForestClassifier(n_estimators=100, criterion='gini', random_state=42)\n", "rf_model.fit(X_train, y_train)" ] }, { "cell_type": "code", "execution_count": 17, "id": "c5177b39-502a-4adb-ac59-f0b78ea07759", "metadata": {}, "outputs": [], "source": [ "# Save the model\n", "with open('pickles/ems_model.pkl', 'wb') as f:\n", " pickle.dump(rf_model, f)" ] }, { "cell_type": "code", "execution_count": 18, "id": "86ca9871-2dc2-43a0-a9c9-d0fd18604209", "metadata": {}, "outputs": [], "source": [ "sss = StratifiedShuffleSplit(n_splits=10, test_size=0.3, random_state=42)\n", "scores = cross_val_score(rf_model, X, y, cv=sss)" ] }, { "cell_type": "code", "execution_count": 19, "id": "214e50eb-8a4a-44b5-98cd-0177318bf51c", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0.82978723, 0.63829787, 0.68085106, 0.70212766, 0.72340426,\n", " 0.68085106, 0.74468085, 0.74468085, 0.74468085, 0.68085106])" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "scores" ] }, { "cell_type": "code", "execution_count": 20, "id": "7089a59e-061a-48e4-913e-9962da369721", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "np.float64(0.7170212765957447)" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "scores.mean()" ] }, { "cell_type": "code", "execution_count": 21, "id": "83a91ebc-5ccf-4ac6-9ceb-dceb1d0a139b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "np.float64(0.050394550137561736)" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "scores.std()" ] }, { "cell_type": "code", "execution_count": 22, "id": "664e4879-ce66-4459-b306-874f134942d2", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Model Accuracy Score: 80.9%\n" ] } ], "source": [ "print(f\"Model Accuracy Score: {round(rf_model.score(X_test, y_test) * 100,1)}%\")" ] }, { "cell_type": "code", "execution_count": 23, "id": "314a66f8-1d8d-441b-9fcd-c876b43410b7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " precision recall f1-score support\n", "\n", " 0 0.81 0.90 0.85 29\n", " 1 0.80 0.67 0.73 18\n", "\n", " accuracy 0.81 47\n", " macro avg 0.81 0.78 0.79 47\n", "weighted avg 0.81 0.81 0.80 47\n", "\n" ] } ], "source": [ "y_pred = rf_model.predict(X_test)\n", "print(classification_report(y_test, y_pred))" ] }, { "cell_type": "code", "execution_count": 24, "id": "14162b15-6bd1-4ee4-8f32-f9186146b6d3", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoAAAAIjCAYAAACTRapjAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAN81JREFUeJzt3Xl0FGXa/vGrA6QTCEkIBJIMkLALgmwigwgBQQKKgqCAyJggLmhglAAyjLK6xEFlUwTHkUWEGXUUGFFZBAGRRUADqDNIIIACAQSTmEACJPX+4Y/+2YSlG9Lppp/v5z11znRVddVdOa96n+t56mmbZVmWAAAAYIwAbxcAAACA0kUDCAAAYBgaQAAAAMPQAAIAABiGBhAAAMAwNIAAAACGoQEEAAAwDA0gAACAYWgAAQAADEMDCOCSdu/erS5duigsLEw2m02LFy8u0evv27dPNptNc+fOLdHrXss6dOigDh06eLsMAH6MBhC4BuzZs0ePPvqoateuraCgIIWGhqpt27aaNm2aTp065dF7JyYmaufOnXr++ec1f/583XjjjR69X2lKSkqSzWZTaGjoBf+Ou3fvls1mk81m08svv+z29Q8dOqTx48crLS2tBKoFgJJT1tsFALi0jz/+WPfee6/sdrseeOABNW7cWKdPn9b69es1cuRIfffdd/r73//ukXufOnVKGzdu1NNPP60hQ4Z45B6xsbE6deqUypUr55HrX07ZsmV18uRJffTRR+rTp4/TsQULFigoKEj5+flXdO1Dhw5pwoQJiouLU7NmzVz+3ooVK67ofgDgKhpAwIdlZGSoX79+io2N1erVqxUdHe04lpycrPT0dH388cceu/+xY8ckSeHh4R67h81mU1BQkMeufzl2u11t27bVP//5z2IN4MKFC3XHHXfogw8+KJVaTp48qfLlyyswMLBU7gfAXAwBAz5s0qRJys3N1VtvveXU/J1Tt25dPfHEE47PZ8+e1bPPPqs6derIbrcrLi5Of/3rX1VQUOD0vbi4OHXv3l3r16/XTTfdpKCgINWuXVtvv/2245zx48crNjZWkjRy5EjZbDbFxcVJ+m3o9Nz//r3x48fLZrM57Vu5cqVuueUWhYeHKyQkRA0aNNBf//pXx/GLzQFcvXq12rVrpwoVKig8PFw9evTQf//73wveLz09XUlJSQoPD1dYWJgGDhyokydPXvwPe57+/fvr008/VVZWlmPfli1btHv3bvXv37/Y+SdOnNCIESPUpEkThYSEKDQ0VN26ddP27dsd56xZs0atWrWSJA0cONAxlHzuOTt06KDGjRtr27Ztat++vcqXL+/4u5w/BzAxMVFBQUHFnj8hIUGVKlXSoUOHXH5WAJBoAAGf9tFHH6l27dq6+eabXTr/oYce0tixY9WiRQtNmTJF8fHxSk1NVb9+/Yqdm56ernvuuUe33XabXnnlFVWqVElJSUn67rvvJEm9evXSlClTJEn33Xef5s+fr6lTp7pV/3fffafu3buroKBAEydO1CuvvKK77rpLX3755SW/99lnnykhIUFHjx7V+PHjlZKSog0bNqht27bat29fsfP79OmjX3/9VampqerTp4/mzp2rCRMmuFxnr169ZLPZ9OGHHzr2LVy4UNddd51atGhR7Py9e/dq8eLF6t69uyZPnqyRI0dq586dio+PdzRjDRs21MSJEyVJjzzyiObPn6/58+erffv2juscP35c3bp1U7NmzTR16lR17NjxgvVNmzZNkZGRSkxMVGFhoSTpjTfe0IoVK/Tqq68qJibG5WcFAEmSBcAnZWdnW5KsHj16uHR+WlqaJcl66KGHnPaPGDHCkmStXr3asS82NtaSZK1bt86x7+jRo5bdbreGDx/u2JeRkWFJsl566SWnayYmJlqxsbHFahg3bpz1+3+tTJkyxZJkHTt27KJ1n7vHnDlzHPuaNWtmVa1a1Tp+/Lhj3/bt262AgADrgQceKHa/Bx980Omad999t1W5cuWL3vP3z1GhQgXLsizrnnvusTp16mRZlmUVFhZaUVFR1oQJEy74N8jPz7cKCwuLPYfdbrcmTpzo2Ldly5Ziz3ZOfHy8JcmaNWvWBY/Fx8c77Vu+fLklyXruueesvXv3WiEhIVbPnj0v+4wAcCEkgICPysnJkSRVrFjRpfM/+eQTSVJKSorT/uHDh0tSsbmCjRo1Urt27RyfIyMj1aBBA+3du/eKaz7fubmDS5YsUVFRkUvfOXz4sNLS0pSUlKSIiAjH/htuuEG33Xab4zl/b/DgwU6f27Vrp+PHjzv+hq7o37+/1qxZo8zMTK1evVqZmZkXHP6Vfps3GBDw278+CwsLdfz4ccfw9tdff+3yPe12uwYOHOjSuV26dNGjjz6qiRMnqlevXgoKCtIbb7zh8r0A4PdoAAEfFRoaKkn69ddfXTp///79CggIUN26dZ32R0VFKTw8XPv373faX7NmzWLXqFSpkn755ZcrrLi4vn37qm3btnrooYdUrVo19evXT++9994lm8FzdTZo0KDYsYYNG+rnn39WXl6e0/7zn6VSpUqS5Naz3H777apYsaLeffddLViwQK1atSr2tzynqKhIU6ZMUb169WS321WlShVFRkZqx44dys7Odvmef/jDH9x64ePll19WRESE0tLSNH36dFWtWtXl7wLA79EAAj4qNDRUMTEx+vbbb9363vkvYVxMmTJlLrjfsqwrvse5+WnnBAcHa926dfrss8/0pz/9STt27FDfvn112223FTv3alzNs5xjt9vVq1cvzZs3T4sWLbpo+idJL7zwglJSUtS+fXu98847Wr58uVauXKnrr7/e5aRT+u3v445vvvlGR48elSTt3LnTre8CwO/RAAI+rHv37tqzZ482btx42XNjY2NVVFSk3bt3O+0/cuSIsrKyHG/0loRKlSo5vTF7zvkpoyQFBASoU6dOmjx5sr7//ns9//zzWr16tT7//PMLXvtcnbt27Sp27H//+5+qVKmiChUqXN0DXET//v31zTff6Ndff73gizPn/Pvf/1bHjh311ltvqV+/furSpYs6d+5c7G/iajPuiry8PA0cOFCNGjXSI488okmTJmnLli0ldn0AZqEBBHzYU089pQoVKuihhx7SkSNHih3fs2ePpk2bJum3IUxJxd7UnTx5siTpjjvuKLG66tSpo+zsbO3YscOx7/Dhw1q0aJHTeSdOnCj23XMLIp+/NM050dHRatasmebNm+fUUH377bdasWKF4zk9oWPHjnr22Wf12muvKSoq6qLnlSlTpli6+P777+vgwYNO+841qhdqlt01atQoHThwQPPmzdPkyZMVFxenxMTEi/4dAeBSWAga8GF16tTRwoUL1bdvXzVs2NDpl0A2bNig999/X0lJSZKkpk2bKjExUX//+9+VlZWl+Ph4ffXVV5o3b5569ux50SVGrkS/fv00atQo3X333frzn/+skydPaubMmapfv77TSxATJ07UunXrdMcddyg2NlZHjx7V66+/rurVq+uWW2656PVfeukldevWTW3atNGgQYN06tQpvfrqqwoLC9P48eNL7DnOFxAQoGeeeeay53Xv3l0TJ07U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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(8, 6))\n", "cm = confusion_matrix(y_test, y_pred)\n", "sns.heatmap(cm, annot=True, fmt='d', cmap='Blues')\n", "plt.title('Confusion Matrix')\n", "plt.ylabel('True Label')\n", "plt.xlabel('Predicted Label')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 25, "id": "36cb958d-c438-44e0-a25d-dfeb22b500ee", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " Fail rate Success rate\n", "Fail rate 26 3\n", "Success rate 6 12\n" ] } ], "source": [ "confusion_df = pd.crosstab(y_test, y_pred, rownames=['Actual'], colnames=['Predicted'])\\\n", " .rename_axis(index={'Actual': 'Actual'}, columns={'Predicted': 'Predicted'})\\\n", " .set_axis(['Fail rate', 'Success rate'], axis=0)\\\n", " .set_axis(['Fail rate', 'Success rate'], axis=1)\n", "print(confusion_df)" ] }, { "cell_type": "code", "execution_count": 26, "id": "27d8e70d-9331-49b1-a51f-a06e66777e6f", "metadata": {}, "outputs": [ { "data": { "image/png": "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QTt27JC9vX2az/BWo0ePloeHh7H4+fll2BYAAAAAgEfBoEGDVL58eb344osZtilbtqxeeeUVVatWTXXq1NHMmTNVp04dTZw40Wgzd+5cWa1WFS1aVI6Ojvrwww/Vvn372468up0cGUotW7ZMrq6uNst7772Xpl2XLl0UFRUlq9Wqr7/+2hjNdKvatWvrf//7nzp06KCCBQuqRYsWev/993Xq1KkMz//rr79KksqVK3fbOr/44gtdvXpVc+bM0eOPP65GjRppypQpmjt3rk3/Xl5emjJlisqVK6cnn3xSLVu21Lp16yRJhw8f1pdffqmZM2fq6aefVsmSJdW4cWM9//zzkqQpU6YoKChI7733nsqVK6egoCDNnDlT69ev1+HDh41zBAYGatiwYSpdurQ6d+6s6tWrG+coVKiQpJthmo+Pj7Eu3Xxlb86cOQoKCjImQmvbtq2eeeYZlSpVSlWqVNHMmTMVGxurAwcO2PRXoEAB+fj4KH/+/GnuzeXLlzV16lS9//77atGihSpUqKDp06fL2dnZZhSYJL377rsKCQlRhQoV9NZbb2nLli26evVquvd80KBBunjxorHcOlIOAAAAAICczsfHJ01mkbru4+OT7jE//vijvvrqK9nb28ve3l6NGzeWJBUsWFDDhg3L8Fw1a9bUkSNHjPXHHntMGzZsUGJiov744w9t27ZN169fV8mSJbN0LTkylGrYsKFiYmJslldffTVNu5YtWyoxMVE//fSTZs6cmeEIm3fffVfx8fGaNm2aKlasqGnTpqlcuXKKjY1Nt/3djqg6ePCgKleubDOHVd26dZWSkmLzClrFihVlZ2dnrPv6+hqTrMfExMjOzk4hISHpnmPPnj1av369TUCXGpbd+krdf2fWv/Uct+Pv728TUkk3Q7n27durZMmScnd3N173O3HixB37S3X06FFdv35ddevWNbblzZtXNWvW1MGDB23a3lq7r6+vJGVYu6Ojo9zd3W0WAAAAAAByi+DgYP3000820/6sWbNGZcuWTTO1UarFixdrz549RoYyY8YMSdLGjRsVGRmZ4bliYmKMv8Nv5eLiIl9fX50/f14//PCDWrdunaVrsb9zk4ePi4uLSpUqdcd29vb26tSpk4YNG6ZffvlFS5YsybBtgQIF9Nxzz+m5557Te++9p6CgII0fP954/e9WZcqUkSQdOnRI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N/6FduDAgSpTpozy5cunkiVLasiQIbp+/bokKSoqSiNGjNCePXuM+ShS56ywWCxaunSp0X9sbKwaNWokZ2dnFShQQN27d1diYqKxPyIiQm3atNH48ePl6+urAgUKKDIy0jhXeq5du6aEhASbBQCAnCI+Pl6FCxe22Za6Hh8ff1d9bNmyRYsWLbIZWZVRvwkJCfr3338lSbVq1VJUVJRWrVqlqVOn6tixY6pfv74uXbp0L5cEAACQofsWSkk3h3z//fff97PLh46rq6tcXV21dOlSXbt2Ld02KSkpat26tf755x9t2LBBa9as0W+//abnn3/eaJOYmKgnnnhC69at0+7du9W8eXO1atUqw3+RHDdunN566y2tXr1ajRs3zlTNzs7OevXVV7V582adPn06U8eOHz9elStX1u7duzVkyBBJkpubm6KionTgwAFNnjxZ06dP18SJEyVJzz//vPr166eKFSvq5MmTOnnypM11p7p8+bLCwsLk5eWl7du366uvvtLatWuN1wxSrV+/XkePHtX69es1e/ZsRUVFpZmY9VajR4+Wh4eHsfj5+WXqegEAyMn27dun1q1ba9iwYWrWrFmmjm3RooWee+45BQYGKiwsTCtWrNCFCxf05ZdfPqBqAQDAoy5Lc0p99913NutWq1UnT57UlClTsnVOJTPY29srKipK3bp107Rp01S1alWFhITohRdeUGBgoCRp3bp1io2N1bFjx4xQZM6cOapYsaK2b9+uGjVqqHLlyqpcubLR76hRo7RkyRJ99913aYKZgQMHau7cudqwYYMqVqyYpbpTvz3n+PHj8vb2vuvjGjVqpH79+tlse/vtt42fAwIC1L9/fy1cuFADBgyQs7OzXF1d7zgnxRdffKGrV69qzpw5cnFxkSRNmTJFrVq10tixY41/zfXy8tKUKVNkZ2encuXKqWXLllq3bp26deuWbr+DBg1S3759jfWEhASCKQBAjuHj42MzslqSsX6nuZ4OHDigxo0bq3v37jb/X327ft3d3eXs7Jxuf56enipTpoyOHDmS2csAAAC4K1kKpf777WkWi0WFChVSo0aNjAk0c7O2bduqZcuW2rhxo37++WetXLlS48aN04wZMxQREaGDBw/Kz8/PJgypUKGCPD09dfDgQdWoUUOJiYkaPny4li9frpMnT+rGjRv6999/04yUmjBhgi5f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01PfffedKlSoIEdHR504cULbt29X06ZNVbBgQXl4eCgkJES7du0yjgsICJAkPf3007JYLMZ6eiPgevfurdDQ0DR19+7dWwULFlRYWJgkad++fWrRooVcXV1VuHBhderUSWfPnk339yP12hISEmwW5C7x8fE24ZIkYz2j+Z/u5hhfX19NmzZNixcv1uLFi+Xn56fQ0FCb3/GFCxdq165dGj169H27HgAAAAB4VOWYUOqvv/7SE088oRo1amjPnj2aOnWqPv/8c73zzjuSpPr16+vSpUvavXu3pJsBVsGCBW3Clg0bNhhByNGjR9W8eXO1bdtWe/fu1aJFi7Rp0yb16NFDkrRjxw716tVLI0eOVFxcnFatWqUGDRpIkiZPnqzg4GB169bNGPXk5+eXqesZPXq05syZo2nTpmn//v3q06ePXnzxRW3YsMGm3fDhwzVlyhRt2bJFf/zxh9q1a6dJkybpiy++0PLly7V69Wp99NFHNsfMnj1b9vb22rZtmyZPnqwPPvhAM2bMMPb36NFDW7du1cKFC7V3714999xzat68uX799VejzZUrVzR27FjNmDFD+/fvl7e3ty5duqTw8HBt2rRJP//8s0qXLq0nnnhCly5dknRznh1JmjVrlk6ePGms363Zs2fLwcFBmzdv1rRp03ThwgU1atRIQUFB2rFjh1atWqVTp06pXbt2t72vHh4expLZzwWPrrJly+qVV15RtWrVVKdOHc2cOVN16tTRxIkTJUl//PGH3njjDc2fP19OTk7ZXC0AAAAA5Hw5ZqLzTz75RH5+fpoyZYosFovKlSunv//+WwMHDtTQoUPl4eGhKlWqKDo6WtWrV1d0dLT69OmjESNGKDExURcvXtSRI0cUEhIi6WZ40bFjR2NeqNKlS+vDDz9USEiIpk6dqhMnTsjFxUVPPvmk3Nzc5O/vr6CgIEmSh4eHHBwclC9fPvn4+GT6Wq5du6b33ntPa9euVXBwsCSpZMmS2rRpkz799FOjRkl65513VLduXUlS165dNWjQIB09elQlS5aUJD377LNav369Bg4caBzj5+eniRMnymKxqGzZsoqNjdXEiRPVrVs3nThxQrNmzdKJEydUpEgRSVL//v21atUqzZo1y5j0+fr16/rkk09UuXJlo99GjRrZXMdnn30mT09PbdiwQU8++aQKFSokSfL09MzSfSldurTNt6i98847CgoKspmIeubMmfLz89Phw4dVpkyZNH0MGjRIffv2NdYTEhIIpnIZHx8fnTp1ymZb6npGv3c+Pj7atm1bpo6RpJo1a2rTpk2SpJ07d+r06dOqWrWqsT85OVk//fSTpkyZomvXrsnOzi7zFwQAAAAAj6gcM1Lq4MGDCg4OlsViMbbVrVtXiYmJ+vPPPyVJISEhio6OltVq1caNG/XMM8+ofPny2rRpkzZs2KAiRYqodOnSkqQ9e/YoKipKrq6uxhIWFqaUlBQdO3ZMTZs2lb+/v0qWLKlOnTpp/vz5Nq/J3YsjR47oypUratq0qc3558yZo6NHj9q0vfXbvQoXLqx8+fIZgVTqttOnT9scU7t2bZv7FBwcrF9//VXJycmKjY1VcnKyypQpY3PuDRs22JzbwcEhzTeLnTp1St26dVPp0qXl4eEhd3d3JSYm6sSJE/flvlSrVs1mfc+ePVq/fr1NneXKlZOkNPcplaOjo9zd3W0W5C7BwcH66aefdP36dWPbmjVrVLZs2QwnHg8ODlZsbKzNs7JmzRq5u7urQoUKGZ4rJiZGvr6+kqTGjRsrNjZWMTExxlK9enV17NhRMTExBFIAAAAAkEk5ZqTU3QgNDdXMmTO1Z88e5c2bV+XKlVNoaKiio6N1/vx5mxFIiYmJeuWVV9SrV680/RQvXlwODg7atWuXoqOjtXr1ag0dOlTDhw/X9u3b5enpeU91JiYmSpKWL1+uokWL2uxzdHS0Wc+bN6/xs8VisVlP3ZaZScgTExNlZ2ennTt3pvkj2tXV1fjZ2dnZJtiSpPDwcJ07d06TJ0+Wv7+/HB0dFRwcfMdJyfPkyWMzp5Ukm0AhlYuLS5paW7VqpbFjx6ZpmxoU4NHToUMHjRgxQl27dtXAgQO1b98+TZ482XjNTpKWLFmiQYMG6dChQ5KkZs2aqUKFCurUqZPGjRun+Ph4vf3224qMjDSeudQ53ipWrKirV69qxowZ+vHHH7V69WpJkpubmx5//HGbWlxcXFSgQIE02wEAAAAAd5ZjQqny5ctr8eLFslqtRliyefNmubm5qVixYpL+/7xSEydONAKo0NBQjRkzRufPn1e/fv2M/qpWraoDBw6oVKlSGZ7T3t5eTZo0UZMmTTRs2DB5enrqxx9/1DPPPCMHBwdjUvXMunXy8FuDsvvll19+sVlPnf/Jzs5OQUFBSk5O1unTp1W/fv1M9bt582Z98skneuKJJyTdnGPnv5OO582bN819KVSokPbt22ezLSYmJk3A9l9Vq1bV4sWLFRAQIHv7HPOrigfMw8NDq1evVmRkpKpVq6aCBQtq6NCh6t69u9Hm4sWLiouLM9bt7Oy0bNkyvfbaawoODpaLi4vCw8M1cuRIo01SUpL69eunv/76S/ny5VNgYKDWrl2rhg0bmnp9AAAAAPCoeOj+0r948aJiYmJsthUoUECvv/66Jk2apJ49e6pHjx6Ki4vTsGHD1LdvX+XJc/MtRC8vLwUGBmr+/PmaMmWKJKlBgwZq166drl+/bhMADRw4ULVr11aPHj308ssvy8XFRQcOHNCaNWs0ZcoULVu2TL/99psaNGggLy8vrVixQikpKSpbtqykm98098svv+j48eNydXVV/vz5jTruxM3NTf3791efPn2UkpKievXq6eLFi9q8ebPc3d0VHh5+T/fwxIkT6tu3r1555RXt2rVLH330kSZMmCBJKlOmjDp27KjOnTtrwoQJCgoK0pkzZ7Ru3ToFBgaqZcuWGfZbunRpzZ07V9WrV1dCQoLefPNNOTs727QJCAjQunXrVLduXTk6OsrLy0uNGjXS+++/rzlz5ig4OFjz5s3Tvn37jDm6MhIZGanp06erffv2GjBggPLnz68jR45o4cKFmjFjBq9LPcICAwO1cePGDPdHREQoIiLCZpu/v79WrFiR4TEDBgzQgAEDMlXHrV+kAAAAAADInIduTqno6GgFBQXZLCNGjFDRokW1YsUKbdu2TZUrV9arr76qrl276u2337Y5PiQkRMnJyca37OXPn18VKlSQj4+PEShJN/+o3bBhgw4fPqz69esrKChIQ4cONSb/9vT01DfffKNGjRqpfPnymjZtmhYsWKCKFStKujk5uJ2dnSpUqKBChQplel6lUaNGaciQIRo9erTKly+v5s2ba/ny5SpRosQ93L2bOnfurH///Vc1a9ZUZGSk3njjDZtRJLNmzVLnzp3Vr18/lS1bVm3atNH27dtVvHjx2/b7+eef6/z586patao6deqkXr16ydvb26bNhAkTtGbNGvn5+RmhU1hYmIYMGaIBAwaoRo0aunTpkjp37nzH6yhSpIg2b96s5ORkNWvWTJUqVVLv3r3l6el51wEgAAAAAAB4OFms/53sBzla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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Create and sort feature importance DataFrame\n", "feature_names = ['Species', 'EMS Concentration', 'Soak Duration', 'Lowest Temperature', 'Highest Temperature']\n", "feature_importance = pd.DataFrame({\n", " 'feature': feature_names,\n", " 'importance': rf_model.feature_importances_\n", "})\n", "feature_importance = feature_importance.sort_values('importance', ascending=False)\n", "\n", "# Create the plot\n", "plt.figure(figsize=(12, 6))\n", "ax = sns.barplot(\n", " x='importance', \n", " y='feature', \n", " hue='feature', # Add hue parameter\n", " data=feature_importance, \n", " legend=False # Hide the legend\n", ")\n", "\n", "# Add value labels on the bars\n", "for i, v in enumerate(feature_importance['importance']):\n", " # Format the value to show only 3 decimal places\n", " percentage = f'{v:.3f}'\n", " ax.text(v, i, f' {percentage}', va='center')\n", "\n", "# Customize the plot\n", "plt.title('Feature Importance', pad=20, fontsize=12, fontweight='bold')\n", "plt.xlabel('Importance Score', fontsize=10)\n", "plt.ylabel('Features', fontsize=10)\n", "\n", "# Adjust layout to prevent text cutoff\n", "plt.tight_layout()\n", "\n", "# Show the plot\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 27, "id": "e85837c0-29a2-46d0-abda-d18e735f22d0", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Feature Importance Scores:\n", " feature importance\n", " EMS Concentration 0.458966\n", " Species 0.229847\n", " Soak Duration 0.205221\n", " Lowest Temperature 0.053902\n", "Highest Temperature 0.052065\n" ] } ], "source": [ "# Print tabular format for reference\n", "print(\"\\nFeature Importance Scores:\")\n", "print(feature_importance.to_string(index=False))" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.13.1" } }, "nbformat": 4, "nbformat_minor": 5 }